论坛首页 Java企业应用论坛

基于Struts2的Convention插件打造零配置的项目

浏览 8396 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-08   最后修改:2010-12-08
    使用Struts2的convention插件,可以打造零配置的项目,这样做有一个好处,可以统一约定大于配置的开发规范,同时,省却了每个程序员在负责不同模块时都得维护自己的struts配置文件,在包含到主struts配置文件中时,如果有一个出了错,那么可能整个项目都运行不起来。这里就做一个例子讲解一下convention插件是如何统一管理项目的配置的。
     首先建立一个web项目,我这里就叫做convention,接着拷贝struts的jar包到相应的lib目录下,如图所示


接下来要配置struts的配置文件,配置如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
	<constant name="struts.ui.theme" value="simple" />
	<!-- 定义默认的访问后缀 -->
	<constant name="struts.action.extension" value="do" />
	<!-- 开启动态方法调用 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />
	<!-- 默认对以action,web的包极其子包起作用 -->
	<constant name="struts.convention.package.locators" value="action, web" />
	<!-- 设定默认的字符编码 -->
	<constant name="struts.i18n.encoding" value="UTF-8"/>
	
	<!-- 可以自定义页面的存放路径 -->
	<!-- <constant name="struts.convention.result.path" value="/WEB-INF/page" />  -->
	
	
	<!-- 以下两项在生产模式中要去掉 -->
	<constant name="struts.devMode" value="true"/> 
	<constant name="struts.convention.classes.reload" value="true" />
	
</struts>


这里要注意的是,如果想用convention插件进行开发,则必须要开启动态方法调用。

下面我建立一个类,完整类名称为
com.bj58.action.user.UserListAction
那么,这个UserListAction默认的包命名空间就是"/user"
下面让我们来看一下UserListAction类的代码
@Namespace("/user")
@SuppressWarnings("serial")
public class UserListAction extends ActionSupport {

	public String execute() {
		return "success";
	}
}

@Namespace定义了这个类的包命名空间,相对应的,默认使用convention插件的时候,页面结果都是存放在/WEB-INF/content下的,如果你这个action类的包命名空间是/user,
那么你要在content文件夹下新建立个user文件夹,如图


那么,对应这个action的页面都放在里面就可以了
默认Action如果是两个单词以上的,对应的action名称就要以"-"为中划线分割开,
那么这个Action对应的页面就是user-list.jsp
好了这个时候,我们启动tomcat,在浏览器里输入
http://localhost:8080/user/user-list.do就可以访问到userList页面了,这个我的根路径定义为"/"
如果你默认是convention,那么你的路径要加入项目名称。

    接下来,再建立一个类,我叫它UserManageAction,用来做User管理的,类的代码如下:
@Results({
	  @Result(name="message", location="/WEB-INF/content/common/message.jsp")
	})
@Namespace("/user")
@SuppressWarnings("serial")
public class UserManageAction extends ActionSupport {

	@Action(value = "/user/bar", results = { @Result(name = "add", location = "/another/url.do", type = "redirect") })
	public String addUI() {
		return "add";
	}
	
	public String add() {
		return "message";
	}
	
	public String editUI() {
		return "edit";
	}
	
	public String edit() {
		return "message";
	}
	
	@Action(value="/another/url")
	public String another() {
		return "another";
	}
}


这个类里我定义了增加和修改的方法,需要注意的是,你的相对应的jsp页面的名称就不一样了,比如,addUI方法,是打开一个添加用户的页面,它默认走的是"add",那么,你的页面就要起名字为user-manage-add.jsp,你在浏览器里访问的时候,就要这么访问了
http://localhost:8080/user/user-manage!addUI.do
那么就将打开你的添加页面了。
这里的
@Results({
	  @Result(name="message", location="/WEB-INF/content/common/message.jsp")
	})

定义了全局要访问的页面,比如你添加或者修改成功后,要跳转到一个公共的页面。
最后再说下@Action注解,这个注解,是定义一个url路径,比如对于添加方法,如果我直接访问http://localhost:8080/user/bar.do
那么将直接跳转到another方法对应的页面去,就是content下面的another文件夹下的url.jsp页面了。
这就是初步的使用convention打造基于零配置的小示例。时间仓促,还有很多不完善的地方,欢迎大家批评指正,呵呵。
  • 大小: 17.5 KB
  • 大小: 5.2 KB
   发表时间:2010-12-09  
相对而言,Spring3 MVC的配置更少,而且关键一点:更灵活。。。
0 请登录后投票
   发表时间:2010-12-10  
fnet 写道
相对而言,Spring3 MVC的配置更少,而且关键一点:更灵活。。。

举例说明?
0 请登录后投票
   发表时间:2010-12-10  
这支持freemarker 么
0 请登录后投票
   发表时间:2010-12-10  
感觉好麻烦的啊,还不如直接写配置文件呢。
0 请登录后投票
   发表时间:2010-12-10  
[quote="glamey"]感觉好麻烦的啊,还不如直接写配置文件呢。[/quote]
0 请登录后投票
   发表时间:2010-12-10  
在jboss下跑,就是痛苦的开始!零配置非零配置!
0 请登录后投票
   发表时间:2010-12-11  
个人感觉,无论是spring 还是 struts2的annotation配置可读性没那么好,还是使用xml 清晰明了,一看就知道 相对简单
0 请登录后投票
   发表时间:2010-12-12  
使用Convention插件,有一个问题,就是Action如果是在单独的JAVA工程中,然后发布的时候,使用JAR包形式,Convention不能解析类路径中的零配置Action。这一点很让人不爽,最后决定放弃这个插件。
0 请登录后投票
   发表时间:2010-12-14  
在没有良好的规范下 零配置只会导致项目更混乱!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics