Struts 2配置咨询:Action其他配置方式及多方法单标签配置可行性
首先回答你最关心的:能不能把多个方法配置在单个<action>标签里?
当然可以!而且有两种常用的方案,刚好适配你的场景:
方案1:通配符配置
你可以把action的name设置成带通配符的格式,用{1}来匹配通配符对应的方法名。把你原来的两个<action>标签合并成一个:
<action name="product_*" class="com.ProductAction" method="{1}"> <result name="success">welcome.jsp</result> <result name="error">error.jsp</result> </action>
这样请求product_show就会触发show方法,请求product_showErr就会调用showErr方法,返回对应的result跳转页面,完美解决重复配置问题。
方案2:动态方法调用(DMI)
如果项目允许,还可以用动态方法调用。默认情况下Struts 2是开启这个功能的(可通过struts.enable.DynamicMethodInvocation参数控制),这时候可以简化成单个<action>标签:
<action name="product" class="com.ProductAction"> <result name="success">welcome.jsp</result> <result name="error">error.jsp</result> </action>
然后通过URL直接指定方法,比如访问product!show就会调用show方法,访问product!showErr就会触发showErr方法。不过要注意,DMI可能存在安全风险,若项目对安全性要求高,需要权衡是否使用。
Struts 2中还有哪些配置Action的方式?
除了你用的XML配置,还有几种常用方式:
- 注解配置:不用写struts.xml,直接在Action类上贴注解即可。示例如下:
import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; @Results({ @Result(name = "success", location = "/welcome.jsp"), @Result(name = "error", location = "/error.jsp") }) public class ProductAction extends ActionSupport { @Action("product") public String show() { // 业务逻辑 return SUCCESS; } @Action("product_showErr") public String showErr() { // 错误处理逻辑 return ERROR; } }
记得要在struts.xml里开启注解扫描,指定Action所在包,比如添加<constant name="struts.convention.action.packages" value="com"/>。
Convention插件(约定大于配置):这个插件会自动识别Action类,比如类名以
Action结尾、放在actions包下的类,会自动映射成对应的URL。比如com.actions.ProductAction默认映射到/product请求,默认调用execute方法,其他方法可以通过product!methodName访问,省去大量配置工作。属性文件配置:这个用得较少,主要通过
struts.properties配置全局参数,具体Action映射还是XML或注解更便捷。
关于Struts 1迁移到Struts 2的要点
我整理了几个关键迁移注意点供你参考:
Action类改造:Struts 1的Action继承
Action类,重写execute方法;Struts 2的Action通常继承ActionSupport,支持多方法,参数传递可用属性驱动或模型驱动(替代Struts 1的ActionForm)。需要把原有逻辑迁移过来,调整参数绑定方式。配置文件转换:把
struts-config.xml里的Action映射、result跳转、拦截器等配置,转换成Struts 2的struts.xml格式。Struts 2的拦截器栈替代了Struts 1的部分过滤器和Servlet逻辑,需要重新调整拦截器配置。表单与参数处理:Struts 1的
ActionForm可换成Struts 2的模型驱动(实现ModelDriven接口),或者直接在Action类里定义表单属性,Struts 2会自动完成参数绑定,无需单独编写Form类。URL与标签调整:前端页面的请求URL要改成Struts 2格式(比如
action!method),同时把Struts 1的标签(如<html:form>)替换成Struts 2的标签(如<s:form>),注意标签属性的差异。测试验证:迁移后一定要逐个功能测试,比如参数传递、页面跳转、拦截器逻辑等,确保和原Struts 1功能一致,避免遗漏或错误。
内容的提问来源于stack exchange,提问作者AbhiN

