八、Struts2标签库的应用

  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日


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容