八、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.条件控制标签


    标签体


    标签体


    标签体

1.2.迭代选择器标签

标签主要用于对集合中的数据进行迭代,它可以根据条件遍历集合中的数据。


    
        
            
        
             
    
        
            
        
    

一、普通标签 - 数据标签

1.3.标签

标签用于输出指定的值,通常输出的是value属性指定的值。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>


property标签

 
    输出字符串:
    
忽略HTML代码:
不忽略HTML代码:
输出默认值:

1.4.标签

标签用于构造HTML页面中的超链接。


1.5.标签

标签用于在调试程序时输出更多的调试信息,主要输出ValueStack和StackContext中的信息。

1.6.标签

标签用于在当前页面中包含另一个页面(或Servlet)。

1.7.标签

标签通常要与其它标签合起来使用,主要用来为其它标签提供参数。

二、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文件中增加相应的配置。





2.1.表单标签

Struts2的表单标签用来向服务器提交用户输入信息,在org.apache.struts2.
components包中都有一个对应的类,所有表单标签对应的类都继承自UIBean类。

  • 常用的表单标签有:
    标签用来呈现HTML语言中的表单元素
    标签主要用于产生HTML中的提交按钮
    标签用来创建一个重置按钮
    创建的是单行文本框
    创建的是多行文本框
    标签用于创建一个密码输入框
    标签用于创建单选按钮
    标签用于创建复选框
    标签用于一次性创建多个复选框
    标签用于创建一个下拉列表框
    标签用来生成选项组
    标签用于创建隐藏表单元素
    标签用于创建一个文件选择框

2.2.文件上传

文件上传是指将本地文件上传到服务器的指定目录下。
步骤一:前端JSP页面中的上传表单代码。

fileUpload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>




上传页面


 
    
    
     
 


上传成功页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>




result


文件上传成功!
上传文件名: ${fileFileName}
上传文件类型:${fileContentType}

步骤二:对应的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:允许上传文件扩展名,各扩展名之间以逗号分隔。













 

 
    /result.jsp
    
    /fileUpload.jsp
    
      
      4194304 
      
                  
      
         .txt,.doc,.jpg
      
      
      
         text/plain,application/msword,image/jpeg
      
    
 


2.3.文件下载

文件下载是将文件从服务器上下载到本地机器上。
步骤一:下载页面download.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>



文件下载


    Struts2.txt

步骤二:对应的下载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中配置








 
    
    
      
        
        text/plain
        



        
          attachment;filename="Struts2.txt"
        
        
        downloadFile
      
    


2.4.非表单标签

Struts2的非表单标签主要用来在页面中生成非表单的可视化元素,输出在Action中封装的信息,如输出一些错误提示信息等,这些标签给程序开发带来了很多便捷。

  • 标签:如果action实例的getActionError()方法返回不为null,则该标签负责输出该方法返回的系列错误。
  • 标签:如果action实例的getActionMessage()方法返回不为null,则该标签负责输出该方法返回的系列消息。
  • 标签:如果Action实例存在表单域的类型转换错误、校验错误,则该标签负责输出这些错误提示。

作者: 肖sir@ZHBIT
2018 年 09月 27日


你可能感兴趣的:(八、Struts2标签库的应用)