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天前
|
存储 数据管理 数据处理
ArkUI常用数据处理:掌握Map操作与动态数据管理
在HarmonyOS应用开发中,ArkUI框架提供了丰富的数据处理能力,特别是对Map这类非线性容器的操作。本文详细介绍了ArkUI中Map的基本概念、操作方法及其在实际开发中的应用,包括数据存储、快速检索和动态更新。通过示例代码展示了HashMap、HashSet和TreeMap的使用,以及如何结合异步数据处理和状态管理提升应用性能和用户体验。
101 2
|
3月前
|
API 开发者 Python
"FastAPI路由大揭秘!轻松玩转URL映射,让你的Web应用路由设计既RESTful又灵活多变,秒杀传统框架的秘籍在这里!"
【8月更文挑战第31天】在Web开发中,路由是连接用户请求与后端逻辑的关键。FastAPI作为现代Python Web框架的佼佼者,以其简洁的API设计和高性能,提供了高度灵活的路由系统。本文通过开发一个博客系统的案例,详细介绍了FastAPI中路由的实现方法,包括基础路由定义、参数类型验证及路由分组与嵌套等,展示了如何轻松构建RESTful风格的URL映射,提升应用的可维护性和扩展性。
69 2
|
3月前
|
数据采集 XML C#
C#简化工作之实现网页爬虫获取数据
C#简化工作之实现网页爬虫获取数据
48 1
|
3月前
|
数据采集 前端开发 开发者
Angular表单控件详解:掌握模板驱动与响应式表单的精髓,让Web应用中的数据采集工作变得高效又简单,彻底告别繁琐的表单处理流程
【8月更文挑战第31天】表单是 Web 应用的关键组件,用于用户登录、注册及信息提交。Angular 作为成熟前端框架,提供了强大的表单处理功能,包括模板驱动与响应式表单。本文通过技术博客形式,详细介绍这两种表单控件,并提供示例代码,展示如何利用它们简化表单处理流程,提高开发效率。首先介绍简单的模板驱动表单,然后讲解基于 RxJS 的响应式表单,适用于复杂逻辑。通过本文,你将学会如何高效地使用 Angular 表单控件,提升应用的用户体验。
32 0
|
4月前
|
JSON 数据格式
MysbatisPlus-核心功能-IService开发基础业务接口,MysbatisPlus_Restful风格,新增@RequestBody指定是为了接收Json数据的,使用swagger必须注解
MysbatisPlus-核心功能-IService开发基础业务接口,MysbatisPlus_Restful风格,新增@RequestBody指定是为了接收Json数据的,使用swagger必须注解
|
12月前
|
数据处理
构建高效响应数据:掌握R工具类,轻松驾驭Web开发世界!
构建高效响应数据:掌握R工具类,轻松驾驭Web开发世界!
49 0
|
数据采集 前端开发 JavaScript
Python爬虫实战:抽象包含Ajax动态内容的网页数据
Python爬虫实战:抽象包含Ajax动态内容的网页数据
|
JavaScript 前端开发 Java
SpringMVC 映射请求数据获取案例--模型数据
SpringMVC 映射请求数据获取案例--模型数据
86 0
|
XML JSON 缓存
API接口的劣势形式
在数字化时代,API接口已成为软件开发和应用程序集成的普遍实践
280 0
|
XML JSON JavaScript
Web阶段:第十九章:JSON格式
Web阶段:第十九章:JSON格式
202 0
Web阶段:第十九章:JSON格式