zoukankan      html  css  js  c++  java
  • struts2 的学习

      1.struts.xml 中的action不是代表一个action类(控制器),而是代表一次访问,所以action的name属性和访问路径有关。配置文件中的package的namespace属性其实就是起到窄化请求的作用,将相同类型的请求,配置在一起,方便维护

      2.访问路径理解:先找到namespace为XXX的package,再找到name为XXX的action,再找到该action对应的具体action类,再找到该类对应的具体的方,执行返回数据

        即浏览器上访问的地址为http://localhost:8080/项目名/package namespace/action Name.这个时候就已经能够调用action了。再根据action上配置的method,调用action的对应方法。package的name属性起到标识和继承的作用

      3.struts 的action是多例的,这个spring的Controller是不同的

      4.struts 获取值的方式:

        1)属性驱动:需要在action中根据需要添加与页面对应的属性,并提供属性对应的set方法,(不必提供get方法),适用于属性比较少的

        2)模型驱动,侵入式开发:Action类需要实现ModelDriven接口,重写getModel()方法,并且需要提供一个封装了页面数据(按需求封装即可)的模型对象(dto),在action中作为属性并创建对象,在getModel()方法中返回

        3)域驱动:封装的页面数据对象作为action的属性(不用创建对象),并提供set/get方法。

            这时页面的控件的name属性值要求为:

                a.如果属性为对象,比如 private User user,那么页面name为user.name。

                b.如果属性为list类型,比如 private List<User> users,那么页面name为user[0].name。user[0]表示list中的第一个User对象

                c.如果 属性为map类型,比如private Map<String,USer> userMap,那么页面name为userMap['first'].name。userMap['first']表示map中key为fitst的value(这里是User)对象

        经过测试:三种取值的方式可以混用。其中如果模型驱动有属性和属性驱动的属性相同,那么模型驱动中能够取到值,属性驱动取不到值为null。(域驱动不存在这个问题,因为页面的name值有特殊要求)

      5.类型转换相关

        1)struts2里面已经内置了一些转换器,负责完成String到基本类型的类型转换,比如:

          基本数据类型的转换;本地格式的日期类型(yyyy-MM-dd)——> Date;把值是String[]类型的数据转换成用逗号隔开的字符串

        2)如果struts2提供的转换器不满足需求,比如日期格式为dd-MM-yyyy那么转换就会出错,这个时候需求自定义转换器,并将自定义的转换器配置到框架使其起作用。如何自定义转换器参见链接:http://www.jb51.net/article/35465.htm。推荐使用继承StrutsTypeConverter的方式,因为双向转换分为俩个方法,不用自己判断更加清晰。

       6.配置相关

        1)虽然配置文件中有全局的配置,但是要起到全局的作用,依然是要通过package的继承达到效果的。如果不继承不会对该package起作用      

        2)这个配置 <exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping>只适用于对action发送的指定异常跳转到对应页面。不支持配置的异常之外的异常,以及404异常。

        3)只是用来继承的package可以省略namespace属性即默认为“”,就是说项目名 / 这里可以是任意内容 / action name,只要action name存在就能访问到,不存在当然报错

        4)package的继承和java的基础很像即:通过使用extends,你可以指定本package继承另外一个package的所有的配置。当某个package继承了另外一个package的所有配置,那么你就无需对父package中已经声明过的配置定义做再次的定义。同时,如果重复定义父package中已声明过的配置定义,那么这些重复定义声明将覆盖父package中的相关定义。

        5)default-action-ref配置和package的namespace有关,意思是访问该namespace下的action 的name不存在时,调用该配置配置中的action。可以通过在父包中添加该配置以及一个通用的action配置,为每个namespace提供跳转到404页面的功能(这些是要基于理解包继承的概念的前提下去理解的)

        6)default-class-ref配置,是在有的action 只配置了name,和method的时候起作用,为这种配置的action配置上默认的对应的action类

      7.struts 获取原生的servlet api(request,session,application)的方法

        1)struts对底层servlet api做了包装,这点可以从数据类型看出来,比如struts的包装后的对象均是Map数据类型,而servlet原生的为HttpServletRequest,HttpSession,ServletContext

        2)获取的方式为:

                                 struts(包装 Map 类型)          servlet(原生)
    request
    ActionContext ac =  ActionContext.getContext():即ActionContext对象

    HttpServletRequest req=ServletActionContext.getRequest()
    session                                               ac.getSession()                        req.getSession()
    application                                              ac.getApplication                        req.getServletContext()

    如上所示,获取的方式不止列出的方法

    具体ActionContext和ServletActiveContext的区别参考链接:http://www.cnblogs.com/x_wukong/p/3887737.html

  • 相关阅读:
    帝国 标签模板 使用程序代码 去除html标记 并 截取字符串
    iis6 伪静态 iis配置方法 【图解】
    您来自的链接不存在 帝国CMS
    帝国cms Warning: Cannot modify header information headers already sent by...错误【解决方法】
    .fr域名注册 51元注册.fr域名
    帝国网站管理系统 恢复栏目目录 建立目录不成功!请检查目录权限 Godaddy Windows 主机
    星外虚拟主机管理平台 开通数据库 出现Microsoft OLE DB Provider for SQL Server 错误 '8004' 从字符串向 datetime 转换失败
    ASP.NET 自定义控件学习研究
    CSS层叠样式表之CSS解析机制的优先级
    ASP.NET程序员工作面试网络收藏夹
  • 原文地址:https://www.cnblogs.com/wanjn/p/7396071.html
Copyright © 2011-2022 走看看