Struts2的ServletAPI的获取和各种类型的数据获取(三)上

简介: Struts2的ServletAPI的获取和各种类型的数据获取(三)

Struts2是web层框架,主要有两个方面的作用:


1 . 获取前端的客户端输入


2 . 响应后端输出


常常使用到 Servlet API 中相应的方法。


通常有以下三种方式获取 request,response,session,application 对象信息。


1 . Action 通过 ActionContext() 类访问Servlet API


2 . Action 通过实现 XxxAware 接口直接访问 Servlet API


3 . 使用 ServletActionContext 直接访问 Servlet API


所有的Struts2 文章,都已经在web.xml 中添加了StrutsPrepareAndExecuteFilter 过滤器


<!-- 配置struts2的过滤器 -->
<filter>
      <filter-name>struts</filter-name>
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
      <filter-name>struts</filter-name>
      <url-pattern>/*</url-pattern>
</filter-mapping>


一. 获取Servlet API 对象


一.一 通过 ActionContext() 类访问 Servlet API


一.一.一 ActionContext 类的主要方法


image.png


一.一.二 写Demo验证一下


一.一.二.一 编写Action 类 ActionContextDemo


  public class ActionContextDemo extends ActionSupport{
  private static final long serialVersionUID = 1L;
  // 前端传入一个参数 为 name 
  private String name;
  /*
   * 通过此方法,展示一下,将数据放置到 request域,session域,application域的用法。
   * */
  public String showData(){
    ActionContext actionContext=ActionContext.getContext();
    //获取 application 作用域
    Map<String, Object> applicationData=actionContext.getApplication();
    //获取application的值
    Integer count=(Integer)applicationData.get("count");
    if(count==null){  
      count=1;
    }else{
      count=count+1;
    }
    //设置application的值
    applicationData.put("count", count);
    //获取session 作用域
    Map<String,Object> sessionData=actionContext.getSession();
    //放置到session域 
    sessionData.put("loginName",name);
    if("两个蝴蝶飞".equals(sessionData.get("loginName"))){
      //放置到request域
      actionContext.put("msg","第一种方式 :欢迎您,"+sessionData.get("loginName"));
      //返回success 
      return SUCCESS;
    }
    //放置到request域
    actionContext.put("msg","服务器提示:登录失败");
    return ERROR;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}


一.一.二.二 配置 struts.xml 文件


  <package name="hello" extends="struts-default" namespace="/">
    <!-- 配置第一种方式 -->
    <action name="actionContextDemo" class="com.yjl.web.action.ActionContextDemo"
    method="showData">
      <result name="success">/WEB-INF/content/success1.jsp</result>
      <result name="error">/WEB-INF/content/error.jsp</result>
    </action>
  </package> 


一.一.二.三 编写前端文件


success1.jsp 里面的内容为:


<body>
  本站访问次数:${applicationScope.count} <br/>
  ${sessionScope.loginName},您已经成功登录<br/>
  ${requestScope.msg}<br/>
</body>


error.jsp 里面的内容为:

20200412122017466.png

<body>
  ${requestScope.msg}<br/>
</body>


一.一.二.四 重启服务器,进行验证


当输入网址为: http://localhost:8080/Struts_API/actionContextDemo 时,没有name值,提示登录失败


20200412122017466.png


当输入网址为: http://localhost:8080/Struts_API/actionContextDemo?name=两个蝴蝶飞,name正确,提示登录成功


20200412122021415.png


当输入网址为: http://localhost:8080/Struts_API/actionContextDemo?name=老蝴蝶,name值错误,提示登录失败


20200412122026867.png


可以正常的传输数据。


这种方式,只能往request,session和applicaiton中进行存数据,取数据,只能对数据进行维护,不能像真正的request,response对象提供的那些方法一样强大。 如获取客户端ip,添加cookie 等, 用这种方法就无法实现了。


一.二 通过实现XxxAware 接口实现Servlet API 对象


Struts2针对Servlet 的API 对象,提供了三种接口, HttpServletRequestAware 接口,HttpServletResponseAware接口, ServletContextAware 接口。 其中,session对象可以通过request对象进行获取,所以就没有提供关于session的接口。


一.二.一 XxxAware 接口提供的方法


ServletRequestAware 接口提供了一个 setServletRequest() 方法,用于获取request对象


public abstract interface ServletRequestAware
{
  public abstract void setServletRequest(HttpServletRequest paramHttpServletRequest);
}


ServletResponseAware 接口提供了一个 setServletResponse() 方法,用于获取response对象


public abstract interface ServletResponseAware
{
  public abstract void setServletResponse(HttpServletResponse paramHttpServletResponse);
}


ServletContextAware 接口提供了一个 setServletContext()方法,用于获取application对象


public abstract interface ServletContextAware
{
  public abstract void setServletContext(ServletContext paramServletContext);
}


一.二.二 写Demo验证一下


一.二.二.一 编写Action 类 AwareDemo


  public class AwareDemo extends ActionSupport 
implements ServletRequestAware,ServletResponseAware,ServletContextAware{
  private static final long serialVersionUID = 1L;
  private String name;
  //接收 application
  private ServletContext application;
  //接收request
  private HttpServletRequest request;
  //接收response
  private HttpServletResponse response;
  //session可以通过 request 进行获取
  private HttpSession session;
  @Override
  public void setServletContext(ServletContext application) {
    this.application=application;
  }
  @Override
  public void setServletResponse(HttpServletResponse response) {
    this.response=response;
  }
  @Override
  public void setServletRequest(HttpServletRequest request) {
    this.request=request;
    this.session=request.getSession();
  }
  public String showData(){
    //获取application的值
    Integer count=(Integer)application.getAttribute("count"); 
    if(count==null){  
      count=1;
    }else{
      count=count+1;
    }
    //设置application的值
    application.setAttribute("count",count);
    //放置到session域 
    session.setAttribute("loginName",name);
    if("两个蝴蝶飞".equals(session.getAttribute("loginName"))){
      //放置到request域
      request.setAttribute("msg","第二种方式:欢迎您,"+session.getAttribute("loginName"));
      //展示ip 地址
      request.setAttribute("ip",request.getLocalAddr());
      //通过response 对象,设置cookie 
      Cookie cookie=null;
      try {
        cookie = new Cookie("userName",
            URLEncoder.encode(session.getAttribute("loginName").toString(),"UTF-8"));
      } catch (UnsupportedEncodingException e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
      }
      cookie.setMaxAge(60*60);
      cookie.setPath("/");
      response.addCookie(cookie);
      //返回success 
      return SUCCESS;
    }
    //放置到request域
    request.setAttribute("msg","服务器提示:登录失败");
    return ERROR;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}


里面多提供了 request获取客户端ip和 response添加 cookie的操作


一.二.二.二 配置struts.xml 文件


<!-- 配置第二种方式 -->
<action name="awareDemo" class="com.yjl.web.action.AwareDemo"
method="showData">
  <result name="success">/WEB-INF/content/success2.jsp</result>
  <result name="error">/WEB-INF/content/error.jsp</result>
</action>


一.二.二.三 编写前端界面


success2.jsp, 内容主要是:


<!--引入jquery文件,网络版的 -->
<script src="http://code.jquery.com/jquery-latest.js"></script>
<body>
  本站访问次数:${applicationScope.count} <br/>
  ${sessionScope.loginName},您已经成功登录<br/>
  ${requestScope.msg}<br/>
  ip:${requestScope.ip}<br/>
  cookie值:<span id="cookieValue"></span>
  <script>
    $(function(){
      var username = decodeURIComponent("${cookie.userName.value}");//如果为空,使用解码后为空字符串
      if(!username.length==0){
        $("#cookieValue").text(username);
      }
    })
  </script>
</body> 


一.二.二.四 重启服务器,进行验证


输入网址: http://localhost:8080/Struts_API/awareDemo?name=两个蝴蝶飞


20200412122042966.png


ip地址和cookie 均可以正常获取。


用js 脚本,解决了 cookie 中文乱码的问题。


这种方式,还需要实现接口,重写里面的方法,如果需要同时获取request,response,application对象,那么需要实现三个接口,太复杂。



相关文章
|
JSON 前端开发 JavaScript
前端上传文件前校验文件数据
该文介绍了如何在Vue项目中实现批量导入Excel数据的校验。使用Element UI的`el-upload`组件上传文件,通过FileReader读取内容,结合XLSX库解析Excel为JSON。解析过程包括将二进制数据转换为workbook对象,提取worksheet并转化为JSON。之后,遍历JSON数据进行字段校验,若发现空值则记录错误。提供的Demo展示了选择Excel文件后控制台显示校验结果。技术栈包括vue 2.6.14、element ui 2.15.14和xlsx 0.17.0。建议将此类功能封装为通用组件以复用。
517 2
前端上传文件前校验文件数据
WK
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
510 5
|
Prometheus Kubernetes Cloud Native
Kruise Rollout:灵活可插拔的渐进式发布框架
Kruise Rollout 是 OpenKruise 社区开源的渐进式交付框架。Kruise Rollout 支持配合流量和实例灰度的金丝雀发布、蓝绿发布、A/B Testing 发布,以及发布过程能够基于 Prometheus Metrics 指标自动化分批与暂停,并提供旁路的无感对接、兼容已有的多种工作负载(Deployment、CloneSet、DaemonSet)。近期也在《2022 开放原子全球开源峰会》上面做了主题分享,以下是主要内容。
Kruise Rollout:灵活可插拔的渐进式发布框架
|
缓存 运维 Linux
保姆级python项目离线部署服务器教程只需这一篇就够了(建议收藏)
这篇文章提供了详尽的Python项目在离线Linux(CentOS)服务器上的部署教程。作者首先介绍了环境背景,强调了无网络环境和使用有网络的CentOS虚拟机准备安装包的重要性。教程分为两部分:外网环境搭建和内网离线安装。在外网环境中,包括下载Python 3.9.0安装包、传输至服务器、安装依赖包,并使用pip3下载项目所需依赖。内网安装则涉及依赖包的复制和Python环境的同样步骤。最后,作者分享了运行项目的命令,并总结了离线安装的整个流程,提醒读者注意可能出现的问题。
保姆级python项目离线部署服务器教程只需这一篇就够了(建议收藏)
|
NoSQL 前端开发 Redis
Flask+Redis实现登录权限管理
Flask+Redis实现登录权限管理
429 0
|
人工智能 Rust 前端开发
2023编程语言趋势
Python持续霸榜,PHP依旧颓势,Java雄风不再,Rust热度不减,汇编迅速崛起,C语言地位稳固
597 0
2023编程语言趋势
servlet文件下载及上传
servlet文件下载及上传
257 0
|
JavaScript
事件监听 & 页面滚动(页面滚动到某一位置时显示/隐藏某元素,Vue环境)
事件监听 & 页面滚动(页面滚动到某一位置时显示/隐藏某元素,Vue环境)
1759 0
事件监听 & 页面滚动(页面滚动到某一位置时显示/隐藏某元素,Vue环境)
|
物联网 运维 监控
物联网平台OTA固件升级使用说明
物联网平台设备端OTA升级操作步骤
3904 0
物联网平台OTA固件升级使用说明