- 浏览: 966441 次
文章分类
最新评论
-
18335864773:
很多公司项目 都在使用pageoffice 来操作word,e ...
用java生成word文档 -
Gozs_cs_dn:
请问下博主, 怎样将sitemesh3.xsd绑定 sitem ...
SiteMesh3配置 -
Rose_06:
springside4.0quick-start.bat报错原因 -
ilemma:
我也是刚参见工作啊,经理让自学这个,有些东西不太懂,能不能发个 ...
Apache Shiro在Web中的应用 -
shanbangyou:
你废了
程序员上班打酱油的方法
在SpringSide 3 中,使用的MVC框架是Struts 2。Struts 2 向对于Struts 1 来说,具有相当多的优点,有很多人都说,用过Struts 2之后,再也不想看Struts 1了。然而,任何东西都有它的复杂性,Struts 2也不例外,SpringSide 3做了很多工作来简化Struts 2 的使用。
先来说说Struts 2的特点:
1、编写Action变得简单了,Action变成了简单的POJO,再也不用和ActionForm、ActionForward打交道了,返回的时候直接返回字符串即可。如果要访问Servlet API,则直接使用ServletActionContext类的静态方法。
2、Struts 2提供了插件机制,允许我们自己为它编写插件,当然,要我自己写是不现实的,但是面对别人写的琳琅满目的插件,我一样会昏头。再网上随便一搜,就可以发现40多种Struts 2插件。SpringSide 3选择的CodeBehind,就是一种Struts 2插件,它的目的是为了简化配置。
3、Struts 2提供了拦截器机制,之所以编写Action的任务那么简单,靠的都是这些拦截器,比如它们可以自动解析Web表单和URL参数,把它们注入到Action中。
4、Struts 2提供了丰富的taglib,当然,丰富也代表着我们要化更多的时间去学习。
5、Struts 2依然提供了Validator和i18n支持。
等等...
下面,我们来看看SpringSide 3是怎么使用Struts 2的吧。SpringSide 3的主要目标是降低我们使用Struts 2的复杂性,所以,它选择了这些办法:
1、没有使用Validator和i18n,对数据的验证交给了JQuery,这变成了表现层的任务,而且JQuery也可以使用AJAX从服务器端进行验证。至于i18n,江南白衣说小网站用不上。
2、没有使用Struts 2的UI标签,当然也就没有使用FreeMaker或SiteMesh了。
当然,省掉了一些东西,就省掉了我们不少的学习时间。对于Struts 2核心的一些东西,我们看看它是怎么做的:
1、使用CodeBehind插件来简化配置。使用CodeBehind后,我们就可以不用配置result了,它可以根据我们Action的返回值自动猜测返回的视图页面,它猜测的规则是这样的:返回页面的路径为struts.codebehind.pathPrefix + package namespace + action name + action returnvalue + .jsp,action returnvalue为success时,值为空,为其他时,值为"-" + return type。我们来看看SpringSide 3生成的项目中关于Struts 2的配置文件:
其中struts.codebehind.pathPrefix设置为“/WEB-INF/jsp/”,package的namespace没有设置,所以,如果我们的Action为UserAction,则返回success时,就会返回到/WEB-INF/jsp/user.jsp,如果返回input,则返回到/WEB-INF/jsp/user-input.jsp。这里江南白衣玩了一个狡猾,他把所有的jsp页面放到WEB-INF目录中,别人就没有办法直接访问了,这样就可以简化Acegi的配置工作。
2、关于拦截器栈
在上面讲Struts 2的特点时,我已经说了Struts 2中拦截器的重要作用,在上面的截图中,package的配置没有做别的什么事,主要就是配置了拦截器栈。那么拦截器栈是怎么使用的呢?它是在Action类中通过@ParentPackage指定的,如下面的代码:
下面,我来具体说一下拦截器有什么作用。
例子一、我们知道Struts 2中的Action是和Servlet API解耦的,那么如果我们要在Action中访问Servlet API怎么办呢?一种办法就是使用ServletActionContext,如下图:
另外一种办法,就是让我们的Action实现ServletRequestAware接口,如下代码:
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest request) {
this .request = request;
}
public String execute() throws Exception {
// do the work using the request
return Action.SUCCESS;
}
}
这时候,ServletConfigInterceptor 拦截器就会把request对象注入到我们的Action中。
例子二、ParametersInterceptor 拦截器会自动解析web表单或URL参数,并把它们注入到Action中。但是很多时候,我们不愿意我们的Action具有太多的属性,因为一大堆的get、set方法看起来太乱糟糟,我们希望有一个专门的Model对象来存储这些值,而且刚好我们为Hibernate设计的Entity类用来做Model正合适。这时,我们可以让我们的Action实现ModelDriven接口,让getModel()方法返回我们的entity对象即可。这正是SpringSide 3采取的方法,如下图的代码片断:
这时候,ModelDrivenInterceptor拦截器就会帮助我们把解析的URL参数或表单数据注入到entity的属性中,而不是Action中。
例子三、Preparable 接口联合PrepareInterceptor拦截器一起工作,可以让action在执行execute() 方法前, 执行一个prepare()方法,这也正是SpringSide 3的工作方式。
3、关于Action
有了上面对CodeBehind的理解和对拦截器栈的理解后,再来理解SpringSide 3中的Action就再简单不过了,SpringSide 3中Action的继承树如下:
其中ActionSupport类是Struts 2提供的,另外两个类是白衣自己扩展的。其中SimpleActionSupport主要是提供了一些绕过jsp页面直接输出字符串的方法,不值一谈。而CRUDActionSupport就比较复杂,如下:
/**
* 进行CUD操作后,以redirect方式重新打开action默认页的result名.
*/
public static final String RELOAD = "reload";
/**
* Action函数,默认action函数,默认指向list函数.
*/
@Override
public String execute() throws Exception {
return list();
}
/**
* Action函数,显示Entity列表.
* return SUCCESS.
*/
public abstract String list() throws Exception;
/**
* Action函数,新增或修改Entity.
* return RELOAD.
*/
public abstract String save() throws Exception;
/**
* Action函数,删除Entity.
* return RELOAD.
*/
public abstract String delete() throws Exception;
/**
* 在save()前执行二次绑定.
*/
public void prepareSave() throws Exception {
prepareModel();
}
/**
* 在input()前执行二次绑定.
*/
public void prepareInput() throws Exception {
prepareModel();
}
/**
* 屏蔽公共的二次绑定.
*/
public void prepare() throws Exception {
}
/**
* 等同于prepare()的内部函数.
*/
protected abstract void prepareModel() throws Exception;
}
第一,它做了把CRUD操作放到了同一个Action中的操作,这样可以少写几个Action。这个工作难度不大,我觉得白衣此举,主要是为了规范CRUD函数的命名。在Struts 2中,如果我们要访问的不是默认的excute方法,可以使用如/user!save.action的格式,这样访问的就是UserAction的save方法。
第二,它实现了ModelDriven接口和Preparable接口,关于这两个接口,我在前面讲拦截器的时候已经提到过了,所以很容易理解。我们可以把我们为Hibernate设计的entity类作为Model,也可以把初始化这些entity的工作放到prepareSave()和prepareInput()方法中,这两个方法将会在save()和input()方法执行前自动执行。
第三,它定义了一个静态变量RELOAD,定义这个变量的目的是为了定义一个result的需要。CodeBehind中,大部分的result可以自己猜测,对于不能猜测的,需要使用@Results指定,如下代码:
好了,对SpringSide 3中Struts 2的分析就写到这里了。总之,使用SpringSide 3时,对于Action这一块非常简单,如果不设及到CRUD操作,就继承SimpleActionSupport,如果涉及到CRUD操作,就继承CRUDActionSupport,并在getModel()\save()\prepareSave\input()\prepareInput()等框框中填入适当的代码即可。
发表评论
-
SpringMVC使用@ResponseBody中文乱码
2012-03-31 11:45 3067Spring3.0 MVC @ResponseBody 的 ... -
spring mvc 3 上传文件
2012-03-30 16:31 1237spring mvc 支持web应用程序的文件上传功能,是由 ... -
解决 spring mvc 3.0 结合 hibernate3.2 使用<tx:annotation-driven>声明式事务无法提交的问题
2011-10-29 09:23 111211、问题复现 spring 3.0 + hiber ... -
基于Spring框架的Shiro配置
2011-10-26 15:39 3111一、在web.xml中添加shiro过滤器 < ... -
spring3 混合使用 XML 与注解(Annotation)进行 Bean 的配置
2011-10-21 17:34 3632设计 @Configuration 和 @Bean 的初衷,并 ... -
springMVC最佳实践-基于注解的Controller
2011-10-13 23:09 891在spring 2.5发布之后,基于注解的Controller ... -
springmvc3-hibernate-crud例子
2011-10-12 23:45 623http://java.dzone.com/articles/ ... -
ExtJS, Spring MVC 3 and Hibernate 3.5: CRUD例子
2011-10-12 23:45 1277http://loianegroner.com/2010/09 ... -
spring mvc3 annotation例子
2011-10-12 23:43 1837服务端数据到客户端1.返回页面,Controller中方法返回 ... -
Spring Web MVC框架学习笔记
2011-10-12 21:22 2195spring-framework-reference中文版摘录 ... -
Mastering Spring MVC 3中文版
2011-10-11 23:00 3168Mastering Spring MVC 3中文版 精通Sp ... -
基于Myeclipse9.1的spring3.1MVC开发搭建
2011-10-01 14:27 1990(1)配置基础装备。每个符合Java EE规范的web应用程 ... -
Spring Security 设置session
2011-04-02 15:26 3879使用SecurityContextHolder来偷窥登入帐号密 ... -
springsecurity的URL过滤和全局过滤
2011-03-31 15:55 4757springsecurity的URL过滤和全局过滤 最近有个需 ... -
权限控制:spring 3.0 security配置例子
2011-03-31 15:21 1888我几年前自己写过一个 ... -
springside 中 报 org.hibernate.MappingException: Unknown entity: XXX
2011-03-03 17:25 1215org.hibernate.MappingException: ... -
springside 迁移sqlserver数据库报错
2011-03-02 16:55 796报错信息: java.lang.AbstractMethodE ... -
使用SpringSide 3.1.4.3开发Web项目的全过程(上)
2011-03-01 17:41 1092http://www.blogjava.net/youxia/ ... -
MultiActionController绑定command
2007-06-03 08:56 2516dlpower: 一般只见到用SimpleFormContro ... -
Error creating bean with name
2007-06-02 10:07 2539org.springframework.beans.fac ...
相关推荐
NULL 博文链接:https://shrek11.iteye.com/blog/1488659
springside是融合spring,hibernate,struts2,的一个做权限框架
springside-springside4-1dff3fc.zip
该架构的雏形为SpringSide3,本人只是在基础上进行扩展和修缮。由于该架构为本项目正在使用,所以类注释的作者都是本人,而没有改成江南白衣。在这里本人深表歉意。
struts2,springside,hibernate,整合的源码
深入浅出Struts2,比较权威的介绍。 看过就知道了,如何搭建架构建议参考springside
SpringSide以Spring Framework为核心,提供Pragmatic之中又适合工业化大规模开发的企业应用Kickstart。 如果说Sun 的代码规范规定了大家在代码中如何命名变量,怎么编写注释的话,SpringSide则是对怎么用不轻也不重...
小弟最近正在学习Struts2,由SpringSide的文档里面发现infoq上有这个系列的文章,觉得不错,但是无奈英文太差。所以就把我对这个文章的理解写了出来。红色标出来的地方都是我没什么把握的,或者压根就看不明白的,...
打开方法: http://localhost:8080/pagertaglib/dbPageAction.do?pageSize=5&pager.offset=0&pageNo=1<br>在Struts中应用标签但一次取数据在页面自动分页的示例(test2.jsp),打开方法: ...
因为大小的限制,依赖的jar包没有上传,可使用maven来获取... * 为了帮助理解struts2,hibernate,spring等框架的原理,我们还简单实现了minimvc,miniorm,minidi。 * 本项目和springside,appfuse相比,更适合初学者。
2、数据库访问层,此处已经采用了springside的封装方式,方法齐全,能充分满足数据库的大部分增删改查的需求 在做开发时,只需要简单的从genericmanager继承,进行泛型即可。分页也进行了简单的封装。具体方法请看...
用Compass提供的Spring2 Schema 来配置Compass与Hibernate,Spring的结合。 SchemaBase的配置是Spring 2.0的新特征,相比原来的配置代码要少一些。 3.编写搜索结果显示页,将Hits,Command,Page三个变量显示出来。 ...
本章我们将会开发基于Struts2框架的Hello World.我们的Hello World程序是你开发基于Struts2框架程序的第一步.这里我们会提供循序渐进的教程来开发基于Struts2框架的Hello World程序. 教程包含基本的步骤像创建目录...
完整的基于SSH架构的Flex登陆,框架使用springside