Struts2体系介绍
您目前处于:技术核心竞争力  2013-06-27

1. Struts2体系介绍

Struts2的体系和Struts1体系差别很大,因为Struts2使用了WebWork的设计核心,而不是使用Struts1的设计核心。Struts2大量使用连接器来处理用户请求,从而允许用户的业务逻辑控制与Servlet API分离。

Struts2的框架

Struts2使用拦截器作为处理用户的业务逻辑,通过控制器代理负责处理用户请求,处理用户请求时回调业务控制器的execute方法。

Struts2框架处理流程:

1.浏览器发送请求

2.核心控制器FilterDispatcher根据请求决定调用合适的Action

3.Struts2的拦截器链自动对请求应用通用功能

4.回调Action的execute方法,该execute方法先获取用户请求参数,然后执行某种数据库操作

5.Action的execute方法处理结果信息将被输出到浏览器

核心控制器FilterDispatcher

该控制器作为一个Filter运行在Web应用中,负责拦截所有用户请求,当用户请求达到时,该Filter会过滤用户请求。如果用户请求以action结尾,则请求被转入Struts2框架处理。

Struts2应用的Action被定义在struts.xml文件中,该文件中定义Action时,定义该Action的name属性和class属性。

Struts2处理用户请求的Action实例,不是用户实现的业务控制器,而是Action代理,因为用户实现的业务控制器没有与Servlet API耦合。

Struts2提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中请求参数解析并传入Action,并回调Action的execute方法来处理用户请求。

业务控制器

业务控制器组件就是用户实现Action类的实例,Action类包含execute方法,该方法返回一个字符串—— 该字符串就是一个逻辑视图名,当业务控制器处理完用户请求后,根据处理结果不同,execute方法返回不同的字符串。

每个Action都要处理一个用户请求,而用户请求总是包含指定URL,当FilterDispatcher拦截到用户请求后,根据请求的URL和Action处理URL之间的对应关系来处理转发。

Struts2的视图组件

当Struts2的控制器返回逻辑视图名时,不仅需要指定Action的name属性和class属性,还要为Action指定系列<result../>元素,每个<result../>元素顶一个个逻辑视图和物理视图之间的映射。

Struts2的配置文件

Struts2配置文件有两份:

1.配置Action的struts.xml文件

2.配置Struts2的全局属性的struts.properties文件

struts.xml文件定义了Struts2的Action,定义Action,指定Action实现类和定义该Action处理结果与视图资源之间的映射关系。

<struts>
    <!-- struts2的Action都必须配置在package里 -->
    <package name="frame-default" extends="struts-default,json-default">
        <!-- 定义一个Logon的Action,实现类为lee.Logon -->
        <action name="Logon" class="lee.Logon">
            <!-- 配置Action的返回input时转入pages/Logon.jsp页面 -->
            <result name="input">/pages/Logon.jsp</result>
            <!-- 配置Action的返回cancel时重定向到名为Welcome的Action -->
            <result name="cancel" tyep="redirectAction">Welcome</result>
            <!-- 配置Action的返回 success时重定向到名为MainMenu的Action-->
            <result name="redirectAction">MainMenu</result>
            <!-- 配置Action的返回 expired时进入名为修改密码的Action-->
            <result name="expired" type="chain">ChangePassword</result>
        </action>
        <!-- 定义Logoff的Action,实现类为lee.Logoff -->
        <action name="Logoff" class="lee.logoff">
            <!-- 配置Action的返回 success时重定向到名为Welcome的Action-->
            <result type="redirectAction">Welcome</result>
        </action>
    </package>
</struts>

定义Action时,不仅定义了Action的实现类,而且在定义Action时处理结果使,指定了多个<result/>,<result/>元素指定execute方法返回值和视图资源之间的映射关系。

定义result元素时,指定两个属性:type和name,其中name制定了execute方法返回的字符串,而type指定转向的资源类型,转向的资源可以是JSP、FreeMarker,甚至是另一个Action等。

Struts2标签库

<!-- 使用JSP定义一个Action -->
<from method="post" action="basicvalid.action">
    <!-- 下面顶一个说那个表单域 -->
    名字<input type="text" name="name" /><br/>
    年龄<input type="text" name="age" /><br/>
    性别<input type="text" name="sex" /><br/>
    <!-- 定义一个按钮 -->
    <input type="submit" value="提交" />      
</from>
<!-- 使用Struts2标签定义的一个表单 -->
<s:form method="post" action="basicvalid.action">
    <!-- 下边使用Struts2标签定义三个表单域 -->
        <s:textfield label="名称" name="name" />
        <s:textfield label="年龄" name="age" />
        <s:textfield label="性别" name="sex" />
        <!-- 顶一个提交按钮 -->
        <s:submit/>
</s:form>

Struts2的控制器组件

Struts2的控制器组件是Struts2的核心,其实所有MVC框架的核心都是控制器组件。实际上,Struts2应用中起作用的业务控制器不是用户定义的Action,而是系统生成的Action代理,但Action代理是以用户定义的Action为目标。

public class LoginAction {
    private String username;
    private String password;
    public String execute() throws Exception {
        return "success";
    }
}

实际上,Struts2的Action就是一个包含execute方法的而普通Java类。

2. Struts2的配置

任何MVC框架都需要与Web应用整合,则不得不借助web.xml文件,只有配置在web.xml文件中servlet才会被加载。

对于Struts2框架,Web应用需要加载FilterDispatcher,只要Web应用负责加载FilterDispatcher,FilterDispatcher会加载应用的Struts2框架,因此将Struts2的核心控制器设计成Filter,而不是一个Servlet。

安装Struts2

Struts2必须需要依赖于XWork,lib依赖包:struts2-core-2.jar、xwork-2.jar和ognl-2.jar等必须类库。

web.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!-- 定义struts2.0 start  -->
    <!-- 定义Struts2的核心控制器FilterDispathcer的Filter -->
    <filter>
        <!-- 定义核心Filter的名字 -->
        <filter-name>struts2</filter-name>
        <!-- 定义核心Filter的实现类 -->
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <!-- FilterDispatcher用来初始化struts2并且处理所有的HTTP请求。 -->
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <!-- 定义struts2.0 end.  -->
</web-app>

Action用户请求

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'MyJsp.jsp' starting page</title>
  </head>
  <body>
    <from method="post" action="login.action">
        <!-- 下面顶一个说那个表单域 -->
        名字<input type="text" name="name" /><br/>
        年龄<input type="text" name="age" /><br/>
        性别<input type="text" name="sex" /><br/>
        <!-- 定义一个按钮 -->
        <input type="submit" value="提交" />      
    </from>
  </body>
</html>

这个页面没有任何动态内容,完全是一个静态的HTML页面,但注意该表单的action属性:login.action,当表单提交时,Struts2的FilterDispatcher将用户请求转发东对应的Struts2的Action。

Struts2的Action默认拦截器所有后缀为.action的请求。


转载请并标注: “本文转载自 linkedkeeper.com ”  ©著作权归作者所有