Struts2受管理Bean得到request和response
1.IOC方法:在受管理的Bean中类实现ServletRequestAware与ServletResponseAware接口,
声明HttpServletRequest request和HttpServletResponse response 然后添加get set 方法即可用request和response;
2.非IOC方法:ServletActionContext.getRequest()静态方法;
request =ServletActionContext.getRequest();
response =SerlvetActionContext.getResponse();
获得Session:
1. HttpSession session = ServletActionContext.getRequest().getSession();
2. ActionContext context = ActionContext.getContext();
Map session = context.getSession();
使用第二种方法获得session已经在Struts2内部得到了封装 所得到的session并不是HttpSession
调用动态自定义方法
Struts与Struts2的区别
1.Action类
Struts1要求Action类继承一个抽象类,Struts1使用抽象类编程而不是接口
Struts2可以实现Action接口也可以不实现,Struts2提供一个ActionSuport基类去实现常用接口。Action接口不是必须的,任何有execute的标识的
POJO都有可能成为struts2的Action的对象
2.线程模式
Struts1的Action是单例模式并且是线程安全的,仅有Action一个实例来处理所有请求。单策略模式限制了Struts1 Action能做的事。比且在开发时要
注意Action资源必须是线程安全比且是同步的。
Struts2的Action对象为每个请求产生一个实例,因此没有线程安全问题。
3.Servlet依赖
Struts1 Action依赖与Servlet API,因为当一个Action被调用时HttpServletRequest和HttpServletResponse被传递给execute方法。
Struts2 Action不依赖与容器,允许Action脱离容器被单独测试。如果需要,struts2依然可以访问初始的request和response。但是,其他的元素减
少或者消除了直接访问HttpServletRequest和HttpServletResponse的必要性。
4.可测性:
测试Struts1 Action的一个主要问题是execute方法暴漏了Servlet API(这使得测试要依赖于容器)。一个第三方扩展--StrutsTestCase--提供了一套Struts1的模拟对象(来进行测试)
struts2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
5.捕获输入:
struts1 使用ActionForm对象捕获输入。所有ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常 创建多余的基类不或输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有沉余的JavaBean)。
Struts2直接使用Acrtion属性作为输入属性,消除了对第二个 输入对象的请求。输入属性可能是有自己(子)属性的Rich对象类型。Action属性能过通过web页面上的Taglibs访问。struts2也支持 ActionForm模式。Richard对象类型,包括业务对象,能够用作输入/输出对象。这种ModelDriven特性简化了Taglib对 POJO输入对象的引用。
6.表达式语言
Struts1整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很脆弱。
Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--“object graphNotation Language”(OGNL)
7.绑定值到页面(view)
Struts1使用标准JSP机制吧对象绑定到页面中来访问。
struts2使用ValueStack技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重同页面(view)
8.类型转换
Struts1 ActionForm属性通常都是String类型。struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的
struts2 使用OGNL进行类型转换,提供基本和常用对象的转换器。
9.效验
Struts1支持在ActionForm的validate方法中手动效验,或者通过CommonsValidator的扩展来效验。同一个类可以有不同的效验内容,但不能效验子对象。
Struts2支持通过validate方法和XWork效验框架进行效验。XWork效验框架使用为属性类类型定义的效验和内容效验,来支持Chain效验子属性。
10.Action执行的控制
Struts1支持每一个模块有单独的RequestProcessors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不能的生命周期。堆栈能够根据需要和不同的Action一起使用。
打开Struts2的开发模式
当修改了struts2配置文件一些信息时 就不需要重启应用程序:
<constantname=”struts.devMode” value=”true”></constant>
Struts1转换器
1.定义类实现一个转换器接口:Converter
2.在系统启动时注册转换器类(几种方法):
a.使用servlet的init方法中放入代码 需要在web.xml中配置一下<load-on-startup>1</load-on-start>
b.Filter的init方法
c.Application的监听器
加入注册代码:
ConvertUtils.register(new定义了实现Converter转换器接口的类,Date.class );
类如下:
缺点:单向转换-à只是从jsp到formBean,而从formBean到jsp显示数据没有调用转换方法。
Struts2转换器
1.
方式一:
a.实现TypeConverter接口或者继承DefaultTypeConverter类(此类实现了TypeConverter接口),然后重写自己的转换方法。
方式二:为了简化类型转换器的实现,Struts2提供了StrutsTypeConverter抽象类,这个抽象类是DefaultConverter的子类。实现了其方法,并提供了两个不同转换方向的方法:Object ConvertToString(Mapcontext,Class toClass)和StingconvertFromString(Map context, Object o).
2.
写好转换器类后 开始配置,在src下新建一个文件xwork-conversion.properties ,配置内容为:
java.util.Date= 转换器类的绝对路劲(完整类名)
Struts2系统转换器
错误处理:在配置文件中添加<result name=”inout”>error.jsp</result>