• 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

  • 相关阅读:
    微信小程序登录
    cURL error 60: SSL certificate problem: unable to get local issuer certificate 报错解决
    MyBatis学习之一----基础了解
    web工程和java工程的区别
    StringUtils的实用功能
    SpringMVC-----部分功能学习
    SpringMVC之国际化
    SpringMVC
    web.xml配置详解
    Hibernate学习-----遇到的相关问题
  • 原文地址:https://www.cnblogs.com/wanjn/p/7396071.html
Copyright © 2020-2023  润新知