美文网首页
八、Struts2标签库的应用

八、Struts2标签库的应用

作者: 肖sir_嘉立老师 | 来源:发表于2018-10-25 17:30 被阅读0次

  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日


相关文章

  • 八、Struts2标签库的应用

      Struts是基于MVC架构下的JAVA框架,其控制器主要由Action来提供实现,视图则由大量的HTML页面...

  • Strut2-表单标签

    1、导入Struts2标签库 2、引入一些Struts2的一些css和js代码 3.使用Struts2的标签库

  • 5. Struts2标签与主题

    1.Struts标签 Struts2中定义一组新的标签库,使用struts的标签库和JSTL类似。 Struts2...

  • struts2标签库----数据标签详解

    上篇文章我们介绍struts2标签库中的控制标签的基本使用和部分原理,本篇文章接着了解下标签库中有关数据标签的使用...

  • Struts2 标签库

    1.1Struts2标签使用原理解疑 首先,我们能够打开struts-tags.tld 这个文件进行观察,他是St...

  • Struts2标签库

    (要有struts jar包) http://blog.knowsky.com/237388.htm Struts...

  • [Struts2]6-标签

    Struts2有自己的标签库,这个标签库用来在服务器端进行验证.例如验证用户名密码是否为空. 在服务器端验证的标签...

  • struts2 的标签库

    一、常用标签 前提条件:在jsp页面中使用1、 :和ognl表达式在jsp中获取值栈数据2、 :获取list集...

  • struts2标签

    layout: posttitle: struts2标签subtitle: struts2标...

  • struts2标签库----控制标签详解

    前面几篇文章我们介绍了有关struts2的基本内容,简单理解了整个框架的运作流程。从本篇开始我们逐渐了解和使用st...

网友评论

      本文标题:八、Struts2标签库的应用

      本文链接:https://www.haomeiwen.com/subject/ngkctqtx.html