一:Struts2和Struts1 的比较 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;
线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。 Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
Servlet依赖方面的对比:Struts 1 Action依赖于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。 Struts 2 Action不再依赖于Servlet API,从而允许Action脱离Web容器运行,从而降低了测试Action的难度。
封装请求参数的对比:Struts 1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承一个基类:ActionForm。 Struts 2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐,
Action执行控制的对比:Struts 1支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。 Struts 2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。开发者可以根据需要创建相应堆栈, 从而和不同的Action一起使用。
二:#,%,$三种符号的使用 # 的三种用法 1. 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性: parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameter("id") request 包含当前HttpServletRequest的属性(attribute)的Map #request.userName相当于request.getAttribute("userName") session 包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute("userName") application 包含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute("userName") attr 用于按request > session > application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止 2. 用于过滤和投影(projecting)集合,如books.{?#this.price<100}; 对于集合元素,ognl表达式可以使用in和not in来判断某个元素是否在指定的元素集合中,如 <s:if test=" 'a' in {'a','b'.'c'}"> or <s:if test=" 'a' not in {'a','b'.'c'}"> 除了in和not in,此外还允许使用某个规则来获得集合对象的子集,常用的有如下3个操作符: ?:获得所有符合逻辑的元素 ^:获得符合逻辑的第一个元素 $:获得符合逻辑的最后一个元素 如:<s:iterator value="persons.{?#this.age > 25}">,获取集合persons中age>25的子集合再做遍历。
3. 构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。 %的用法 %符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。 构造Map: <s:set name="person" value="#{'name':'zxx','age':21}" /> <p>The value of key "foo1″ is <s:property value="#person['name']" /></p> <p>不使用%:<s:url value="#person['name']" /></p> <p>使用%:<s:url value="%{#person['name']}" /></p>
<p>不使用%:<s:property value="#person['name']" /></p> <p>使用%:<s:property value="%{#person['name']}" /></p>
结果显示为: The value of key "foo1″ is zxx 不使用%:#person['name'] 使用%:zxx 不使用%:zxx 使用%:zxx 可以看出:<s:property>比<s:url>要强悍很多
三:Struts2 国际化 国际化文件命名格式:名称_语言代码_国家代码.Properties 比如在src下建立globalMessages_zh.properties. 编辑globalMessages_zh.properties文件label.title=hello,world
在struts.properties 文件中加入这句话 struts.custom.i18n.resources=globalMessages 或者直接在struts.xml中加入 <constant name="struts.custom.i18n.resources" value="globalMessages"></constant> jsp 中访问:<s:text name="label.title"/>
四:Struts2 IOC 1. Struts 2会为每一个请求创建一个Action对象,所以在定义Action时,使用scope="prototype"。 这样Spring就会每次都返回一个新的Action对象了;
2. 因为ServiceImpl被配置为默认的scope(也即是singleton,唯一的),所以在实现时应保证其线程安全.
