Struts2典型应用

1. Struts2处理表单数据

例1.1 创建Java Web项目,编写一个Action对象,处理对表单提交的数据,模拟实现对指定用户的问候。

(1)创建Java Web项目,将Struts的支持类型库添加到WEB-INF目录下的lib文件夹中。之后在web.xml文件中注册Struts2提供的过滤器。过滤器代码如下:

<?xml version="1.0" encoding="GBK"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>java_struts2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- Struts2过滤器 -->
  <filter>
      <!-- 过滤器名称 -->
      <filter-name>struts2</filter-name>
      <!-- 过滤器类 -->
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <!-- Struts2过滤器映射 -->
  <filter-mapping>
      <!-- 过滤器名称 -->
      <filter-name>struts2</filter-name>
      <!-- 过滤器映射 -->
      <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

(2)创建一个Action对象,其名称为GreetingAction。实例中通过继承于ActionSupport类进行创建,其关键代码如下:

package com.cn.action;

import com.opensymphony.xwork2.ActionSupport;

public class GreetingAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    //用户名
    private String username;
    //处理请求
    @Override
    public String execute() throws Exception {
        // 判断用户名是否有效
        if(username==null||"".equals(username)){
            //返回到错误页面
            return ERROR;
        }else {
            return SUCCESS;
        }
    }
    //username属性的getter方法
    public String getUsername() {
        return username;
    }
    //username属性的setter方法
    public void setUsername(String username) {
        this.username = username;
    }
}

(3)在Web项目的源码文件夹中,创建名称为struts.xml的配置文件,在该文件中配置GreetingAction。关键代码如下:

<?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>
    <!-- 声明包 -->
    <package name="myPackage" extends="struts-default" namespace="/">        
        <!-- 定义action -->
        <action name="greeting" class="com.cn.action.GreetingAction">
            <!-- 定义成功的映射页面 -->
            <result name="success">success.jsp</result>
            <!-- 定义失败的映射页面 -->
            <result name="error">error.jsp</result>
        </action>
    </package>
</struts>

(4)创建程序中的首页面index.jsp,在该页面中编写一个表单,它的提交地址为greeting.action。关键代码如下:

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!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=GB18030">
<title>Insert title here</title>
</head>
<body>
    <form action="greeting.action" method="post">
        请输入你的姓名:<input type="text" name="username">
        <input type="submit" value="提交">
    </form>
</body>
</html>

(5)创建success.jsp页面。关键代码如下:

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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=GB18030">
<title>Insert title here</title>
</head>
<body>
    <font color="red">
        <s:property value="username"/>
    </font>
    ,您好!
    <br>
    欢迎来到本站。
</body>
</html>

success.jsp页面中的<s:property>标签是Struts2提供的标签库,主要用于输出Action对象中的信息。

(6)创建名称为error.jsp页面。关键代码如下:

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!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=GB18030">
<title>Insert title here</title>
</head>
<body>
    <font color="red">错误:您没有输入用户名!</font>
</body>
</html>

运行上面的程序,如果出现No result defined for action com.cn.action.GreetingAction and result success错误,在struts.xml的配置文件的package里面增加 namespace="/" 告诉系统是从根本录寻找即可。

2. 使用Map类型的request、session和application

例2.1 通过ActionContext对象获取Map类型的requet、session、和application,分别为这3个对象设置一个info属性并赋值,然后在JSP页面获取3种作用域下的info属性信息。

1)创建Java Web项目,将Struts的支持类型库添加到WEB-INF目录下的lib文件夹中。之后在web.xml文件中注册Struts2提供的过滤器。过滤器代码如下:

<?xml version="1.0" encoding="GBK"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>java_struts2</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- Struts2过滤器 -->
  <filter>
      <!-- 过滤器名称 -->
      <filter-name>struts2</filter-name>
      <!-- 过滤器类 -->
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <!-- Struts2过滤器映射 -->
  <filter-mapping>
      <!-- 过滤器名称 -->
      <filter-name>struts2</filter-name>
      <!-- 过滤器映射 -->
      <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

(2)创建名称为TestAction的类,该类继承于ActionSupport类,是一个Action对象。在这个类中分别创建Map类型的request、session和application,并在execut()方法中对其进行操作。关键代码如下:

package com.cn.action;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    //Map类型的request
    private Map<String, Object> request;
    //Map类型的session
    private Map<String, Object> session;
    //Map类型的application
    private Map<String, Object> application;
    //构造方法
    @SuppressWarnings("unchecked")
    public TestAction() {
        // 获取ActionContext对象
        ActionContext context = ActionContext.getContext();
        //获取Map类型的request
        request = (Map<String, Object>) context.get("request");
        //获取Map类型的session
        session = context.getSession();
        //获取Map类型的application
        application = context.getApplication();        
    }
    /**
     * 请求处理方法
     * @return String
     */
    public String execute() throws Exception {
        // 字符串信息
        String info="明日科技";
        //向request添加信息
        request.put("info", info);
        //向session添加信息
        session.put("info", info);
        //向application添加信息
        application.put("info", info);
        //成功返回
        return SUCCESS;
    }    
}

(3)在Web项目的源码文件夹中,创建名称为struts.xml的配置文件,在该配置文件中配置TestAction。关键代码如下:

<?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>
    <constant name="struts.devMode" value="true"></constant>
    <!-- 声明包 -->
    <package name="myPackage" extends="struts-default" namespace="/">
        <!-- 定义action -->
        <action name="testAction" class="com.cn.action.TestAction">
            <!-- 定义成功的映射页面 -->
            <result name="success">success.jsp</result>
        </action>
    </package>
</struts>

(4)创建TestAction处理成功的返回页面success.jsp,在该页面中分别获取JSP内置对象request、session、application的info属性的值,并将这些值输出到JSP页面中。具体代码如下:

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!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=GB18030">
<title>Insert title here</title>
</head>
<body>
    request范围内的info值:
    <font color="red"><%=request.getAttribute("info") %></font>
    <br>
    session范围内的info值:
    <font color="red"><%=session.getAttribute("info") %></font>
    <br>
    application范围内的info值:
    <font color="red"><%=application.getAttribute("info") %></font>
</body>
</html>

(5)创建程序的首页index.jsp,在该页面中编辑一个超链接,将这个超链接指向testAction。关键代码如下:

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!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=GB18030">
<title>Insert title here</title>
</head>
<body>
    <a href="testAction.action">Map类型的request、session、application</a>
    <br>
</body>
</html>

 3. 使用拦截器

在Struts2框架中,如果创建了一个拦截器对象,需要对拦截器进行配置才可以应用到Action对象上。其中拦截器的创建比较简单,可以通过继承AbstractInterceptor对象进行创建,而它使用<interceptor-ref>标签进行配置。

例3.1 为Action对象配置输出执行时间的拦截器,查看执行Action所需要的时间。

(1)创建Java Web项目,将Struts的支持类型库添加到WEB-INF目录下的lib文件夹中。之后在web.xml文件中注册Struts2提供的过滤器。

(2)创建名称为TestAction的类,该类继承于ActionSupport对象。关键代码如下:

package com.cn.action;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    public String execute() throws Exception{
        //线程休眠1秒
        Thread.sleep(1000);  //方便查看执行时间
        return SUCCESS;
    }
}

(3)在struts.xml配置文件中配置TestAction对象,并将输出Action执行时间的拦截器timer应用到TestAction中。关键代码如下:

<?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>
    <!-- 声明常量(开发模式) -->
    <constant name="struts.devMode" value="true"></constant>
    <!-- 声明常量(在Struts的配置文件修改后,自动加载) -->
    <constant name="struts.configuration.xml.reload" value="true"></constant>
    <!-- 声明包 -->
    <package name="myPackage" extends="struts-default" namespace="/">    
        <!-- 定义action -->
        <action name="testAction" class="com.cn.action.TestAction">
            <!-- 配置拦截器 -->
            <interceptor-ref name="timer"/> 
            <!-- 定义成功的映射页面 -->
            <result name="success">success.jsp</result>
        </action>
    </package>
</struts>

在TestAction对象的配置中,为其配置了一个拦截器对象timer,其作用是输出TestAction执行的时间。

(4)创建程序的首页页面index.jsp和TestAction返回的页面success.jsp,具体代码如下:

<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!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=GB18030">
<title>Insert title here</title>
</head>
<body>
    <a href="testAction.action">执行输出时间拦截器</a>
    <br>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<!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=GB18030">
<title>Insert title here</title>
</head>
<body>
    <a href="index.jsp">返回</a>
    <br>
</body>
</html>

在代码写完后,执行该程序,在控制台会输出TestAction执行所占用的时间。

原文地址:https://www.cnblogs.com/gaopeng527/p/4466535.html