Selvet动态配置Action方法的三种方法

方法1:采用ActionName!methodName的方式来进行;

比如你有一个struts表单:

<s:form action="loginAction">
<s:textfield name="username" key="user"/>
<s:password name="password" key="pass"/>
<s:submit key="login" />
<s:submit key="register" οnclick="regist();"/>
</s:form>
里面有两个按钮,一个login,一个register,那么现在你需要考虑的是,register应该怎么选择相应的action呢?

我写了一个resgsit()的js函数,代码如下

function regist(){
	targetForm=document.forms[0];
	//这是一种动态调用的方式
	targetForm.action="loginAction!regist"
	//推荐使用这种
	//targetForm.action="registAction ";
}
这个时候,你会发现,这个地方动态的将这个表单的action改为了loginAction!regist。这是什么原理呢?原来struts支持这种动态调用机制,你首先需要在struts.xml中打开这个机制,只需要一行代码
<!-- 开启使用!动态配置action方法 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true" /> 
开启之后就可以使用相应的action了。其他的地方都不需要改, 只需要在对应的java代码中添加一个regist()方法即可,下面贴上完整的代码:

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC  
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    "http://struts.apache.org/dtds/struts-2.5.dtd">  
<struts>
	
	<!-- 指定默认编码集 -->  
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>  
     
    <!-- 制定全局国际化资源文件 -->  
	<constant name="struts.custom.i18n.resources" value="mess"/>
	<!-- 开启使用!动态配置action方法 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true" /> 
	<!-- !形式-->
	<package name="Login_Register_1" extends="struts-default">
		<!-- 要添加这个,不然会因为不允许使用这个方法而阻止继续进行 -->
		<global-allowed-methods>regist</global-allowed-methods>
		<action name="loginAction" class="cn.nju.fxd.login.LoginAction">
			<result name="input">/login.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
	</package>
</struts>

loginAction对应的LoginAction.java
public class LoginAction extends ActionSupport{
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String regist() throws Exception{
		
		return SUCCESS;
	}

	public String execute() throws Exception{
		//struts获得servelt api的方法之一,通过获得ActionContext的实例,来调用一些操作
		//常见的操作有:
		/*
		 * Object get(Object key):类似于调用HttpServeltRequest 的 getAttribute(String name)方法;
		 *void put(Object name,Object value):类似于调用
		 *Map getApplication():返回一个map对象,该对象模拟了该应用的ServletContext实例;
		 *static ActionContext getContext():静态方法,返回一个ActionContext实例,也就是从这里开始可以调用其他方法;
		 *Map getParameters():相当于HttpServletRequest的getParameterMap()方法;
		 *Map getSession():返回一个map对象,该map对象模拟了HttpSession实例;
		 *void setApplication(Map application):直接传入一个map实例,将该map实例里的key-value对直接转换成application的属性名,属性值;
		 *void setSession(Map session):直接传入一个map实例,将该map实例里的key-value对直接转换成session的属性名,属性值;
		 */
		ActionContext ctx = ActionContext.getContext();
		Integer counter = (Integer) ctx.getApplication().get("counter");
		if(counter==null){
			counter=1;
		}else{
			counter++;
		}
		ctx.getApplication().put("counter", counter);
		ctx.getSession().put("username", username);
		if(getUsername().equals("fanxuande")&&getPassword().equals("123456")){
			ctx.put("tip", "服务器提示,您已成功登录!");
			return SUCCESS;
		}else{
			return ERROR;
		}
	}
}


方法二:通过制定method属性来确定使用哪个方法。这个比较简单,不再赘述,只给一个简单的配置例子

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC  
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"  
    "http://struts.apache.org/dtds/struts-2.5.dtd">  
<struts>
	
	<!-- 指定默认编码集 -->  
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>  
     
    <!-- 制定全局国际化资源文件 -->  
	<constant name="struts.custom.i18n.resources" value="mess"/>
	<package name="Login_Register_1" extends="struts-default">
		<action name="login" class="cn.nju.fxd.login.LoginAction">
			<result name="input">/login.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
		<action name="register" class="cn.nju.fxd.login.LoginAction" method="regist>
			<result name="success">/regSucc.html</result>
		</action>
	</package>
</struts>


方法三:使用通配符,这个和方法1同样需要在对应的包中添加<global-allowed-method>元素,不然对应的方法无法使用;

具体的方式如下:

<!-- 通配符形式 -->
	<package name="Login_Register" extends="struts-default">
		<!-- 要添加这个,不然会因为不允许使用这个方法而阻止继续进行 -->
		<global-allowed-methods>regist</global-allowed-methods>
		<action name="*Action" class="cn.nju.fxd.login.LoginAction" method="{1}">
			<result name="input" >/login.jsp</result>
			<result name="error" type="plainText">
				<param name="location">/error.jsp</param>
				<param name="charSet">UTF-8</param>
			</result>
			<result name="success">/welcome.jsp</result>
		</action>
		<!-- 不指定class的action,默认使用AcctionSupport,result不指定name,默认为success -->
		<action name="*" >
			<result>error.jsp</result>
		</action>
		
	</package>

该方法,struts2会将符合*Action的action匹配,并调用相应的方法。其中method={1}表示第一个*的值。比如客户请求loginAction,那么就会请求*Action的对应的login()方法。

该方法还设置了一个*处理其他所有的不匹配请求,将会跳转到一个error.jsp页面。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值