zoukankan      html  css  js  c++  java
  • 在Action 中访问web资源

    1、什么是web资源:

      HttpServletRequest,HttpSession,ServletContext等原生的Servlet API.

    2、为什么要访问web资源?

      B/S应用的Controller 中必然需要访问web资源:如域对象中读写属性,读取Cookie,获取realPath...

    3、如何访问?

      1、和Servlet API 解耦的方式:只能访问有限的Servlet API 对象,且只能访问有限的方法(读取请求的参数,读写域对象的属性,使Session对象失效等等)

        -->使用ActionContext:为了避免与Servlet API 耦合在一起,方便Action 做单元测试,Struts2对HttpServletRequest,HttpSession和ServletContext进行了封装,构造了三个Map对象来替代者三个对象,在Action中可以直接使用HttpServletRequest,HttpServletSession,ServletContext对应的Map对象来保存和读取数据。

          ActionContext是Action执行的上下文对象,在ActionConetxt中保存了Action执行所需要的所有对象,包括        parameters,request,session,application等等

          获取HttpSession对应的Map对象:--public Map getSession()

          获取ServletContext对应的Map对象:--public Map getApplication()

          获取请求参数对应的Map对象:--public Map getParameters()

         获取HttpServletRequest对应的Map对象:--publiic Object get(Object  Key):ActionContext类中没有提供类似getRequest()这样的方法来获取HttpServletRequest对应的Map对象。要得到HttpServletRequest对应的Map对象,可以通过get()方法 传递参数request的方法来实现。键:请求参数的名称,值:请求参数的值对应的字符串数组

         值得注意的是   1、getParameters 的返回值为在Map<String,Object>,而不是Map<String,String[]>

                2、parameters 这个Map只能读,而不能写入。如果写入,不会出错,但是也不起任何作用

        -->实现XxxAware接口:通过依赖注入的方式,实现对应的API的访问。实现AppcationAware接口,然后实现接口的方法后,就可以在Action中使用Appcation对应的Map对象了。其他的Aware接口还有ParametersAware、RequestAware、SessionAware等等接口

        --> 选用建议:如果在Action类中有多个Action方法使用了域对象的Map或Parameter,则推荐使用通过实现XxxAware接口的方式

        --> Session对应的Map 实际上是SessionMap类型的。强转后若调用其invalidate(),可以使其失效

      2、和Servlet API 耦合的方式:可以访问更多的Servlet API 对象,且可以调用其原生的方法。直接访问Serlvet API 将使Action和Servlet环境耦合在一起,测试时需要有Serlvet容器。不便于对于Action的单元测试

        -->使用ServletActionContext:

            1、直接获取HttpServletRequest对象:--ServletActionContext.getRquest()

            2、直接获取ServletSession对象: -- servletActionContext.getRequest().getSeesion()

            3、直接获取ServletContext对象:--servletActionContext.getServletContext()  

        -->实现ServletXxxAware接口:通过实现ServletRequestAware,ServletContextAware等接口的方式

      3、既然可以有非耦合的方式可以访问 Servlet API 了,为什么还需要耦合的方式来访问Serlvet API 呢?--因为,非耦合的方式只能访问Map,有时候需要访问原生的API,比如getRealPath(),这个方法只能通过访问原生的Servlet API 才能使用这个方法。

    4、关于Struts2请求的扩展名问题

      1、org.apache.struts2包下得default.properties中配置了Struts2应用中的一些常量;

      2、sturts.action.extension 定义了当前struts2应用可以接受请求的扩展名。

      3、可以在strust.xml 文件中以常量配置的方式修改 default.properties 所配置的常量。如:

      <constant name="struts.action.extension" value="action,do,"></constant>  这样的配置,可以将当前strust2应用的扩展名修改为可以接受以 .action,.do和没有后缀的所有请求。

    5、在手工完成字段的验证,显示错误信息,国际化等情况下,推荐继承 ActionSupport

    6、struts.xml中result:

      1、result是action节点的子节点;

      2、result 代表action 方法执行后,可能去的一个目的地;

      3、一个action 节点可以配置多个result 子节点;

      4、result 的name属性对应着action方法可能有的一个返回值

      5、reslut 共有两个属性,一个是name,另一个是type。该属性值在result-default包里的result-types节点的name属性中定义,默认的是dispatcher 转发,常用的四种 dispatcher 转发、redirect 重定向、redirectAction 重定向 Action 、chain 转发到一个Action 、Stream 文件下载

    7、通配符映射匹配:一个web应用可能有成千上百个action声明,可以利用struts2提供的通配符映射机制把多个彼此相似的映射关系简化为映射关系。通配符有以下几种映射关系:

      1、若找到多个匹配,没有通配符的那个将胜出。

      2、若指定的动作不存在,strust将会尝试吧这个URI与任何一个包含着通配符*的动作名及进行匹配

      3、被通配符匹配到的URI字符串的子串可以用{1}{2}...,{1}用来匹配第一个子串,{2}用来匹配第二个子串

      4、{0}匹配整个URI

      5、若struts找到的带有通配符的匹配不止一个,则按照先后顺序进行匹配

      6、* 可以匹配零个或多个字符,但不包括 / 字符 ,如果想把 / 字符包括在内,需要使用 ** ,如果需要对某个字符进行转义,需要使用

      

  • 相关阅读:
    搭建VueMint-ui框架
    vue项目创建
    jQuery选择器总结
    位运算
    Hash哈希
    并发编程(六)并发容器
    并发编程(五)AQS
    并发编程(四)显示锁
    Java中的几种代码块
    并发编程(三)原子操作CAS
  • 原文地址:https://www.cnblogs.com/hongcong/p/6155214.html
Copyright © 2011-2022 走看看