goldrain

金色雨点

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  37 随笔 :: 2 文章 :: 239 评论 :: 0 Trackbacks
自从ror热潮席卷web开发界以来,惯例优于配置的快速开发理念便深入人心。

struts2中对action name支持通配符配置,所以使其方便的实现零配置成为可能。

实现零配置后的开发会是怎样,开发员不用配置struts.xml,也不用在action代码中写annotation,是真正干净的零配置。以下的代码是我们希望达到的效果。
action示例
package net.jacker.ww.sys;

public class UserAction extends BaseAction {


  
    
public String execute() throws Exception {
         
         
return "default"
         //
 default表示使用缺省页面,路径名和action所在包和类名相关,为 /sys/User.jsp
    }

    
public String roles(){
        
        
return view("/sys/UserRoles"); // 指定展示页面为 /sys/UserRoles.jsp 
    }


    
public String xxxx(){
       
       
return redirect("/sys/User.do"); // 重定向,url为 /sys/User.do
    
    }




}


以上action的三个方法无需配置,将可以分别用以下链接进行访问:
http://localhost:8080/sys/User.do
http://localhost:8080/sys/User!roles.do
http://localhost:8080/sys/User!xxxx.do(将重定向到User.do)


下面我们来看看以上零配置是如何做到的。
首先,我们需要在struts.xml中做如下的配置。
<struts>
    
<constant name="struts.enable.SlashesInActionNames" value="true" /> <!-- action名可以有'/'字符 -->
    
<constant name="struts.action.extension" value="do"/> <!-- .do为访问扩展名 -->

  
<package name="default" extends="struts-default">
  
  
<!-- 通配符配置,匹配所有的URL对action的访问 -->
    
<action name="*/*!*" class="net.jacker.ww.{1}.{2}Action" method="{3}"> 
      
<result name="default" type="dispatcher">/{1}/{2}.jsp</result>
      
<result name="view" type="dispatcher">${viewpath}.jsp</result>
      
<result name="redirect" type="redirect">${viewpath}</result>
    
</action>
    
<action name="*/*" class="net.jacker.ww.{1}.{2}Action">
      
<result name="default" type="dispatcher">/{1}/{2}.jsp</result>
      
<result name="view" type="dispatcher">${viewpath}.jsp</result>
      
<result name="redirect" type="redirect">${viewpath}</result>
    
</action>
  
</package>

</struts>


然后是写一个Action基类,BaseAction.java
package net.jacker.ww;

import com.opensymphony.xwork2.Action;


public abstract class BaseAction implements Action{

    

    String viewpath; 
//该属性会在struts.xml中用到

    
public String view(String vpath){
        viewpath 
= vpath;
        
return "view";
    }

    
public String redirect(String vpath){
        viewpath 
= vpath;
        
return "redirect";
    }


    
public String getViewpath() {
        
return viewpath;
    }

    

}


做好以上的基础工作,你的action类只要继承BaseAction,符合XxxAction的命名规则,放到对应的包下,页面也放到对应的路径,就可以无需配置而访问了。

如果要替换view层也很简单,只要对struts.xml做简单修改,比如:

<result name="default" type="dispatcher">/{1}/{2}.jsp</result>

改为

 <result name="default" type="velocity">/{1}/{2}.vtl</result>

修改后的struts将统一使用velocity模板取代jsp作为页面展示层。

注意:
实测后发现,以上零配置的做法只在struts2.0.11版本中可以使用,在struts2.0.XX的更高版本中却未能获通过,这不能不说是个遗憾。

posted on 2009-04-07 14:13 goldrain 阅读(9638) 评论(15)  编辑  收藏

评论

# re: struts2之完全零配置[未登录] 2009-04-07 14:35 abc
老大,拦截器怎么办,验证怎么办,能完全省略吗!  回复  更多评论
  

# re: struts2之完全零配置 2009-04-07 14:53 goldrain
@abc
对,实际项目中要根据情况有很多的取舍。
但并不是说你提到的拦截器,验证等就不能做了。

比如你可以对通配符配置更多的支持;

对特殊情况,你可以建其他命名空间package来做;

或者对更特殊情况可以配置单独的action;

但在我实际项目开发中,多数情况都可以按文中描述的来做。
  回复  更多评论
  

# re: struts2之完全零配置 2009-04-07 14:56 goldrain
有时我们总是过度考虑灵活性,而忘记了效率和体验才是我们最需要的。  回复  更多评论
  

# re: struts2之完全零配置 2009-06-12 09:17 这是完全零配置吗
我靠,这是完全零配置吗?struts.xml都还在,晕死.....................  回复  更多评论
  

# re: struts2之完全零配置[未登录] 2009-06-12 09:54 goldrain
@这是完全零配置吗
那是初始配置而已,之后就不用配置了。
咬文嚼字有意义么?  回复  更多评论
  

# re: struts2之完全零配置 2009-06-16 17:39 晕 死了 这样的零配置谁敢用
郁闷。。。  回复  更多评论
  

# re: struts2之完全零配置 2009-06-16 17:40 晕 死了 这样的零配置谁敢用
出发点是好的   回复  更多评论
  

# re: struts2之完全零配置 2009-08-24 14:23 XLay
这样配置一个很大的缺陷就是如果要更改页面指向,就要更改action的java代码!!  回复  更多评论
  

# re: struts2之完全零配置[未登录] 2009-08-24 14:54 goldrain
@XLay
你说的很对,但这个基本不是问题,谁吃饱了撑着没事去改页面指向干嘛  回复  更多评论
  

# re: struts2之完全零配置 2009-11-06 09:41 Allen Yang
这不是Struts2的零配置,Struts2的零配置是基于Convention插件来实现的,它里面体现的是“约定大于配置”的思想,而不是用通配符来配置  回复  更多评论
  

# re: struts2之完全零配置 2009-12-12 23:35 Mr Jiang
零配置不是不用再配置struts.xml了么?
这样配置确实达到了动态的配置,但是struts提供的MVC模式好像是不是有点混了,假如我在维护或是在利用阶段是不是不好对其代码修改啊?期待您的回答?  回复  更多评论
  

# re: struts2之完全零配置 2010-01-27 13:00 ddd
不错  回复  更多评论
  

# re: struts2之完全零配置 2011-11-28 15:06 99134194
零配置是不需要写以下代码的:
<action name="*/*!*" class="net.jacker.ww.{1}.{2}Action" method="{3}">
<result name="default" type="dispatcher">/{1}/{2}.jsp</result>
<result name="view" type="dispatcher">${viewpath}.jsp</result>
<result name="redirect" type="redirect">${viewpath}</result>
</action>
  回复  更多评论
  

# re: struts2之完全零配置 2012-06-14 21:47 O
这也叫零配制???????fuck  回复  更多评论
  

# re: struts2之完全零配置 2012-09-09 00:39 功夫风光好
很好,类似于spring mvc 的思想,很强大,只是struts2更高版本的零配置是基于“约定优于配置”的思想用Convention插件来实现的。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: