概述
http://book.51cto.com/art/200909/150998.htm
24.2.4 Action映射配置元素<action>
Action mappings是框架中的基本工作单元,框架通过对请求路径进行映射来决定由哪个Action来处理请求。Action mappings能指定一系列的Result、异常处理器及拦截器,<action>元素的所有属性中只有name属性是必需的,其他属性都是可选的。尽管对于<action>的命名很灵活,但是<action>的名字中最好不要出现斜线(/)、点号(.)、破折号(-),以免出现一些不可预知的错误。
按照作用的不同,可以配置5种类型的请求映射。
1)配置直接转发的请求
只有一个name属性来表示要匹配的映射地址,并在子元素<result>中配置要转发的页面。例如下面的映射可以匹配"http://localhost:8081/demo/index.do"的请求,用来转发到login.jsp页面:
- <action name="index">
- <result>login.jsp</result>
- </action>
2)最古老的方法-指定处理的Action类
除了要使用name属性来匹配映射地址外,还可以使用class属性来指定要使用的Action类名。如果使用Struts 2与Spring的集成,class的属性可以是Spring配置文件中<bean>组件的名字,在后面的开发中使用的就是这种形式。下面是一个使用Action类的配置实例,其class指向处理的Action类名:
- <action name="login" class="com.demo.struts2.actions.LoginAction">
- <result name="success">welcome.jsp</result>
- <result name="input">login.jsp</result>
- </action>
在上面的配置中添加了多个<result>,这表示Action类可能会有多个返回结果,在不同的条件下Action的处理函数将返回到不同的<result>的name属性,这样就会找到不同的JSP页面。你可以随意定义这里的name属性值,只要在Action中返回对应的字符串即可。例如,在上面的定义中,我们可以这么返回结果页面:
- public String execute() throws Exception {
- if(…) {
- return "success";
- } else {
- return "input";
- }
- }
不过要注意的是,Action的execute()方法中所返回的字符串必须在<result>列表中有定义,否则会出现找不到Result的错误。
3)最古老的方法-指定Action的处理方法
在上面的Action类中,会默认调用execute()函数来进行处理。假如我们有多个请求都要通过同一个Action类来处理,但是却只有一个execute()处理函数,显然不能够满足要求。而此时可以在<action>中添加method属性,指定要调用的函数名,如果不指定method属性,则默认使用execute()来执行。
例如下面的两个映射都指向了LoginAction类,而method值不同:
- <action name="login" class="com.demo.struts2.actions.
- LoginAction" method="login">
- <result name="success">welcome.jsp</result>
- <result name="input">login.jsp</result>
- </action>
- <action name="logout" class="com.demo.struts2.actions.
- LoginAction" method="logout">
- <result name="success">login.jsp</result>
- <result name="input">error.jsp</result>
- </action>
这样就需要编写如下两个函数来负责处理这两个请求:
- public String login() throws Exception {
- return "success";
- }
- public String logout() throws Exception {
- return "success";
- }
当然,如果类中不包含某一个方法,就不能够配置在method属性值中。
4)WebWork中的方法-通过请求地址来指定执行的函数
上面使用method进行配置有一个问题,就是需要为每一个请求与处理方法对之间配置一个<action>元素,如果我们要使用一个Action类处理多个请求,就需要为该Action类配置多个<action>元素来指向不同的函数,这显然会让我们眼花缭乱。要解决这个问题,我们可以不使用method属性,只需要将函数的选择放在请求地址中即可。
例如下面我们仅仅配置一个<action>执行一个Action类:
- <action name="login" class="com.demo.struts2.actions.LoginAction">
- <result name="success">welcome.jsp</result>
- <result name="input">login.jsp</result>
- </action>
然后可以分别使用下面的两个请求地址来实现对两个函数的调用。
执行登录的地址:http://localhost:8081/demo/login!login.do。
执行退出的地址:http://localhost:8081/demo/login!logout.do。
这里使用了一个感叹号"!",感叹号"!"之前的名字"login"是<action>中name属性的值,之后的名字login()、logout()分别是Action中的函数名。这样就解决了函数的选择问题,这与Struts 1.x中的DispatchAction实现的作用相同,但Action类并不需要继承任何类,这就是Struts 2带给我们的好处。
5)Struts 2中的方法-配置通配符映射
虽然我们可以使用POJO的Action类,但Struts 2在基于Action的校验机制中需要我们的Action类继承基类ActionSupport,并重写校验函数validate()。如果在该函数中检查到错误字段,Struts 2的框架将会自动将请求返回到Action.INPUT的页面。
在上面的<action>配置中,执行登录和退出的请求都将调用LoginAction类,也都将调用validate()函数进行表单校验,但是两者在校验出错时返回的页面不同:我们希望登录失败后返回到login.jsp,退出失败后返回到error.jsp。但是ActionSupport在执行完validate()后只会返回Action.INPUT,这样就不能够实现校验失败返回不同的页面了。
幸运的是,Struts 2的<action>允许我们使用通配符的配置来解决该问题,首先需要将struts.properties中的属性struts.enable.DynamicMethodInvocation设置为true(默认即为true),然后在name属性中添加一个星号"*",并在INPUT页面中引用这个变量值,如下所示:
- <action name="login*" class="com.demo.struts2.actions.
- LoginAction">
- <result name="success">welcome.jsp</result>
- <result name="input">{1}.jsp</result>
- </action>
这样,我们在请求的地址中可以附带校验出错后返回页面的名字,此时就可以使用下面的地址了。
执行登录的地址:http://localhost:8081/demo/loginlogin!login.do。
执行退出的地址:http://localhost:8081/demo/loginerror!logout.do。
粗体的部分表示星号"*"匹配的名称,该名称将会传递到{1}中。这样,登录时的INPUT页面就是login.jsp,退出时的INPUT页面就是error.jsp了。上面的{1}使用的是第一个星号"*"匹配的字符,你可以在name属性中添加多个星号"*",这样可以分别使用{1}、{2}等来取得多个匹配的字符串了。
后面开发的办公自动化系统就是使用的第4和5种相结合的方法。
最后
以上就是激情短靴为你收集整理的Action映射配置元素的全部内容,希望文章能够帮你解决Action映射配置元素所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复