SSH入门Struts2篇(2)——Action的四种自定义方法

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.jspregFail.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为例)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值