天天看点

1.[Struts2权威指南笔记]Struts2体系介绍 1.Struts2体系介绍 2.Struts2的配置

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

Struts2的框架

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

<a target="_blank" href="http://blog.51cto.com/attachment/201306/175229624.png"></a>

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指定系列&lt;result../&gt;元素,每个&lt;result../&gt;元素顶一个个逻辑视图和物理视图之间的映射。

Struts2的配置文件

Struts2配置文件有两份:

1.配置Action的struts.xml文件

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>&lt;</code><code>struts</code><code>&gt;</code>

<code>    </code><code>&lt;!-- struts2的Action都必须配置在package里 --&gt;</code>

<code>    </code><code>&lt;</code><code>package</code> <code>name</code><code>=</code><code>"frame-default"</code> <code>extends</code><code>=</code><code>"struts-default,json-default"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 定义一个Logon的Action,实现类为lee.Logon --&gt;</code>

<code>        </code><code>&lt;</code><code>action</code> <code>name</code><code>=</code><code>"Logon"</code> <code>class</code><code>=</code><code>"lee.Logon"</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 配置Action的返回input时转入pages/Logon.jsp页面 --&gt;</code>

<code>            </code><code>&lt;</code><code>result</code> <code>name</code><code>=</code><code>"input"</code><code>&gt;/pages/Logon.jsp&lt;/</code><code>result</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 配置Action的返回cancel时重定向到名为Welcome的Action --&gt;</code>

<code>            </code><code>&lt;</code><code>result</code> <code>name</code><code>=</code><code>"cancel"</code> <code>tyep</code><code>=</code><code>"redirectAction"</code><code>&gt;Welcome&lt;/</code><code>result</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 配置Action的返回 success时重定向到名为MainMenu的Action--&gt;</code>

<code>            </code><code>&lt;</code><code>result</code> <code>name</code><code>=</code><code>"redirectAction"</code><code>&gt;MainMenu&lt;/</code><code>result</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 配置Action的返回 expired时进入名为修改密码的Action--&gt;</code>

<code>            </code><code>&lt;</code><code>result</code> <code>name</code><code>=</code><code>"expired"</code> <code>type</code><code>=</code><code>"chain"</code><code>&gt;ChangePassword&lt;/</code><code>result</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>action</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 定义Logoff的Action,实现类为lee.Logoff --&gt;</code>

<code>        </code><code>&lt;</code><code>action</code> <code>name</code><code>=</code><code>"Logoff"</code> <code>class</code><code>=</code><code>"lee.logoff"</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 配置Action的返回 success时重定向到名为Welcome的Action--&gt;</code>

<code>            </code><code>&lt;</code><code>result</code> <code>type</code><code>=</code><code>"redirectAction"</code><code>&gt;Welcome&lt;/</code><code>result</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>package</code><code>&gt;</code>

<code>&lt;/</code><code>struts</code><code>&gt;</code>

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

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

<a target="_blank" href="http://blog.51cto.com/attachment/201306/175307162.png"></a>

Struts2标签库

<code>&lt;!-- 使用JSP定义一个Action --&gt;</code>

<code>&lt;</code><code>from</code> <code>method</code><code>=</code><code>"post"</code> <code>action</code><code>=</code><code>"basicvalid.action"</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 下面顶一个说那个表单域 --&gt;</code>

<code>    </code><code>名字&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"name"</code> <code>/&gt;&lt;</code><code>br</code><code>/&gt;</code>

<code>    </code><code>年龄&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"age"</code> <code>/&gt;&lt;</code><code>br</code><code>/&gt;</code>

<code>    </code><code>性别&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"sex"</code> <code>/&gt;&lt;</code><code>br</code><code>/&gt;</code>

<code>    </code><code>&lt;!-- 定义一个按钮 --&gt;</code>

<code>    </code><code>&lt;</code><code>input</code> <code>type</code><code>=</code><code>"submit"</code> <code>value</code><code>=</code><code>"提交"</code> <code>/&gt;     </code>

<code>&lt;/</code><code>from</code><code>&gt;</code>

<code>&lt;!-- 使用Struts2标签定义的一个表单 --&gt;</code>

<code>&lt;</code><code>s:form</code> <code>method</code><code>=</code><code>"post"</code> <code>action</code><code>=</code><code>"basicvalid.action"</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 下边使用Struts2标签定义三个表单域 --&gt;</code>

<code>        </code><code>&lt;</code><code>s:textfield</code> <code>label</code><code>=</code><code>"名称"</code> <code>name</code><code>=</code><code>"name"</code> <code>/&gt;</code>

<code>        </code><code>&lt;</code><code>s:textfield</code> <code>label</code><code>=</code><code>"年龄"</code> <code>name</code><code>=</code><code>"age"</code> <code>/&gt;</code>

<code>        </code><code>&lt;</code><code>s:textfield</code> <code>label</code><code>=</code><code>"性别"</code> <code>name</code><code>=</code><code>"sex"</code> <code>/&gt;</code>

<code>        </code><code>&lt;!-- 顶一个提交按钮 --&gt;</code>

<code>        </code><code>&lt;</code><code>s:submit</code><code>/&gt;</code>

<code>&lt;/</code><code>s:form</code><code>&gt;</code>

Struts2的控制器组件

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

<code>public</code> <code>class</code> <code>LoginAction {</code>

<code>    </code><code>private</code> <code>String username;</code>

<code>    </code><code>private</code> <code>String password;</code>

<code>    </code><code>public</code> <code>String execute() </code><code>throws</code> <code>Exception {</code>

<code>        </code><code>return</code> <code>"success"</code><code>;</code>

<code>    </code><code>}</code>

<code>}</code>

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

任何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配置文件

22

23

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?&gt;</code>

<code>&lt;</code><code>web-app</code> <code>id</code><code>=</code><code>"WebApp_ID"</code> <code>version</code><code>=</code><code>"2.5"</code>

<code>    </code><code>xmlns</code><code>=</code><code>"http://java.sun.com/xml/ns/javaee"</code> <code>xmlns:xsi</code><code>=</code><code>"http://www.w3.org/2001/XMLSchema-instance"</code>

<code>    </code><code>xsi:schemaLocation</code><code>=</code><code>"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 定义struts2.0 start  --&gt;</code>

<code>    </code><code>&lt;!-- 定义Struts2的核心控制器FilterDispathcer的Filter --&gt;</code>

<code>    </code><code>&lt;</code><code>filter</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 定义核心Filter的名字 --&gt;</code>

<code>        </code><code>&lt;</code><code>filter-name</code><code>&gt;struts2&lt;/</code><code>filter-name</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 定义核心Filter的实现类 --&gt;</code>

<code>    </code><code>&lt;</code><code>filter-class</code><code>&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/</code><code>filter-class</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>filter</code><code>&gt;</code>

<code>    </code><code>&lt;!-- FilterDispatcher用来初始化struts2并且处理所有的HTTP请求。 --&gt;</code>

<code>    </code><code>&lt;</code><code>filter-mapping</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>url-pattern</code><code>&gt;*.action&lt;/</code><code>url-pattern</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>filter-mapping</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>url-pattern</code><code>&gt;*.jsp&lt;/</code><code>url-pattern</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 定义struts2.0 end.  --&gt;</code>

<code>&lt;/</code><code>web-app</code><code>&gt;</code>

Action用户请求

<code>&lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;</code>

<code>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;</code>

<code>&lt;</code><code>html</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>head</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>title</code><code>&gt;My JSP 'MyJsp.jsp' starting page&lt;/</code><code>title</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>head</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>body</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>from</code> <code>method</code><code>=</code><code>"post"</code> <code>action</code><code>=</code><code>"login.action"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 下面顶一个说那个表单域 --&gt;</code>

<code>        </code><code>名字&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"name"</code> <code>/&gt;&lt;</code><code>br</code><code>/&gt;</code>

<code>        </code><code>年龄&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"age"</code> <code>/&gt;&lt;</code><code>br</code><code>/&gt;</code>

<code>        </code><code>性别&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>name</code><code>=</code><code>"sex"</code> <code>/&gt;&lt;</code><code>br</code><code>/&gt;</code>

<code>        </code><code>&lt;!-- 定义一个按钮 --&gt;</code>

<code>        </code><code>&lt;</code><code>input</code> <code>type</code><code>=</code><code>"submit"</code> <code>value</code><code>=</code><code>"提交"</code> <code>/&gt;     </code>

<code>    </code><code>&lt;/</code><code>from</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>body</code><code>&gt;</code>

<code>&lt;/</code><code>html</code><code>&gt;</code>

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

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

本文转自 LinkedKeeper 51CTO博客,原文链接:http://blog.51cto.com/sauron/1231068,如需转载请自行联系原作者