栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Struts2访问Servlet的三种方式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Struts2访问Servlet的三种方式

基本介绍

在Struts2中,Action并没有直接和Servlet API耦合。虽然Struts2 中的Action访问Servlet API麻烦一些,但是这却是Struts2中Action的重要改良之一,方便Action进行单元测试。

尽管Action和Servlet API解耦会带来很多好处,然而在Action中完全不访问Servlet API几乎是不可能的,在实现业务逻辑时,经常要访问Servlet中的对象,如request、session和application等 。

在Struts2中,访问Servlet API有3种方法,分别是实现特定接口,通过ServletActionContext类,通过ActionContext类。

思维导图

实现特定接口访问

package com.pc.web.action; 
import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.apache.struts2.interceptor.ServletRequestAware; 
import org.apache.struts2.interceptor.ServletResponseAware; 
import org.apache.struts2.util.ServletContextAware; 
 
import com.opensymphony.xwork2.ActionSupport; 
 
 
public class ActionTest7 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware { 
 
  private HttpServletRequest request; 
  private HttpServletResponse response; 
  private ServletContext application; 
 
   
  public String demo(){ 
    System.out.println(request); 
    System.out.println(response); 
    System.out.println(application); 
    System.out.println(request.getSession()); 
    return SUCCESS; 
  } 
 
  @Override 
  public void setServletRequest(HttpServletRequest request) { 
    this.request = request; 
  } 
 
  @Override 
  public void setServletResponse(HttpServletResponse response) { 
    this.response = response; 
  } 
 
  @Override 
  public void setServletContext(ServletContext application) { 
    this.application = application; 
  } 
} 

通过ServletActionContext类

package com.pc.struts2.web.action;  
import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
 
import org.apache.struts2.ServletActionContext; 
 
import com.opensymphony.xwork2.ActionSupport; 
 
public class ActionAPITest extends ActionSupport { 
   
  public String useServletAPI() { 
    HttpServletRequest request = ServletActionContext.getRequest(); 
    HttpServletResponse response = ServletActionContext.getResponse(); 
    HttpSession session = request.getSession(); 
    ServletContext application = ServletActionContext.getServletContext(); 
    System.out.println(request); 
    System.out.println(response); 
    System.out.println(session); 
    System.out.println(application); 
    return "success"; 
  } 
} 

通过ActionContext类

package com.pc.web.action;  
import java.util.Map;  
import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
 
import org.apache.struts2.ServletActionContext; 
import org.apache.struts2.StrutsStatics; 
 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionSupport; 
 
 
public class ActionTest8 extends ActionSupport implements StrutsStatics { 
 
  private HttpServletRequest request; 
  private HttpServletResponse response; 
  private ServletContext application; 
 
   
  public String demo(){ 
    ActionContext context = ActionContext.getContext(); 
 
    request = (HttpServletRequest) context.get(HTTP_REQUEST); 
    response = (HttpServletResponse) context.get(HTTP_RESPONSE); 
    application = (ServletContext) context.get(SERVLET_CONTEXT); 
    System.out.println(request); 
    System.out.println(response); 
    System.out.println(application); 
    System.out.println(request.getSession()); 
     
 
    return SUCCESS; 
  } 
 
   
  public String demo2(){ 
    //1.获取session对象 
    HttpSession session = ServletActionContext.getRequest().getSession(); 
    //存入数据 
    session.setAttribute("sessionAttr", "hello session attr"); 
    session.getId(); 
    //2.获取ServletContext 
    ServletContext application = ServletActionContext.getServletContext(); 
    application.getRealPath("/WEB-INF/uploads"); 
    //存入数据 
    application.setAttribute("applicationAttr", "hello application attr"); 
    return SUCCESS; 
  } 
 
 
   
  public String demo3(){ 
    //1.获取ActionContext对象 
    ActionContext context = ActionContext.getContext(); 
    //2.获取sessionMap 
    Map sessionMap = context.getSession(); 
    sessionMap.put("sessionAttr", "hello session map"); 
    //3.获取applicationMap 
    Map applicationMap = context.getApplication(); 
    applicationMap.put("applicationAttr", "hello application map"); 
    return SUCCESS; 
  } 
 
} 

ActionContext类访问Servlet API的常用方法

方法声明 功能描述
void put(String key, Object value) 将 key-value键值对放入ActionContext 中,模拟Servlet API中的HttpServletRequest的setAttributeO方法。
Object get(String key) 通过参数key来查找当前ActionContext中的值。
Map getApplication() 返回一个Application级的Map对象。
static ActionContext getContext() 获取当前线程的ActionContext对象。
Map getParameters() 返回一个包含所有HttpServletRequest参数信息的Map对象。
Map getSession() 返回一个Map类型的HttpSession对象。
void setApplication(Map application)  设置Application上下文。
void setSession(Map session) 设置一个Map类型的Session值 。

PS:通过对这三种方式的使用,可以发现通过实现特定接口和使用ServletActionContext类,Action是与Servlet API进行直接耦合的,这样并不利于程序解耦。所以开发中建议优先使用ActionContext。

PS:虽然这样,在控制器与Servlet API解耦了,但是在Struts2中肯定有一部分代码还是和Servlet API有耦合,这是毋庸置疑的。如果我们只是需要使用Servlet API中域对象中的域(键值对,存放数据的),那么就使用ServletContext,如果需要使用除了域之外的其他东西,那么还是要使用ServletActionContext的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/145901.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号