转自:http://blog.sina.com.cn/s/blog_722e24e70100npay.html
- Struts的5个核心转自组件
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即可):
ü struts.i18n.reload = true 自动reload国际化文件
ü struts.devMode = true 开发模式,更易于理解的调试信息
ü struts.configuration.xml.reload reload一个xml配置文件而不是整个应用
ü struts.url.http.port = 8080 端口
ü struts.i18n.encoding= GBK 用于中文环境
2. struts.xml
1) Include: 用于模块化配置文件,可将struts.xml分开并由此tag引入。引入是顺序相关的。有些配置文件是自动加载的:struts- default.xml、truts-plugin.xml。前者是struts核心的配置文件,主要定义了默认的许多interceptors以及返回 类型,后者提供了特定plug-in的配置。
2) Package:用于分组。同一组通常共享一些属性诸如interceptor stack或URL namespace。通常用于分开特定的功能模块。
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. 通过action访问表单数据
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 void doSomething();
}
public class Target implements TargetInterface
{
public void doSomething()
{
System.out.println("do something");
}
}
其次,拦截器
public class Interceptor{
public void before(){
System.out.println("before");
}
public void after(){
System.out.println("after");
}
}
然后,实现InvocationHandler(实际中这个类应该是struts容器实现的)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyHandler implements InvocationHandler {
private Object object;
private Interceptor interceptor = new Interceptor();
public void setObject(Object object){
this.object = object;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
Object result = null;
interceptor.before();
result = method.invoke(object, args);
interceptor.after();
return result;
}
}
最后,需要一个代理类(实际中也是由struts利用java的反射机制动态生成的)
import java.lang.reflect.Proxy;
public class MyProxy{
public Object getProxy(Object object){
MyHandler myHandler = new MyHandler();
myHandler.setObject(object);
return Proxy.newProxyInstance(Target.class.getClassLoader(), object
.getClass().getInterfaces(), myHandler);
}
}
Client来展示如何调用:
public class Client {
public static void main(String[] args) {
TargetInterface target = new Target();
MyProxy myProxy = new MyProxy();
TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
proxy.doSomething();
}
}
其中,Target和Interceptor是我们来实现的,然而他们彼此并没有耦合。在运行当中,struts会通过配置文件自动生成handler和 proxy将他们联系在一起,这种动态耦合的方式增加了系统的灵活性。在struts和spring框架中中这种方式被大量采用。
2. interceptor配置
1)在配置文件struts.xml中配置interceptor
…
class="interceptor.ActionAutowiringInterceptor"/>
2) 在action中引用
view.jsp
当有多个interceptor时顺序排在前面的优先。
可以定义为默认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{
System.out.println("intercept");
String result = invocation.invoke();
System.out.println("finish");
return result;
}
Value Stack / OGNL(Object Graph Navigational Language)
OGNL(Object Graph Navigational Language), 提供了统一的方法来访问value stack。 1. value stack则包含了下面几种对象:
- 临时对象(temporary objects):执行过程临时创建的对象,例如在对一个集合类对象执行循环的时候当前的迭代值
- 模型对象(model object):模型对象在action对象放入前进入VS
- Action对象(action object)action本身
- 命名对象(named objects)包括 #application,#session, #request, #attr 和 #parameters等指向相应的servlet scope。
2. 访问VS的途径:
- Tag: 包括JSP、Velocity、Freemarker等提供的。HTML tag是获取vs data经常的途径
- OGNL
3. 使用vs时候不用care它的作用域,只要vs中存在相应名称的property,就可以得到value,struts会自动loop整个stack
但是当我们需要访问一个common name的对象时(比如id),就会得到第一个(也许并不是我们想要的),这时就会用到OGNL。
http://www.opensymphony.com/ognl/
Return Types
其实return给client的不单单可以是JSP页面。Struts定义了很多类型的return type。
1. 配置
例如:返回jsp页面的例子(forward)
view.jsp
2. 定义一个return type
在下定义,类似于interceptor,其中clas代表实现类,而default则表示默认的return type
class="….dispatcher.ServletDispatcherResult"/>
class="….dispatcher.ServletRedirectResult"/>
…
3. 实现return type
除了struts默认提供的,还可以自定义return type,实现下面的接口即可:
public interface Result extends Serializable {
public void execute(ActionInvocation invocation)throws Exception;
}
ActionInvocation提供了对运行时环境的访问,可以使return type访问到action执行过后的信息,以及action执行时的环境信息。其中包含有HttpServletRequest对象,可以难倒当前request的输出流。
相关推荐
开发环境: Windows操作系统 ...正文用小四号字体,段落格式首行缩进2个字符,1.5倍行距;论文中的表必须是三线表,图必须用vs画,图和表中的文本是五号字体;图必须有图序和图题,表必须有表序和表题。
Struts2最新版本2.2.1中所设计的核心库文件,包括以下内容: struts2-core-2.2.1.jar:Struts2框架的核心类库。 xwork-core-2.2.1.jar:Xwork核心类库,Struts2在其上构建。 ognl-3.0.jar:对象图导航语言(Object ...
主要将讲解什么是MVC设计模式?Struts2核心组件解释,Struts2的工作原理,SpringMvc各个组件的解释,Springmvc工作原理
资深开发人员深入剖析Struts2核心概念和组件 学习Struts不可不读 作者简介 作者:(美国)Donald Brown (美国)Chad Michael Davis (美国)Scott Stanlick 译者:马召 等 Donald Brown,Atlassian软件系统公司托管...
Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。 核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。...
1、MVC 概述 2、Struts1.x简述 3、Struts2概述 4、编写一个struts2应用程序 5、Struts2的核心配置文件 6、Action的实现 7、拦截器
struts2-core-2.x.x.jar : Struts2 框架的核心类库 b. xwork-core-2.x.x.jar: XWork类库,Struts2在其上构建 c. ognl-2.6.x.jar: 对象图导航语言(Object Graph Navigation Language),Struts2框架通过其读写对象的...
struts2-core-2.1.8.jar:Struts 2框架的核心类库 xwork-core-2.1.6.jar:XWork类库,Struts 2在其上构建 commons-logging-1.1.1.jar :日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
2.数据库操作使用c3p0连接池和dbtuils组件,对表的CURD,二者搭配感觉很easy,没有使用hibernate。 3.控制器采用action开发,替代传统的servlet,直接跳转页面返回一个字符串即可,需配置struts.xml对应的jsp。 4....
Amazon全五星图书,备受赞誉 资深开发人员深入剖析Struts 2核心概念和组件 学习Struts不可不读
Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件...Struts 2框架按照模块来划分,可以分为Servlet Filters、Struts核心模块、拦截器和用户实现部分。
struts2-core-2.1.8.jar Struts2的核心包 struts2-json-plugin-2.1.8.jar json进行异步刷新操作(非必要) xwork-core-2.1.6.jar Command模式框架,WebWork和Struts2都基于xworkcommons-logging-1.0.4.jar Java日志...
资深开发人员深入剖析Struts2核心概念和组件 学习Struts不可不读 作者简介 作者:(美国)Donald Brown (美国)Chad Michael Davis (美国)Scott Stanlick 译者:马召 等 Donald Brown,Atlassian软件系统公司托管...
Struts灵活易用、功能强大,是广受欢迎的Java Web框架。...最后讲解了从核心组件中挑选出来的高级技术以及一些框架的高级特性,如插件及与Spring集成等。 本书可共Struts入门学习,也可供有经验的程序员随时参考。
在 struts.xml 文件中,需要配置 Struts 框架的核心组件,例如 Action 和 Result 等。 三、Struts2 框架应用实例 1. 建立一个项目 首先,需要建立一个项目,例如 FirstAction。然后,需要导入 Struts 框架所需要...
Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。 3.1.1 核心控制器FilterDispatcher 核心控制器FilterDispatcher是Struts 2框架的基础,...
Struts 2 框架的主要特点在于其 MVC(Model-View-Controller)架构,它将应用程序划分为三个核心组件,分别是模型(Model)、视图(View)和控制器(Controller)。这种分层结构有助于代码的组织和维护,同时也促进...
本章要点 — Web应用的发展 — Model 1和Model 2 — MVC思想 — MVC模式的优势 — 常用MVC框架及其特征 — Struts 1的基本结构及其存在的问题 — WebWork的基本...— Struts 2的控制器组件 — Struts 1和Struts 2的对比