Struts是基于MVC架构下的JAVA框架,其控制器主要由Action来提供实现,视图则由大量的HTML页面组成。而如果在一个简单的JSP页面中加入大量的代码,都会降低系统的整体的可维护性以及可读性。因此,Struts提供了一个功能丰富的标签库,用于扩展HTML的功能。
- Struts标签库的标签可被分为两大类:
- 普通标签:用于执行控制流程(包括:Control标签、Data标签)
- UI标签:用于丰富HTML的功能(包括:Form标签、Non-Form标签、Ajax标签)
Struts2的标签库被定义在struts-core-2.3.24.jar中的struts-tags.tld
文件。因此,要使用Struts标签库,需要使用taglib指令导入Struts2标签库到页面中。
<%@ taglib prefix="s" uri="/struts-tags" %>
一、普通标签 - 流程标签
1.1.条件控制标签
<s:if test = “boolean类型的条件表达式1”>
标签体
</s:if>
<s: elseif test = “boolean类型的条件表达式2”>
标签体
</s: elseif >
<s: else >
标签体
</s :else >
1.2.迭代选择器标签
<s:iterator>标签主要用于对集合中的数据进行迭代,它可以根据条件遍历集合中的数据。
<s:iterator var = "name" value="{'Java','Java Web','Oracle','MySql'}" status="st">
<s:if test="#st.odd">
<tr style="background-color: white;">
<td><s:property value = "name"/></td>
</tr>
</s:if>
<s:else>
<tr style="background-color: gray;">
<td><s:property value = "name"/></td>
</tr>
</s:else>
</s:iterator>
一、普通标签 - 数据标签
1.3.<s:property>标签
<s:property>标签用于输出指定的值,通常输出的是value属性指定的值。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>property标签</title>
</head>
<body>
输出字符串:
<s:property value="'www.zhbit.com'"/><br>
忽略HTML代码:
<s:property value="'<h3>www.zhbit.com</h3>'" escape="true"/><br>
不忽略HTML代码:
<s:property value="'<h3>www.zhbit.com</h3>'" escape="false"/><br>
输出默认值:
<s:property value="" default="true"/><br>
</body>
</html>
1.4.<s:a>标签
<s:a>标签用于构造HTML页面中的超链接。
<s:a href="http://www.zhbit.com"></s:a>
1.5.<s:debug>标签
<s:debug>标签用于在调试程序时输出更多的调试信息,主要输出ValueStack和StackContext中的信息。
1.6.<s:include>标签
<s:include>标签用于在当前页面中包含另一个页面(或Servlet)。
1.7.<s:param>标签
<s:param>标签通常要与其它标签合起来使用,主要用来为其它标签提供参数。
二、UI标签
Struts2 的UI标签都是基于模板和主题的。
模板是一个UI标签的外在表现形式,并且每个标签都会有自己对应的模板。
如果为所有的UI 标签提供样式和视觉效果相似的模板,那么这一系列的模板就形成了一个主题。
- Struts2 默认提供了4种主题,分别为simple、xhtml、css_xhtml和Ajax。
simple 主题:这是最简单的主题,使用该主题时,每个UI标签只生成最基本的HTML元素,没有任何附加功能。
xhtml 主题:这是Struts2 的默认主题,它对simple主题进行了扩展,提供了布局功能、Label显示名称、以及与验证框架和国际化框架的集成。
css_xhtml主题:该主题是对xhtml的扩展,在xhtml的基础之上添加对CSS的支持和控制。
Ajax主题 :继承自xhtml,提供Ajax支持。
那如何修改主题呢?
通过设置常量struts.ui.theme,来改变默认主题,具体做法是在struts.xml或者struts.properties文件中增加相应的配置。
<!-- 在struts.xml中增加如下配置: -->
<constant name="struts.ui.theme" value="simple"/>
<!-- 在struts.properties文件中增加如下配置:-->
<constant name="struts.ui.theme" value="simple"/>
2.1.表单标签
Struts2的表单标签用来向服务器提交用户输入信息,在org.apache.struts2.
components包中都有一个对应的类,所有表单标签对应的类都继承自UIBean类。
- 常用的表单标签有:
<s:form>标签用来呈现HTML语言中的表单元素
<s:submit>标签主要用于产生HTML中的提交按钮
<s:reset>标签用来创建一个重置按钮
<s:textfield>创建的是单行文本框
<s:textarea>创建的是多行文本框
<s:password>标签用于创建一个密码输入框
<s:radio>标签用于创建单选按钮
<s:checkbox>标签用于创建复选框
<s:checkboxlist>标签用于一次性创建多个复选框
<s:select>标签用于创建一个下拉列表框
<s:optgroup>标签用来生成选项组
<s:hidden>标签用于创建隐藏表单元素
<s:file>标签用于创建一个文件选择框
2.2.文件上传
文件上传是指将本地文件上传到服务器的指定目录下。
步骤一:前端JSP页面中的上传表单代码。
fileUpload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传页面</title>
</head>
<body>
<s:form action="/fileUpload.action" method="post" enctype="multipart/form-data">
<s:file name="file" label="上传文件"/>
<s:submit value="上传"/>
<s:reset value="重置"/>
</s:form>
</body>
</html>
上传成功页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>result</title>
</head>
<body>
文件上传成功!<br>
上传文件名: ${fileFileName}<br>
上传文件类型:${fileContentType}
</body>
</html>
步骤二:对应的Action中获取用户输入,并通过文件流实现保存。代码如下:
FileUploadAction.java
package cn.demo.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport{
private static final long serialVersionUID = 1L;
//提交过来的文件
private File file;
//提交过来的file的名字
private String fileFileName;
//提交过来的file的类型
private String fileContentType;
public File getFile()
{
return file;
}
public void setFile(File file)
{
this.file = file;
}
public String getFileFileName()
{
return fileFileName;
}
public void setFileFileName(String fileFileName)
{
this.fileFileName = fileFileName;
}
public String getFileContentType()
{
return fileContentType;
}
public void setFileContentType(String fileContentType)
{
this.fileContentType = fileContentType;
}
public String execute() throws Exception
{
//文件输入流
InputStream is = new FileInputStream(file);
//设置文件保存的目录
String uploadPath = ServletActionContext.getServletContext()
.getRealPath("/upload");
//设置目标文件
File toFile = new File(uploadPath, this.getFileFileName());
//文件输出流
OutputStream os = new FileOutputStream(toFile);
byte[] buffer = new byte[8192];
int length = 0;
//读取file文件输出到toFile文件中
while(-1 != (length = is.read(buffer, 0, buffer.length)))
{
os.write(buffer);
}
//关闭输入流和输出流
is.close();
os.close();
return SUCCESS;
}
}
- 除了自定义属性外,一般还包括三种类型的属性:
File类型的属性:该属性指定上传文件的内容,假设该属性指定为xxx。
String类型的属性:该属性名称必须为xxxFileName,其中xxx为File类型的属性名称,该属性指定上传文件名。
String类型的属性:该属性名称必须为xxxContentType,该属性指定上传文件的文件类型。
步骤三:要在struts.xml中对Action进行配置。
还可要在Action配置中加入文件过滤拦截器fileUpload。
- 在Struts2中,可以通过上传拦截器FileUpload来实现对文件的大小和类型进行限制。
在FileUpload中,有三个属性可以设置,具体如下:
maximumSize:上传文件的最大长度(以字节为单位), 默认值为2MB。
allowedTypes:允许上传文件的类型,各类型之间以逗号分隔。
allowedExtensions:允许上传文件扩展名,各扩展名之间以逗号分隔。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 设置文件上传允许最大值 为10M-->
<constant name="struts.multipart.maxSize" value="10485760"></constant>
<!-- 配置上传文件的出错信息的资源文件 -->
<constant name="struts.custom.i18n.resources" value="cn.itcast.action.FileUploadMessage"/>
<package name="struts2" namespace="/" extends="struts-default">
<!-- 简单文件上传 -->
<!-- <action name="fileUpload" class="cn.itcast.action.FileUploadAction"> -->
<!-- <result name="success">/result.jsp</result> -->
<!-- </action> -->
<!-- 文件上传(限制大小和类型) -->
<action name="fileUpload" class="cn.demo.action.FileUploadAction">
<result name="success">/result.jsp</result>
<!--定义上传出错要跳转的页面 -->
<result name="input">/fileUpload.jsp</result>
<interceptor-ref name="defaultStack">
<!--限制上传文件最大值为4M -->
<param name="fileUpload.maximumSize">4194304</param>
<!--当下面两个配置同时存在时,要同时满足下面两个条件,才能上传-->
<!--限制上传文件的扩展名 -->
<param name="fileUpload.allowedExtensions">
.txt,.doc,.jpg
</param>
<!--限制上传文件的类型 -->
<param name="fileUpload.allowedTypes">
text/plain,application/msword,image/jpeg
</param>
</interceptor-ref>
</action>
</package>
</struts>
2.3.文件下载
文件下载是将文件从服务器上下载到本地机器上。
步骤一:下载页面download.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文件下载</title>
</head>
<body>
<a href="simpledownload">Struts2.txt</a><br>
</body>
</html>
步骤二:对应的下载Action操作
package cn.demo.action;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class SimpleDownLoadAction extends ActionSupport{
//定义了返回InputStream的方法,该方法作为被下载文件的入口
public InputStream getDownloadFile(){
// return ServletActionContext.getServletContext()
// .getResourceAsStream("/upload/中文文件.txt");
return ServletActionContext.getServletContext()
.getResourceAsStream("/upload/Struts2.txt");
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
struts.xml中配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 设置文件上传允许最大值 为10M-->
<constant name="struts.multipart.maxSize" value="10485760"></constant>
<!-- 配置上传文件的出错信息的资源文件 -->
<constant name="struts.custom.i18n.resources" value="cn.itcast.action.FileUploadMessage"/>
<package name="struts2" namespace="/" extends="struts-default">
<!-- 文件下载action -->
<action name="simpledownload"
class="cn.demo.action.SimpleDownLoadAction">
<result type="stream">
<!--文件类型 -->
<param name="contentType">text/plain</param>
<!--指定文件名 -->
<!-- <param name="contentDisposition"> -->
<!-- attachment;filename="中文文件.txt" -->
<!-- </param> -->
<param name="contentDisposition">
attachment;filename="Struts2.txt"
</param>
<!--输入流 -->
<param name="inputName">downloadFile</param>
</result>
</action>
</package>
</struts>
2.4.非表单标签
Struts2的非表单标签主要用来在页面中生成非表单的可视化元素,输出在Action中封装的信息,如输出一些错误提示信息等,这些标签给程序开发带来了很多便捷。
- <s:actionerror>标签:如果action实例的getActionError()方法返回不为null,则该标签负责输出该方法返回的系列错误。
- <s:actionmessage>标签:如果action实例的getActionMessage()方法返回不为null,则该标签负责输出该方法返回的系列消息。
- <s:fielderror>标签:如果Action实例存在表单域的类型转换错误、校验错误,则该标签负责输出这些错误提示。
作者: 肖sir@ZHBIT
2018 年 09月 27日