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处理结果与视图资源之间的映射关系。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<
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标签库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<!-- 使用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为目标。
1
2
3
4
5
6
7
|
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配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?
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用户请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<%@ 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的请求。