JakartaEE Struts2使用

1. Struts2下载

解压后的目录结构如下:


图1.png

从一个高水平角度看,Struts2 是一个MVC拉动的(或MVC2)框架,Struts2 的模型-视图-控制器模式是通过以下五个核心部分进行实现的:

  • 操作(Actions)
  • 拦截器(Interceptors)
  • 值栈(Value Stack)/OGNL
  • 结果(Result)/结果类型
  • 视图技术
图2.png

请求生命周期
通过上述图片的描述,我们可以依照下面几点解释在Struts2 中用户的请求生命周期:

  • 用户发送一个资源需求的请求到服务器(例如:页面)。
  • 核心控制器查看请求后确定适当的动作。
  • 使用验证、文件上传等配置拦截器功能。
  • 执行选择的动作来完成请求的操作。
  • 如果需要的话,配置的拦截器可做任何后期处理。
  • 最后,由视图显示结果并返回给用户。

2. HelloWorld程序

1. 四个组件:
  • Action(操作)
    创建一个动作类,包含完整的业务逻辑并控制用户、模型以及视图间的交互。
  • Interceptors(拦截器)
    这是控制器的一部分,可依据需求创建拦截器,或使用现有的拦截器。
  • View(视图)
    创建一个JSP与用户进行交互,获取输入并呈现最终信息。
  • Configuration Files(配置文件)
    创建配置文件来连接动作、视图以及控制器,这些文件分别是struts.xml、web.xml以及struts.properties。
2. 创建项目
图3.png

记得勾选Generate web.xml deployment descriptor.


图4.png

目录结构:


图4.png
3. 导入jar包

将struts-2.3.34文件中的lib文件夹中的一下jar包引入项目的WebContent/WEB-INF/lib文件夹中

  • commons-fileupload-1.3.2.jar
  • commons-io-2.2.jar
  • commons-lang-2.4.jar
  • commons-lang3-3.2.jar
  • commons-logging-1.1.3.jar
  • freemarker-2.3.22.jar
  • javassist-3.11.0.GA
  • ognl-3.0.21.jar
  • struts2-core-2.3.34.jar
  • xwork-core.2.3.34.jar
图5.png
4. 创建HelloWorldAction类
public class HelloWorldAction {
    private String name;
    
    public String execute() throws Exception{
        return "success";
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }   
}
5. 创建HelloWorld.jsp页面

在/Webcontent/下创建jsp文件夹,将所有创建的jsp页面存储在这个文件夹,在/Webcontent/jsp/文件夹下创建HelloWorld.jsp页面

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


    
        
        
            
        
        
        
        Insert title here
    
    
        Hello World, 
    

6. 在/WebContent/jsp/页面创建index.jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>


    
        
        
            
        
        
        
        Insert title here
    
    
        

Hello World From Struts2


7. 在src目录下创建struts.xml文件



    
    
        
            /jsp/HelloWorld.jsp
        
    

8. 在src目录下创建logging.properties配置文件
org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].handlers = \ java.util.logging.ConsoleHandler
9. 在web.xml文件中进行配置


  HelloWorld
  
    index.html
    index.htm
    /jsp/index.jsp
    default.html
    default.htm
    default.jsp
  
  
    struts2
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  
  
  
    struts2
    /*
  

10. 运行项目
图6.png

在输入框中输入文字,点击Say Hello


图7.png
11. 设置索引

修改struts.xml文件为




    
    
        
            /jsp/index.jsp
        
        
            /jsp/HelloWorld.jsp
        
    

在浏览器输入http://localhost:8080/HelloWorld/index.action即可访问.

3. 配置文件

1). struts.xml文件



    
    
        
            /jsp/index.jsp
        
        
            /jsp/HelloWorld.jsp
        
        
    
    

  • 标签具有以下属性:
属性 描述
name(必需) 为package的唯一标识
extends 指定package继承另一package的所有配置。通常情况下,我们使用struts-default作为package的基础。
abstract 定义package为抽象的。如果标记为true,则package不能被最终用户使用。
namespace Actions的唯一命名空间
  • 标签以及name和value属性将用于覆盖default.properties中定义的任一属性,就像我们设置的struts.devMode属性一样。设置struts.devMode属性允许我们在日志文件中查看更多的调试消息。

  • Results(结果)确定在执行操作后返回到浏览器的内容,而从操作返回的字符串应该是结果的名称。 Results按上述方式配置,或作为“全局”结果配置,可用于包中的每个操作。 Results有nametype属性可选,默认的name值是“success”。

  • Struts.xml文件可以随着时间的推移而增长,因此通过包打破它是使它模块化的一种方式,但struts提供了另一种模块化struts.xml文件的方法,你可以将文件拆分为多个xml文件,并用以下方式导入它们。




     
     

2). struts.properties文件

配置文件提供了一种机制来改变框架的默认行为。

### When set to true, Struts will act much more friendly for developers
struts.devMode = true

### Enables reloading of internationalization files
struts.i18n.reload = true

### Enables reloading of XML configuration files
struts.configuration.xml.reload = true

### Sets the port that the server is run on
struts.url.http.port = 8080

4. 拦截器

1). 分类
序号 拦截器和说明
1 alias 允许参数在请求之间使用不同的别名。
2 checkbox 通过为未检查的复选框添加参数值false,以辅助管理复选框。
3 conversionError 将字符串转换为参数类型的错误信息放置到action的错误字段中。
4 createSession 自动创建HTTP会话(如果尚不存在)。
5 debugging 为开发人员提供一些不同的调试屏幕。
6 execAndWait 当action在后台执行时,将用户发送到中间的等待页面。
7 exception 映射从action到结果抛出的异常,允许通过重定向自动处理异常。
8 fileUpload 便于文件上传。
9 i18n 在用户会话期间跟踪选定的区域。
10 logger 通过输出正在执行的action的名称提供简单的日志记录。
11 params 设置action上的请求参数。
12 prepare 这通常用于执行预处理工作,例如设置数据库连接。
13 profile 允许记录action的简单分析信息。
14 scope 在会话或应用程序范围内存储和检索action的状态。
15 ServletConfig 提供可访问各种基于servlet信息的action。
16 timer 以action执行时间的形式提供简单的分析信息。
17 token 检查action的有效性,以防止重复提交表单。
18 validation 提供action的验证支持。
2). 使用Struts2中的拦截器

I. 给HelloWorldAction 添加timer拦截器(测量执行action方法所需的时间)及params拦截器(将请求参数发送给action)



    
    
    
    
        
            /jsp/index.jsp
        
        
            
            
            
            
            /jsp/HelloWorld.jsp
        
        
    
    

II. 测试


图8.png

在最后两行打印了当前action执行的时间。

3). 自定义拦截器

I. 创建拦截器类

public class MyInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("Pre-Processing--先执行");
        
        // 执行方法
        String result = invocation.invoke();
        
        System.out.println("Post-Processing--后执行");
        return result;
    }
}
图9.png

II. 创建Action类

public class HelloWorldAction extends ActionSupport{
    private String name;
    
    public String execute() throws Exception{
        System.out.println("execute...");
        return "success";
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }   
}

III. structs.xml文件中配置





    
    
    
    
        
            
        
        
            /jsp/index.jsp
        
        
            
            
            
            
            
            
            /jsp/HelloWorld.jsp
        
        
    
    

IV. 执行结果


图10.png

5. 文件上传

注意:服务器可能有适当的安全策略,禁止你写入临时目录以外的目录以及属于Web应用程序的目录。使用FileUpload过滤器

1). 创建jsp文件

I. 文件上传fileupload.jsp文件

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


    
        
        
            
        
        
        
        File Upload
    
    
        

II. 创建上传成功success.jsp文件

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


    
        
        
            
        
        
        
        File Upload Success
    
    
        You have successfully uploaded 
    

III. 创建上传失败error.jsp文件

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


    
        
        
            
        
        
        
        File Upload Error
    
    
        There has been an error in uploading the file.
    

2). 创建FileUploadAction
/**
 *  默认情况下,FileUpload拦截器为你提供三个参数,它们分别按以下方式命名:
 *  [文件名参数] - 这是用户已上传的实际文件。在这个例子中它将是“myFile”
 *  [文件名参数]ContentType - 这是上传的文件的内容类型。在这个例子中,它将是“myFileContentType”
 *  [文件名参数]FileName - 这是上传的文件的名称。在这个例子中,它将是“myFileFileName”
 * @author mazaiting
 */
public class FileUploadAction extends ActionSupport{
    
    private File myFile;
    private String myFileContentType;
    private String myFileFileName;
    private String destPath;
    
    @Override
    public String execute() throws Exception {
        destPath = "E:/file/";
        
        
        try {
            System.out.println("Src File name: " + myFile);
            System.out.println("Dst File name: " + myFileFileName);
            
            File destFile = new File(destPath, myFileFileName);
            FileUtils.copyFile(myFile, destFile);
        } catch (Exception e) {
            e.printStackTrace();
            return ERROR;
        }
                
        return SUCCESS;
    }

    public File getMyFile() {
        return myFile;
    }

    public void setMyFile(File myFile) {
        this.myFile = myFile;
    }

    public String getMyFileContentType() {
        return myFileContentType;
    }

    public void setMyFileContentType(String myFileContentType) {
        this.myFileContentType = myFileContentType;
    }

    public String getMyFileFileName() {
        return myFileFileName;
    }

    public void setMyFileFileName(String myFileFileName) {
        this.myFileFileName = myFileFileName;
    }

    public String getDestPath() {
        return destPath;
    }

    public void setDestPath(String destPath) {
        this.destPath = destPath;
    }
}
3). 配置文件
序号 属性和说明
1 struts.multipart.maxSize 可接受的上传文件的最大值(以字节为单位),默认值为250M。
2 struts.multipart.parser 用于上传多部分表单的库,默认为jakarta。
3 struts.multipart.saveDir 存储临时文件的位置,默认是javax.servlet.context.tempdir。




    
    
    
    
    
    
        
            
        
        
            /jsp/index.jsp
        
        
            
            
            
            
            
            
            /jsp/HelloWorld.jsp
        
        
        
            
            
                500000000
                image/jpeg,image/gif,text/plain,application/vnd.ms-powerpoint
                .txt,.ppt,.jpeg,.jpg,.gif
            
            
            /jsp/success.jsp
            /jsp/error.jsp
        
    
    

fileUpload拦截器有两个参数:maximumSize和allowedTypes。

  • maximumSize参数是设置所允许的文件大小的最大值(默认约为2MB)。
  • allowedTypes参数是所允许的内容(MIME)类型的用逗号分隔的列表
4). web.xml文件


  文件上传
  
    index.html
    index.htm
    /jsp/fileupload.jsp
    default.html
    default.htm
    default.jsp
  
  
    struts2
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  
  
  
    struts2
    /*
  

5). 执行测试
图11.png

点击upload后


图12.png

6. 全局异常映射

struts.xml文件配置





    
    
    
    
    
    
    
        
        
            
        
        
        
        
            
        
        
        
        
            /jsp/index.jsp
        
        
            
            
            
            
            
            
            /jsp/HelloWorld.jsp
        
        
        
            
            
                500000000
                image/jpeg,image/gif,text/plain,application/vnd.ms-powerpoint
                .txt,.ppt,.jpeg,.jpg,.gif
            
            
            /jsp/success.jsp
            /jsp/error.jsp
        
    
    

6. 注解

1). 添加jar包

在之前导入包的基础上新增antlr-2.7.2.jar、asm.3.3.jar、asm-commons-3.3.jar和struts2-convention-plugin-2.3.34.jar


图13.png
2). 创建视图

I. 创建主页

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


    
        
        
            
        
        
        
        Employee Form
    
    
        
            
            
            
        
    

II. 创建成功视图

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


    
        
        
            
        
        
        
        Success
    
    
        Employee Information is captured successfully.
    

III. 创建失败视图

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


    
        
        
            
        
        
        
        Error
    
    
        Employee Information is captured error.
    

3). 创建Action
@Results({
    @Result(name="success", location="/jsp/success.jsp"),
    @Result(name="error", location="/jsp/error.jsp"),
    @Result(name="input", location="/jsp/index.jsp")
})
public class EmployeeAction extends ActionSupport{
    private String name;
    private int age;
    
    @Action(value="/empinfo")
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }

    @RequiredFieldValidator(message="The name is required.")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @IntRangeFieldValidator(message="Age must be in between 28 and 65",
            min = "29", max = "65")
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
4). 配置文件web.xml


  StrutsAnnoTest
  
    index.html
    index.htm
    /jsp/index.jsp
    default.html
    default.htm
    default.jsp
  
  
    struts2
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    
        struts.devMode
        true
    
  
  
    struts2
    /*
  

5. 测试
图14.png
6. 项目结构图
图15.png

你可能感兴趣的:(JakartaEE Struts2使用)