1.action VS Action
  • action:代表一个Struts2的请求
  • Action:能够处理action请求的类
    • 属性名必须与JavaBeans属性名相同
    • 属性的类型可以是任意类型,从字符串到非字符串(基本数据类型)之间的转换可以自动发生
    • 必须有一个无参的构造器
  • 至少有一个供Struts在执行这个action时可以调用的方法
  • 同一个Action类可以拥有多个action方法
  • Struts2会为每一个HTTP请求创建一个Action实例,即Action不是单例的,是线程安全的。
2.通过Action请求访问web资源:
  1. 什么是web资源:
    • HttpRequest、HttpSession、ServletContext等原生Servlet API
  2. 为什么要访问web资源:
    • B\S模式的Controller应用程序中必然需要访问web资源:向域对象中读写属性、读写cookie、获取realPath... ...
  3. 如何访问web资源:
    • 与Servlet API解耦的方式访问:
      • 特点:只能访问有限的Servlet API,也只能调用有限的方法(读取请求参数、读取域对象的属性、使session失效...)
      • 实现方式:
        • 使用ActionContext
        • 实现XxxAware接口
      • 好处:为了防止与Servlet API耦合在一起,action方便做单元测试,Struts2对HttpRquest、HTTPSession、ServletContext进行了封装,构造了三个Map对象来替代这三个对象,可以直接使用其对应的Map对象来保存和读取数据
    • 与Servlet API耦合的方式访问:
      • 特点:可以访问更多的Servlet API,且能调用其原生的方法
      • 实现方式:
        • 使用ServletActionContext
        • 实现ServletXxxAware接口
3.通过ActionContext来访问web资源:
  1. 什么是ActionContext:
    • ActionContext是Action执行的上下文对象, 在ActionContext中保存了Action执行所需要的所有action对象,包括request、session、parameters、application等
  2. 访问web资源:
    • 获取ActionContext对象:ActionContext actionContext = ActionContext.getContext();
    • 通过map集合来获取application和session、request对象:
      • Map<String, Object> applicationMap = actionContext.getApplication();
      • Map<String, Object> sessionMap = actionContext.getSession();
      • Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
      3.获取请求参数对应的map,并获取指定的参数值:
    • Struts2.3:
      • Map<String,Object> parameters = actionContext.getParameters();
      • 打印结果:只打印Value
      • 注意:getParameters的返回值为Map<String,Object>而不是Map<String,String[]>
      • 注意:parameters只可以读不可以写,但是写的话不报错
    • Struts2.5:
      • Map<String, Parameter> parameters = actionContext.getParameters();
      • 打印结果:键值对都打印
      • 注意:parameters只可以读不可以写,写的话会报错
      • 注意:使用Map集合的值只可以为Parameter对象,不可以为Object
      • 注意:如果需要获取值,可以使用parameters.get(Key)获取
4.使用Aware来访问web资源:
  • Struts2.3:
    • 通过实现Aware接口,如applicationAware、requestAware、sessionAware、parametersAware接口
    • 定义私有的map集合
    • 在set方法中赋值即可
  • Struts2.5:
    • 与2.3唯一区别:在2.5版本中不支持使用ParameterAware接口,同样,不可以赋值
  • 注意:在Aware和ActionContext两种方式中,如果一个Action类中的多个action方法都需要使用域对象中的map或parameters,则建议使用Aware接口的方式
  • 注意:session实际上是sessionMap类型的!如果强转后调用其invalidate()方法,可以使session失效
5.通过耦合方式获取web资源:
  • 通过ServletActionContext来获取到当前Action 对象所需要用到的一切Servlet API相关的对象
    • 使用方式:
      • 获取 HttpServletRequest:ServletActionContext.getRequest();
      • 获取 HttpSession:ServletActionContext.getRequest().getSession();
      • 获取 ServletContext:ServletActionContext.getServletContext();
  • 通过实现ServletXxxWare接口的方式可以由Struts2注入Servlet 相关的对象
    • 使用方式
      • ServletRequestAware:注入HTTPServletRequest对象(比较常用)
      • ServletResponseAware:注入HttpServletResponse对象
      • ServletContextAware:注入HttpServletContext对象(比较常用)
6.Struts2扩展名问题:
  • 打开jar包struts2-core,找到org.apache.struts2 包下面的default.properties,打开后会找到关于struts扩展名的配置,其默认的扩展名为action或者为空 
  • 如何自定义扩展名:
    • 在struts2的配置文件中添加一个常量:
  • 注意:在给命名空间命名后,同一个package中的action跳转不需要带/xx
7.ActionSupport:
  • 概述:ActionSupport即为默认的Action类,若某个action节点没有配置class属性,则ActionSupport为待执行的Action类,execute为默认执行的方法
  • ActionSupport的五个常量;LOGIN、SUCCESSS、INPUT、ERROR、NONE
  • 继承ActionSupport类的好处:ActionSupport类帮我们实现了多个常用接口,而我们只需要继承这个类就可以调用这些接口中的方法
8.result:
  • 概述:
    • result是action节点的子节点,是一个action方法执行后,可能去的目标。
    • 一个action可以配置多个result
    • result的name属性值对应着action方法可能有的返回值
    • result一共有两个属性值:name和type,type代表结果的响应类型
      • type的值:红色为常用型
        • chain:转发到action
        • dispatcher:默认值
        • freemarker:
        • httpheader:
        • redirect:重定向
        • redirectAction:重定向到action
        • stream:主要是文件的上传和下载
        • velocity:
        • xslt:
        • plainText:
        • postback:
        • 注意:重定向到action的时候,可以直接使用redirect便捷的重定向到action,但是转发的时候只能使用chain
        • 注意:在重定向到一个action时,且该action返回值为'success'时,其返回值最好不要为“success”,即不要重复
9.通配符映射:
  • 概念:一个web工程可能有多个action声明,为了减少重复配置的问题,可以使用Struts2提供的通配符映射机制,将多个相似的映射关系简化为一个
  • 通配符映射规则:
    • 若找到多个匹配,则有精确匹配先映射精确匹配
    • 若指定action不存在,则通配符会将其与任意一个包含通配符*的action进行匹配
    • {0}表示匹配整个URI
    • 若struts2找到的带有通配符的匹配不止一个,则按先后顺序执行
    • *可以匹配零个至多个字符,但不能匹配“/”,若有需要则使用**表示,使用“\”进行转义
10.动态方法调用:
  • 概念:通过URL动态的调用方法而忽略配置文件中的方法配置
  • 调用方法:
    • 找到struts-core中的org.apache.struts包下面的default.properties,找到搜索Dynamic,找到
      并复制
    • 在struts.xml文件中使用constant配置:
    • 在.action之前通过action名!方法名进行调用:Product!save.action
  • 注意:此写法会暴露所调用方法,存在安全隐患,在2.3以后版本已不支持,此处仅做了解
 

02_Action的更多相关文章

随机推荐

  1. 基于哈夫曼编码的文件压缩(c++版)

    本博客由Rcchio原创 我了解到很多压缩文件的程序是基于哈夫曼编码来实现的,所以产生了自己用哈夫曼编码写一个压缩软件的想法,经过查阅资料和自己的思考,我用c++语言写出了该程序,并通过这篇文章来记录 ...

  2. geotrellis使用(三十七)COG 基础介绍

    前言 Geotrellis 已经迭代到了 2.0 版本(截止写作此文时为 2.0.0-SNAPSHOT 版),2.0 版多了很多新的特性,其中最重要的应该就是 COG,COG 是什么鬼?刚看到时我也是 ...

  3. POJ-3169 Layout---差分约束系统+Bellman

    题目链接: https://vjudge.net/problem/POJ-3169 题目大意: 一些母牛按序号排成一条直线.有两种要求,A和B距离不得超过X,还有一种是C和D距离不得少于Y,问可能的最 ...

  4. cookie的实现原理

    cookie技术通过在请求和响应报文中写入cookie信息来控制客户点的状态 cookie会根据从服务器端发送的响应报文内的一个叫做set-cookie的首部字段信息,通知客户端保存cookie 当下 ...

  5. [LeetCode] Number of Distinct Islands II 不同岛屿的个数之二

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  6. Python的基础学习(第二周)

    模块初始 sys模块 import sys sys.path #打印环境变量 sys.argv#打印该文件路径 #注意:该文件名字不能跟导入模块名字相同 os模块 import os cmd_res ...

  7. 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

  8. dnslog搭建

    为什么想重写这个呢,想说后面扫描ssrf和命令执行的时候,能快速改成自己想要的api,更容易修改一些. 工具改自:https://github.com/bugScanTeam/DNSLog 需要两个域 ...

  9. Office 365 应用开发的 .NET Core 模板库

    概述 前不久我写过一篇文章拥抱开源,Office 365开发迎来新时代,给大家介绍了Office 365开发的典型场景是如何支持开源平台的:Office 365通过Microsoft Graph,以R ...

  10. [HNOI 2013]数列

    Description 题库链接 给你四个数 \(N,K,M,P\) ,让你生成一段长度为 \(K\) 严格单调递增序列,并且满足: 第一位可以为任意元素: 相邻两位的差值不超过 \(M\) : 序列 ...