struts2通配符的应用以及action、result、package的name和namespace属性同名时的处理方法

来源:互联网 发布:网上卖东西的软件 编辑:程序博客网 时间:2024/06/04 18:18

1.对于同一个<package>下两个name属性相同的<action>,struts2是这样处理的,后面的<action>将覆盖前面的<action>

2.对于同一个<action>下两个name属性相同的<result>,struts2是这样处理的,后面的<result>将覆盖前面的<result>

3.配置文件中两个同name属性的<package>(无论是否在同一xml文件中),struts2是这样处理的,启动tomcat时,会报错。

4.配置文件中两个不同name属性,但namespace属性相同的<package>,struts是这样处理的,将两个<package>下的<action>合并,遇到相同name属性的<action>时,后面<package>定义的<action>将覆盖前面<package>的<action>。


最近在项目中使用了通配符缩减繁杂的result配置,(例如:如果访问这个http://localhost:8080/project/admin/photo_edit.jhtml,Action中方法的返回值为photo_edit,寻找相应的jsp页面为photo_edit.jsp)默认的dispatcher转发都没有什么问题,但如果出现特殊的需要处理的result时,遇到了问题,比如下面我想在访问edit这个方法是redirectAction到photo_query这个action处理:

  • 1个通配符
    <action name="photo_*" class="photowallAction" method="{1}"><result name="photo_edit" type="redirectAction">photo_query</result><result name="photo_{1}">/WEB-INF/page/admin/photo_{1}.jsp</result></action>
    struts.xml文件配置如上。现在我访问的路径为:http://localhost:8080/project/admin/photo_edit.jhtml,如下action中方法代码:
    public String edit() {try {log.info("<---- PhotowallAction Method:init Begin ---->");if (photowallId == null) {photowallService.savePhotowall(type,photowall);}else{photowall.setPhotowallId(photowallId);photowallService.updatePhotowall(type,photowall);}} catch (Exception e) {log.error("<---- PhotowallAction Method:init Error ---->", e);}log.info("<---- PhotowallAction Method:init End ---->");return "edit";}
    如此以来,就会在该action的result下出现两个都能通配的情况,按照struts2的通配规则,后者,也就是dispatcher会覆盖前者的redirectAction,直接寻找photo_edit.jsp这个文件,当然这显然不是我想要的结果,所以只能改变一些特殊的返回值,此处我只能为该方法指定例外返回值:"改为edit",在配置文件中改为edit,当作特殊的处理。
  • 两个通配符*_*
    <action name="*_*" class="f{1}Action" method="{2}"><result name="success">/WEB-INF/page/front/${contents}/${jspFile}</result><result name="{1}_{2}">/WEB-INF/page/front/home/{1}_{2}.jsp</result></action>
    根据上面的分析,两个通配符的使用会大大的缩减package中Action的配置,所以使用了上面的配置,但是不要忘记了需要特殊处理的返回值,例如上面的返回值为success的,我就是使用的动态确认返回值。
通配符的使用的前提是action、method和jsp页面都要有统一的命名规范。

原创粉丝点击