Struts 2 学习笔记

    技术2025-10-24  16

    一: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,唯一的),所以在实现时应保证其线程安全.

     

    最新回复(0)