在很久之前我就体验(所谓体验,就是写一个demo跑跑,算不上学习)过一把struts2。但是我发现虽然struts2相对struts1.x有很大的不同,但是还是没有解决困扰我的这个问题。就是model就究竟怎么写。在一个spring-hibernate-struts的典型项目中,通常会在Hibernate中定义一个pojo实体类做ORM,但是在struts的Action同样要定义model,不会再把那个实体类再写一遍,我觉得很难受,我知道可以在Action里面声明一个实体类,但是这样总觉得不是很优雅,因为在我看来,实体类没有得到很好的复用,我曾经对struts2很冷漠。但是最近了解到struts2里面有一个Model-Driven,虽然对模型驱动开发了之甚少,但是通过自己做的简单的代码,我发现这个世界真的是缺少发现。
这也是第一次用上了maven2,最开始用到maven2是因为他可以管理依赖(dependency),我们只要在maven2的pom.xml 文件中添加一个依赖,maven 就会自动到网上下载struts所依赖的包并设置好classpath。
tip:要使用maven2的eclipse插件m2eclipse必须将eclipse3.4升级到最新的版本,不然会被报错的,update站点为:http://m2eclipse.sonatype.org/update/
新建完项目之后,在项目的右键菜单中 maven2 -> add maven2 management。整个项目的目录结构都会有变化,注意两点,添加了maven2支持后,在build path中的source没有了,需要手动添加文件夹。还有一个问题就是你必须在"Order and export"中将maven dependencies勾上,否则部署tomcat上面的时候会有包缺失。
进入正题:其实model-driven在strtus中的用法没有什么特别的地方。就是在定义Action的时候稍有不同。
1 public class UserAction extends ActionSupport implements ModelDriven{
2
3 private static final long serialVersionUID = 6863420763993646296L;
4 private User user=new User();
5
6 public Object getModel() {
7 return user;
8 }
9
10 public String execute() {
11 if(this.user.getAge()==20) this.user.setAge(22);
12 return SUCCESS;
13 }
14 }
其实变化就是在定义Action的时候实现ModelDriven接口实现getModel方法。注意在声明实体对象的时候需要实例化。但是在jsp页面上也是有不同的。
1 <s:form action="UserAction" theme="css_xhtml">
2 <s:textfield name="name" label="姓名"></s:textfield>
3 <s:textfield name="age" label="年龄"></s:textfield>
4 <s:submit value="GO"></s:submit>
5 </s:form>
如果按照通常的做法在Action中定义一个User对象,那么在jsp页面上文本框的属性就应该是user.name,user.age.这样做显然更加简单。
结论
使用model-driven的方式能够将现有的实体类简单的复用为mvc模型中的model,减少代码。
疑问:虽然解决了这么个问题,但是我还是对struts有些不放心,就是tag生成的html,很难获得dom的id属性,这样给javascript的一些逻辑控制带来了麻烦,这也是我对struts不太放心的地方,不知道大家在这方面是怎么做的。