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对象,那么需要实现三个接口,太复杂。



相关文章
|
1月前
MyBatisPlus-标准数据层CRUD功能制作
MyBatisPlus-标准数据层CRUD功能制作
36 0
|
2天前
|
前端开发 Java 数据库
SpringMVC的架构有什么优势?——表单和数据校验(四)
SpringMVC的架构有什么优势?——表单和数据校验(四)
|
1月前
|
中间件
使用 Express 框架开发数据爬取及展示接口
使用 Express 框架开发数据爬取及展示接口
49 0
|
7月前
|
数据处理
构建高效响应数据:掌握R工具类,轻松驾驭Web开发世界!
构建高效响应数据:掌握R工具类,轻松驾驭Web开发世界!
38 0
|
10月前
|
数据采集 前端开发 JavaScript
Python爬虫实战:抽象包含Ajax动态内容的网页数据
Python爬虫实战:抽象包含Ajax动态内容的网页数据
|
10月前
|
JavaScript 前端开发 Java
SpringMVC 映射请求数据获取案例--模型数据
SpringMVC 映射请求数据获取案例--模型数据
68 0
|
11月前
|
JSON 前端开发 API
使用GraphQL优化前端数据获取
在现代前端开发中,数据获取是一个关键的环节。传统的REST API虽然简单易用,但在一些复杂的场景下可能会出现过度获取或不足获取数据的问题。为了解决这些问题,GraphQL应运而生。GraphQL是一种由Facebook开发的查询语言和运行时环境,它允许前端开发者明确指定需要的数据,并返回所需的精确数据,避免了传统REST API的缺陷。本文将深入探讨如何使用GraphQL优化前端数据获取,探讨GraphQL的优势以及如何在前端发起GraphQL查询。
|
XML SQL JSON
用Javascript自动分析数据 关键在于从不同数据源获取数据
数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,将它们加以汇总和理解并消化,以求最大化地开发数据的功能,发挥数据的作用。
285 0
用Javascript自动分析数据 关键在于从不同数据源获取数据
|
XML JSON JavaScript
Web阶段:第十九章:JSON格式
Web阶段:第十九章:JSON格式
180 0
Web阶段:第十九章:JSON格式
|
前端开发 数据处理
SpringMVC 数据处理
1.前端接收参数 接受前端传递的参数实例
94 0
SpringMVC 数据处理