通过第一节内容我们了解了struts1的简单处理过程.在处理的过程中我们使用到了struts1中的struts-config.xml配置文件,那么这一小节我们就针对其action配置的属性详细解析Action配置中属性含义及其使用。
1、首先我们来简单总结以下struts1的处理流程
首先:由视图层发出请求,当 ActionServlet 接收到 HTTP 请求后,在 doGet 或 doPost 方法中都会调用process()方法处理请求
其次:在ActionServlet 的 process() 方法中一旦选择了正确的子应用模块,就会调用RequestProcessor实例的process()方法来处理请求。在ActionServlet调用这个方法时,会把当前的request和response对象传给它
然后:RequestProcessor实例的process()方法调用ProcessActionCreate()方法,先判断是否在 Action 缓存中存在Action实例,如果不存在,就创建一个Action实例,把它保存在 Action 缓存中
最后:RequestProcessor实例的process()方法调用Action实例的execute()方法 并返回相应的试图界面
2、简单了解struts1的处理流程之后那么我们就来了解一下struts1配置文件中action的常用属性
首先列举action的属性代码如下:
<action path="URL"
type="ActionClass"
name="userForm"
scope="request"
attribute="key"
input="/register.jsp"
forward="/index.jsp"
include="/index.jsp"
unknown="true"
parameter="test"
className="mappingclass"
validate="true">
<forward name="" path=""></forward>
</action>
下面就对其属性解析
l
a
、
path :
代表请求的
Action
的名称
,
无需指明后缀
struts1
自动处理
例如上一节中的/Register 就是从视图中提交的Action请求 此请求有的方式是:
<form action="${pageContext.request.contextPath}/Register.do" method="post">....</form>
当其点击此提交时后缀名称为.do,(由于我们在会web.xml配置*.do的处理),所以经过mapping的地址映射,交给ActionServlet按照struts1的处理流程处理提交Action的请求。
l
b
、
type:
代表请求的的
Action
交给那个
Action
处理
,
注意此类的名称一定是类的全名称
(
包括包名
)
l
c
、
name
:代表的是请求参数封装的
ActionForm
的名称。
备注:此名称与<form-beans><form-bean name="
名称
Form" type="
Form
类的全名"></form-bean></form-beans>中"
名称
Form"一致,并通过此form-bean中的type来指定封装的ActionForm类。
l
d
、
scope
:代表把
formbean
的参数封装到那个作用域中
,
默认的作用域为
session
备注:当我们没有指定formbean的作用域时,在type指定的Action类中还可以通过以下代码获取:
/**
获取
ActionForm
中的对象
并强制造型为
UserForm
此获取方式为通过传递的
ActionForm
参数直接获取
,
开发中就是用此方式
*/
// UserForm userForm = (UserForm) form;
/**
*
由于在
Action
的属性配置中的
scope
属性指定了
userForm
的作用域
,
当采用的是默认值
(session)
时
,
*
也可以直接从作用域中获取代码如下:
*/
UserForm userForm = (UserForm) request.getSession().getAttribute(
"userForm"
);
System.
out
.println(
"
用户名称:
"
+ userForm.getUsername() +
"
用户密码:
"
+ userForm.getUserpass() +
"
用户邮箱:
"
+ userForm.getUseremail());
/**
备注:
由于在开发的过程中为了节省
ActionForm
占用的内存空间
,
我们一般不采用默认值
,
而是采用
scope=”request”
配置
,
因此我们也可以采用一下的方式获取
*/
UserForm userForm = (UserForm) request.getAttribute("userForm");
注意:由于在aciton的配置中我们没有配置
attribute="key"
此属性时
,
在
Action
中获取的关键字采用默认的值及
name
的名称
,
当配置了
attribute="key"
此属性是必须通过
"key"
获取
.
如果你不明白看下面的介绍。
l
E
、
attribute
指定
formbean
存储的
key,
不设默认为
name
属性的值。
举例:如果我们在
action
的配置中配置了
attribute=”uform”
的话
,
那么我们在
Action
中获取的方式就应该为:
/**
通过方法参数中传递的
ActionForm
获取
ActionForm
中的对象
并强制造型为
UserForm */
UserForm userForm = (UserForm) form;
/**
由于在
action
的配置中我们指明了
attribute
的属性及属性值
,
因此我们应该采用以下方式获取
*/
UserForm userForm = (UserForm) request.getAttribute(
"uform"
);
System.
out
.println(
"
用户名称:
"
+ userForm.getUsername() +
"
用户密码:
"
+ userForm.getUserpass() +
"
用户邮箱:
"
+ userForm.getUseremail());
备注:在指明了attribute属性后,我们如果还采用d中介绍方式即直接从作用域通过name的属性值获取的话,会出现javax.servlet.ServletException: java.lang.NullPointerException异常信息.
l F、
input="/register.jsp"
指定
formbean
的数据是由哪个页面提供的。
说明:提供此属性的目的在于
formbean
校验失败时,程序方便
跳回
formbean
的输入页面
,
通过
struts1
错误信息标签
,
显示校验失败信息。
l
G
、
forward="/index.jsp" 指定收到请求时,跳转到相应的jsp页面
强调:如果配置了此属性,则action将不再被调用,即接受到此action时,直接调至到index.jsp页面。
l
H
、
include="/index.jsp"
指
定收到请求时,进行页面包含
l
I
、
unknown="true"
如果
action
把该属性设置为
true
,则它可以处理客户机发出的所有无效的
.do
请求,默认值为
false
举例:如果在配置文件中添加如下的
action
配置
,
<action path="/**" forward="/index.jsp" unknown="true"/>
当如果在地址栏中发出请求为:
http://localhost:8080/20110105struts1_2/regi.do
如果在此配置文件中找不到
regi.do的Action就会处理上面配置的action直接跳转到index.jsp页面 (备注:与此action中path名称无关,但必须配置一个path属性).
l
J
、
parameter="test"
配置
action
参数
,
调用
actioMapping.getParameter
方法可以获得这里配置的参数
(
后续会详细介绍
)
l
K
、
className="mappingclass"
<action>
标签和所有的配置信息使用哪个对象封装,默认值为
ActionMapping
对象。这是
struts1
的作者考虑
,
开发者使用自己开发的
Mapping
类提供的配置
.
l
L
、
validate="true"
请求参数封装到
formbean
中后,是否让
struts
自动调用
formbean
的
validate
方法进行数据校验。默认
true(
后续会详细介绍
)
除此之外还用一些属性配置
,
我只做了常用属性的介绍
.
3、forward标签
在
action
配置中
,
还有一些其他的标签配置
,
在上面种我们看到了
<forward name="" path=""></forward>
即在处理完此
action
之后我们可以在
Action
中的
execute
方法中通过此标签的
name
属性获取此
action,
并跳转到相应的
path
地址中去
.
举例:如果在
action
内部我们配置了
forward
标签的代码如下:
<forward name="message" path="/message.jsp"></forward>
那么我们可以再
Action
返回值中做如下处理:
/**
获取跳转的地址并返回
ActionForward */
return
mapping.findForward(
"message"
);
通过以上配置
,
在处理完此
action
后
,struts1
经过处理后就会跳转到
/message.jsp
视图层
.