|
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 ” ©著作权归作者所有 |
