今天碰到一个小问题。忘记在web.xml 配置struts2-cleanup了,如果要用到上传,这个一定要配置上。。。
< filter-name > struts-cleanup filter-name >
< filter-class >
org.apache.struts2.dispatcher.ActionContextCleanUp
filter-class >
filter >
< filter-mapping >
< filter-name > struts-cleanup filter-name >
< url-pattern > /* url-pattern >
filter-mapping >
这样,那个未知的错误就没有了。。
Struts2的拦截器是基于AOP思想的,采取可配置的方式控制(可插销式)。 拦截器的使用解耦了对servlet的依赖,不在依赖Servlet API。而Struts1.x Action中的execut中有HttpServletRequest和HttpSerletResponse方法。对于Struts2的Action来说其实就是一个POJO。。。
话题回到拦截器,Strut.xml中可以定义拦截器,也可以定义一个拦截器栈,格式是:
配置好之后就可以在具体的Action引用改拦截器,引用的格式是
怎么写一个拦截器呢,庆幸的是在struts2中这是一件简单而且愉快的事情。
首先要实现com.opensymphony.xwork2.interceptor.Interceptor接口。
public Interface Interceptor extends Serializable {
//销毁该拦截器之前的回调方法
void destory();
//初始化该拦截器的回掉方法(主要是打开一些资源)
void init();
// 拦截器实现拦截的逻辑方法
String intercept(ActionInvocation invocation) throws Exception;
}
intercept这个方法是我们需要实现的拦截动作。就像Action的execute一样,intercept方法会返回一个字符串的逻辑视图。ActionInvocation参数包含了被拦截的Action的应用,调用invoke方法,将控制权交给下一个拦截器,或者转个Action的execute方法。
跟java的API一样,大家都知道很多时候一个接口对应的会有一个抽象类实现这个接口,然后在抽象类提供接口一些方法的空实现,这样在我们在用的时候,就可以直接继承那个abstract的类,不用在实现那些我们不要的方法。 那么Struts2也提供了这样的一个方法AstractIntercepor类,这个类对init()和destory()方法进行了空实现,以为并不是我们每次实现拦截器的时候都要申请资源。ActionInvocation可以做的事情很多,我复制一段API
Method Summary
void addPreResultListener(PreResultListener listener)
Register a com.opensymphony.xwork2.interceptor.PreResultListener to be notified after the Action is executed and before the Result is executed.
Object getAction()
Get the Action associated with this ActionInvocation
ActionContext getInvocationContext()
Gets the ActionContext associated with this ActionInvocation.
ActionProxy getProxy()
Get the ActionProxy holding this ActionInvocation
Result getResult()
If the ActionInvocation has been executed before and the Result is an instance of ActionChainResult, this method will walk down the chain of ActionChainResults until it finds a non-chain result, which will be returned.
String getResultCode()
Gets the result code returned from this ActionInvocation
ValueStack getStack()
String invoke()
Invokes the next step in processing this ActionInvocation.
String invokeActionOnly()
Invokes only the action (not interceptors or results).
boolean isExecuted()
阅读全文...
一些进来的学习心得,可能理解的不够透彻。不过随便写写,算是总结一下。不过感觉对oop还是有了更深的了解。
其实面向对象的内容不多,就三个名词,封装,继承,多态,但是要真正的弄清楚这些也不是一件容易的事情。面向对象的基本是封装,有了封装才有继承,有了继续才有多态。 对于面向对象的编程其实从另外一个角度也可以理解为面向职责的编程。就是有了这些思想之后,程序员开发的时候职责更加的明确了。每个人都有自己专注的任务,比如说可以让精通页面的人只做页面,精通业务逻辑的人只做业务,精通数据库的人只做数据库的操作。做业务的人可以不懂web得一些知识,甚至对数据库他也不需要去关注。 那就需要分层,分层从这个角度来说也是更好的体现出职责,当然从软件工程的概念来说是一个解耦的过程,也是一个可以更好的软件复用的过程,这也是软件开发这么多年来苦苦追求的。
分层有两种一种是学院派,一种是广义派的。对于学院派来说,是很严格的,上层只需要调用下面一层的接口。而下一层则完全不依赖于上一层,它更本不需要知道上面发生了什么事情,它只要做好自己的事情就可以了。 这样做的好处还有在项目更改的时候,你只需要改一层的代码,比如说持久层,因为它完全不依赖于上一层(一般是业务逻辑层)那么它的改动也就不会影响上面的层次,打个比方出于对市场的考虑,一个产品既要支持mysql又要支持oracle,那么对于上面的层次是不是根本就不需要改动。 除了解耦,这样最大的好处就改变了软件开发的工作发式和降低了维护的成本。以往的开发发式,比如说php,我们在做wordpressmu的二次开发的时候都是按模块的方式进行,一个人负责一个模块或者说功能点,从头到尾。而java ee中是用层的方式去分工的,当架构师把整个架构设计好之后,就可以很好的分工了,各自发挥自己的特长,而且是并发进行的,每个开发人员只要把自己的事做好,就跟前面说的一样。 那么还有什么好处呢,就是debug的时候了,这样很容易就可以找到bug。 当然这些是我理解的好处,对于javaee的妙处自然不是这些能概括的。
那么说说广义派吧,这个就没有学院派那么严格了,他允许跨层次的接口和少量的依赖。因为这也有他们的理由,他们的理由是一个特定的项目就有一个特定的环境,比如说我这个项目定了用mysql,那就没必要再去考虑别的数据库,等等。 因为我对这个学派不是很赞同,所以就不说这个了。
。。。。
现在每次写东西都是写了一半就不想写了。。 越写越发觉自己懂得东西太少了,理解的太太不够了。
这些天一直在理解oop,ioc,aop这样的一些原理。 也发了很多时间重新的看reflection这一块,整体上有一点认识,不过如果不用struts2,spring这样的框架,要怎样去自己实现这样的思想,还是有点晕,像依赖注入这样的东西,其实当系统足够复杂要是不用框架,要自己去实现是很难控制的。其实很多东西还是要理解的够透彻就行,比如说struts2确实很简单,如果只是会用的会而不去了解其背后的原理,那么项目中出现的一些怪异问题时候,就无法解决了,像那“神奇”的拦截器,不仅仅要会自己写一个拦截器还要理解它的运行机制等等。 不过现在能用好那些开源框架就可以了,其他的等用好了这些东西在考虑把。






















您还没有登录,请登录后继续操作。