Struts2学习笔记 - Part.02

================Struts2的国际化================
程序国际化:
  程序可以根据极其所在的国家、语言环境,自动显示当前国家、语言的内容
国际化的本质是:查找、替换
国际化的步骤:
  (1)为不同的国家、语言环境提供资源包;
  如果你的国际化语言资源包中有非西欧的字符,要使用native2ascli命令处理该文件;
  (2)在程序中输出的国际化的消息key;
Struts2的国际化:
    (1).支持模块化加载;
    (2).Struts2支持自动加载国际化资源
  1.JSP页面的国际化:
    A.需要手动加载国际化消息:
    使用<s:i18n .../>;
    B.在页面使用<s:text .../>根据key来输出国际化消息:
    如果是表单标签,直接使用key来指定国际化消息的key;
  2.Action的国际化:
    A.自动加载国际化消息
    让国际化消息的baseName与Action的类名相同(Login_zh_CN.properties),而且放在同一个目录下
    B.在Action类中调用getText()(可传入参数,类似{1}替换(*)方法,必须为数组)方法来加载国际化消息;
  3.包范围的国际化:
    A.自动加载国际化消息
    让国际化消息的baseName与package(不是与包名相同),而且放在同该包的目录下面
    可以让该包下面的所有Action共享同一个国际化资源文件;
    B.在Action类中调用getText()方法来加载国际化消息;
  4.全局国际化资源文件:
    A.通过一个struts.custom.i18n.resources常量来加载国际化资源;
    B.全局国际化资源文件,即可被Action访问,也可以被JSP页面访问;

  /***************************************
  Action接口与ActionSupport实现类:
  ActionSupport实现 Action接口。
  而且增加了校验支持、国际化支持等功能;
  ***************************************/

Struts2的异常处理:
  传统的web编程的异常模式:
  try
  {
  业务代码;
  }
  catch(XxxException xe)
  {
  Forward("/a.jsp");
  }
  ...

  对于Action的处理方法而言,处理结果可能出现如下情况:
    1.正常执行结束,会返回一个String类型的逻辑视图;
     对于String类型的逻辑试图,使用<result name="逻辑视图名">物理视图资源</result>
    2.遇到异常,返回一个异常对象:
     <exception-mapping exception="异常类" result="逻辑视图名"/>
  Struts2的异常配置的本质:
    为不同的异常类,“起一个”逻辑视图名;
  Struts设计的处理方法完全不需要处理任何异常,它可以声明抛出任意的异常;并显示异常提示;

Java领域的MVC框架:
  - 主要实现控制器。(StrutsPrepareAndExecuteFiter + Action)
  - 提供大量标签库,可以简化View的开发。

==================OGNL表达式==================
    回顾JSP 2 EL - 做数据访问的工具,并不是编程语言,因此必然简单;
    EL提供了11个内置对象:
    pgeContext pageScope requestScope sessionScope applicationScope
    param paramValues header headerValues cookie initParam(获取Web应用的配置参数)

  OGNL
    既然要访问数据库,必然有个东西装数据:
      OGNL的装数据的东西叫"Stack Context(OGNL Context)"
      --可以理解它相当于一个Map
  1.它里面的每个对象,都应该有个名字,根据名字来访问:
      #对象名
    假如OGNL Context中有3个对象:foo、bar、test
      #bar.abc - 访问bar对象的getAbc()返回值;
      #test.xyz.abc.def - 访问test对象的getXyz().getAbc().getDef()
  2.OGNL Context中有个根(root)对象:
    如果我们要访问根(root)对象的属性,可以省略对象名
    假如OGNL Context中有3个对象:foo、bar、test,但bar是根对象
      abc.xyz.def - 访问bar.getAbc().getXyz().getDef()

  /******************context map******************

          |--application
          |--session
          |--value stack(root)
  context map--- |--action (the current action)
          |--request
          |--parameters
          |--attr (searches page, request, session, then application scopes)

  Stack Context(OGNL Context/Context Map/Action Context)

  ValueStack

  Stack Context中包含了ValueStack(根对象)

  ************************************************/
  3.OGNL可以直接创建List对象:{ele1,ele2,ele3,ele3 ....}
  4.OGNL可以直接创建Map对象:#{key1:value1,key2:value2,key3:value3...}
  5.OGNL还可以直接获取"子集合"
      person.cats.{?#this.age>2} - 获取person所养的猫中age大于2的所有猫;
      person.cats.{^#this.age>2} - 获取person所养的猫中age大于2的第一个猫;
      person.cats.{$#this.age>2} - 获取person所养的猫中age大于2的最后一个猫;
  6.OGNL还可以直接调用静态成员:
    - 需要将struts.ognl.allowStaticMethodAccess常量设置为true才可
      类名@静态Field
      类名@静态方法(参数值)

 OGNL标签库:

  【参见Struts2官方API】

  控制标签:
    if/elseif/else -模拟流程控制的分支
    iterator -模拟流程控制的迭代
    append/merge - 把两个或N个已有的集合合并成新的集合
    merge - 分割出集合
    sort - 对集合元素排序,需要指定一个Comparator
    subset - 截取子集合
  数据标签:
    set - 设置变量值:var指定变量名字,value指定变量值,scope指定范围
    bean - 创建一个Bean对象:var指定对象名(Stack Context中),name指定实现类
    debug - 帮助调试,可以让开发者观察ValueStack以及Stack Context中的数据
    i18n - 为指定页面加载国际化资源文件,name指定国际化资源包的baseName
    text - 输出国际化消息,也通过name指定国际化消息的key
    property - 输出表达式的值,通过value属性来指定表达式,
          如果没有指定value属性,将直接暑促ValueStack栈顶的元素
    action - 可以直接在页面上调用指定Action,
         可以直接把Action的处理结果包含到本页面中
      name和namespace确定调用哪个Action
      var:指定将被调用的Action放入Stack Context(官方文档是错误的)
     * executeResult:指定是否把被调Action的处理结果完全包含到当前页面中
     * ignoreContextParams:控制当前页面请求参数,是否传入被调的Action
        功能是比较有用的:假如进入到一个添加用户的页面:
        用户名: □□□□□□□
        密码: □□□□□□□
        性别: □□□□□□□ <s:action var="genders" "name=listGender"/>
        学历: -下拉列表- 来自于系统的数据库中的数据
        籍贯: -下拉列表-<s:action var="jiguans" name="listJiguans"/>
    date - 对日期进行格式化输出
      name:指定要格式化输出的日期
      format:格式化字符串
      nice:输出该日期与当前日期的时间差
    include - 用于包含指定的JSP页面
    param - 用于设置参数
    push - 把表达式的值放入ValueStack的栈顶(可以方便直接获取栈顶元素,因此性能更好)
      当我们的对象所在的对象图”很深“时,可以将该对象”推入“ValueStack的栈顶

 

posted on 2014-11-12 22:16  小忙  阅读(155)  评论(0编辑  收藏  举报

导航