转自:http://blog.sina.com.cn/s/blog_722e24e70100npay.html
-
1. Actions: model
2. Interceptors: controller
3. Value stack / OGNL: provide common thread, linking and enabling integration between the other components
4. Resut types: view
5. Results / view technologies: view
- Struts2 configuration file
1. struts.properties
这个文件用来改变struts的默认行为,通常不用修改。所有这个文件中的内容可以用web.xml中的’’init-param’或者struts.xml中的”constant”来覆盖。默认的文件位于struts核心jar包的org.apache.struts2包下,default.properties.
为了开发方便,通常修改一下几个属性(在src root下创建struts.properties即可):
ü
ü
ü
ü
ü
2. struts.xml
1)
2)
Name:标识而已
Extends:引入别的包,类似于java的继承。通常extends struts-default.xml
Namespace:URL到package的映射,例如两个同样的action不同的namespace就会有不同的configuration:如/myWebApp/package1/my.action”“/myWebApp/package2/my.action”
Abstract:若为true,则action通过package访问不到。
另外,package下可以有 tag。
Actions
首先,struts中的action是POJO,即不必要(但可以)继承任何父类或者实现任何接口。其次action有一个方法execute(),返回string(结果)。
一个例子:
view.jsp
error.jsp
其中name提供了执行这个action的URL信息,/my.action。后缀.action定义在struts.properties中,可以改变。
1. 有4种决定action结果的方式。(待完善)
2. result types:下面是struets种定义的result type,还可以自定义,其中默认为dispacther(forward),redirect可以用来返回到登录页面。
Struts遵循javabean的范例,用setter和getter。如:调用home.action的URL“/home.action?framework=struts&version=2”需要action提供setFramework()方法。struts2提供了对原子数据类型及简单对象的的自动转换。
4. 访问business service
下面是struets种定义的result type,还可以自定义,其中默认为dispacther(forward),redirect可以用来返回到登录页面
5.
1) 通过实现“aware”接口
2) Built-in tag lib. 通过value stack来访问(action提供相应名称的getter)。
Interceptors 拦截器
拦截器与servlet中的filter是很类似的。(过滤器请求先进入filter,进入过滤器链,而后进入真正的servlet,而后再回到filter)
1. Interceptor实现机制
首先,一个目标对象(被拦截的对象,实际中为action)tagart object
public interface TargetInterface {
}
public class Target implements TargetInterface
{
public void doSomething()
{
}
}
其次,拦截器
public class Interceptor{
public void before(){
}
public void after(){
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyHandler implements InvocationHandler {
}
最后,需要一个代理类(实际中也是由struts利用java的反射机制动态生成的)
import java.lang.reflect.Proxy;
public class MyProxy{
}
Client来展示如何调用:
public class Client {
}
其中,Target和Interceptor是我们来实现的,然而他们彼此并没有耦合。在运行当中,struts会通过配置文件自动生成handler和proxy将他们联系在一起,这种动态耦合的方式增加了系统的灵活性。在struts和spring框架中中这种方式被大量采用。
2. interceptor配置
1)在配置文件struts.xml中配置interceptor
…
class="interceptor.ActionAutowiringIntercep
2) 在action中引用
view.jsp
可以定义为默认interceptor,自动应用到每个action中
3) 定义interceptor stack来同时应用多个interceptor,stack可以嵌套定义。例如在struts-default.xml中定义了
可以refer到一个interceptor或者interceptor stack,在struts看来是interceptor和stack一样的。如:
view.jsp
3. 开发interceptor
两种方法:
1) 实现接口Interceptor
2)继承AbstractInterceptor(这个类其实是实现了Interceptor接口,而把init和destroy空实现,因为这两个方法不常用,而留下intercept方法给用户实现)
例如:
public String intercept(ActionInvocation invocation) throws Exception{
}
Value Stack / OGNL(Object Graph Navigational Language)
OGNL(Object Graph Navigational Language), 提供了统一的方法来访问value stack。 1. value stack则包含了下面几种对象:
-
-
-
-
2.
-
-
3.
但是当我们需要访问一个common name的对象时(比如id),就会得到第一个(也许并不是我们想要的),这时就会用到OGNL。
http://www.opensymphony.com/ognl/
Return Types
其实return给client的不单单可以是JSP页面。Struts定义了很多类型的return type。
1.
例如:返回jsp页面的例子(forward)
view.jsp
2.
在下定义,类似于interceptor,其中clas代表实现类,而default则表示默认的return type
class="….dispatcher.ServletDispatcherResult"/>
class="….dispatcher.ServletRedirectResult"/>
…
3.
除了struts默认提供的,还可以自定义return type,实现下面的接口即可:
public interface Result extends Serializable {
public void execute(ActionInvocation invocation)throws Exception;
}
ActionInvocation提供了对运行时环境的访问,可以使return type访问到action执行过后的信息,以及action执行时的环境信息。其中包含有HttpServletRequest对象,可以难倒当前request的输出流。