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

来源:互联网 发布:能玩dota2的笔记本知乎 编辑:程序博客网 时间:2024/06/08 05:15

方法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" onclick="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
原创粉丝点击