文章目录
1.Action类的生命周期
框架先实例化 Action 对象,再调用 Action 的 set*** 函数,封装表单数据,然后调用 execute 函数,进行处理。
在第二次提交时,Action 会重新实例化,每一个 Action 对象都服务一个请求,这和 Servlet 的原理是不一样的——servlet是只在服务器启动时加载一次,所有用户共享。
2.Action的自定义方法
其实一个action中是可以提供多个方法用来处理不同的请求,也即不一定要是execute()
当Action中使用了自定义方法,则该Action就需要特定的配置,一般有四种调用方式:
① 在struts.xml文件中通过method属性指定方法名
② 使用动态方法调用方式(DMI)
③ 使用提交按钮的method属性
④ 使用通配符配置Action
注:我们在这里讨论的都是在同一Action下有两种或以上方法分别处理不同请求的情况
假设我们这里有这样一个Action:
package cn.edu.zjut.action;
import cn.edu.zjut.bean.*;
import cn.edu.zjut.service.*;
public class UserAction {
private UserBean loginUser;
private UserBean regUser;
public UserBean getLoginUser() {
return loginUser;
}
public void setLoginUser(UserBean loginUser) {
this.loginUser = loginUser;
}
public UserBean getRegUser() {
return regUser;
}
public void setRegUser(UserBean regUser) {
this.regUser = regUser;
}
public String login() {
UserService userServ = new UserService();
if(userServ.login(loginUser)) {
return "loginsuccess";
}
return "loginfail";
}
public String reg() {
UserService userServ = new UserService();
if(userServ.register(regUser)) {
return "regsuccess";
}
return "regfail";
}
}
2.1 在struts.xml文件中通过method属性指定方法名
form action="login"
以及在另一个表单 form action="register"
在Action下有几种方法在xml文件里就需要写几个<action ...>
,class都是指定同一action,但是通过method后面的内容来指定使用该action下的什么方法。
<action name="login" class="...UserAction" method="login"> …… </action>
<action name="register" class="...UserAction" method="reg"> …… </action>
访问方式:以actionName.action形式访问,如 http://localhost:8080/struts2/login.action
缺点就是要写太多个<action ...>
了啦…(其实我觉得还好)
2.2 使用动态方法调用方式(DMI)
先要在struts.xml文件中:(否则会404
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
struts.xml:
<action name="UserAction" class="...UserAction">....</action>
访问方式:
//url方式
http://localhost:8080/struts2/UserAction!login.action
http://localhost:8080/struts2/UserAction!reg.action
//表单
<s:form action="UserAction!login" method="post">
<s:form action="UserAction!reg" method="post">
注:在这种方法时一定要注意UserAction下的login和reg方法不能有相同的result返回值,因为它们的result标签都是写在一个<action></action>
里的
<action name="UserAction" class="...UserAction">
<result name="success">/loginSuccess.jsp</result>
<result name="fail">/loginFail.jsp</result>
<result name="registersuccess">
/regSuccess.jsp</result>
<result name="registerfail">/regFail.jsp</result>
</action>
2.3使用提交按钮的method属性——注意这种方法只能用于表单中
struts.xml和上文中没有差别,也需要
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<action name="UserAction" class="...UserAction">
</action>
表单:
<s:form action="UserAction" method="post">
……
<s:submit value="登录" method="login"/>
<s:submit value="注册" method="reg"/>
注意这里的result和动态调用一样,两个方法都需要互不相同
2.4使用通配符配置Action——这也是相对更为普遍的方式
struts.xml文件中这么写:
<action name="*Action" class="cn.edu.zjut.action.UserAction" method="{1}">
<result name="{1}success">/{1}Success.jsp</result>
<result name="{1}fail">/{1}Fail.jsp</result>
</action>
在这里*就代表了占位符,而method="{1}"
中的1、2、3则代表了占位符的位置(当然这里只有一个占位符,所以只有1)
例如表单中写:form action="regAction"
,则在Action类中对应的方法就应该要叫做"reg",而方法的返回值则为regsuccess和regfail
,相对跳转到的页面则为regSuccess.jsp
和regFail.jsp
.
3.Action处理后的结果result的类型-type属性
使用result的type属性来设定结果类型
1.dispatcher: 默认值,服务器内部跳转(跳转到web组件),相当于javaWeb中的forward
2.redirect: 作客户端重定向(重定向到web组件);
3.chain: 作服务器内部跳转(跳转到其他Action);
4.redirectAction: 作客户端重定向(重定向到其他Action)
5.plainText:跳转到界面的源代码
例如在以下代码中默认的是dispatcher,因此在xxSuccess.jsp页面中是可以获得对应Action中的属性值的
<action name="*Action" class="cn.edu.zjut.action.UserAction" method="{1}">
<result name="{1}success">/{1}Success.jsp</result>
<result name="{1}fail">/{1}Fail.jsp</result>
</action>
例如Action中有一个属性叫做count
那么在跳转到的页面就可以使用<s:property value="count">
来把属性值显示出来。(此时导航栏显示的是xxx/loginAction)
但是在使用了redirect之后这个属性值就抓不到了.(此时导航栏显示的是loginSuccess.jsp(以*代表login为例)