当前位置: 移动技术网 > IT编程>开发语言>Java > Struts2访问Servlet的三种方式

Struts2访问Servlet的三种方式

2019年07月22日  | 移动技术网IT编程  | 我要评论

基本介绍

在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; 
 
/** 
 * 使用特定接口访问servlet对象 
 * @author switch 
 * 
 * org.apache.struts2.dispatcher.strutsrequestwrapper@461aa2 
 * org.apache.catalina.connector.responsefacade@7e83df 
 * org.apache.catalina.core.applicationcontextfacade@3b102 
 * org.apache.catalina.session.standardsessionfacade@5a214b 
 * 是由一个名称为servletconfig的拦截器为我们封装的 
 */ 
public class actiontest7 extends actionsupport implements servletrequestaware,servletresponseaware,servletcontextaware { 
 
  private httpservletrequest request; 
  private httpservletresponse response; 
  private servletcontext application; 
 
  /** 
   * @return 
   */ 
  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; 
/** 
 * 访问servletapi的方式 
 * 
 * 使用struts2框架提供了一个工具类: 
 *     servletactioncontext 
 * 它里面提供了对应的静态方法,可以直接获取servletapi 
 * 
 * 有一个需要注意的问题: 
 *    org.apache.struts2.dispatcher.strutsrequestwrapper@4637b3 
 *    org.apache.catalina.connector.responsefacade@1f2f2f7 
 *    org.apache.catalina.session.standardsessionfacade@12d77c1 
 *    org.apache.catalina.core.applicationcontextfacade@1133ff 
 * 
 *    requet对象已经不是原来tomcat提供的了,而是被struts2框架包装过了。 
 *     包装使用的是装饰者模式。 
 *    装饰者模式的作用是对方法进行增强。 
 * 
 * @author switch 
 */ 
public class actionapitest extends actionsupport { 
  /** 
   * 在struts2框架中使用servletapi 
   * @return 
   */ 
  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; 
 
/** 
 * actioncontext类介绍 
 *   它是struts2框架为我们提供的一个工具类。 
 *   该类可以通过方法直接获取request,response,servletcontext对象 
 * @author switch 
 * 
 * context.getparameters(); == request.getparametermap(); 获取的是请求参数 
 */ 
public class actiontest8 extends actionsupport implements strutsstatics { 
 
  private httpservletrequest request; 
  private httpservletresponse response; 
  private servletcontext application; 
 
  /** 
   * 使用actioncontext访问servletapi 
   * @return 
   */ 
  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()); 
    /*org.apache.struts2.dispatcher.strutsrequestwrapper@112e422 
    org.apache.catalina.connector.responsefacade@13f8b4c 
    org.apache.catalina.core.applicationcontextfacade@d244dd 
    org.apache.catalina.session.standardsessionfacade@a711cb*/ 
 
    return success; 
  } 
 
  /** 
   * 使用原始servletapi对象,往session域和application域中存入数据 
   * session域中存入     key=sessionattr     value=hello session attr 
   * application域中存入 key=applicationattr   value=hello application attr 
   * @return 
   */ 
  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; 
  } 
 
 
  /** 
   * 使用actioncontext类中的getsession()和getapplication()获取到的map来往map中存入数据 
   * sessionmap中存入     key=sessionattr     value=hello session map 
   * applicationmap中存入 key=applicationattr   value=hello application map 
   * @return 
   */ 
  public string demo3(){ 
    //1.获取actioncontext对象 
    actioncontext context = actioncontext.getcontext(); 
    //2.获取sessionmap 
    map<string,object> sessionmap = context.getsession(); 
    sessionmap.put("sessionattr", "hello session map"); 
    //3.获取applicationmap 
    map<string,object> 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<string, object> getapplication()
返回一个application级的map对象。
static actioncontext getcontext()
获取当前线程的actioncontext对象。
map<string, object> getparameters()
返回一个包含所有httpservletrequest参数信息的map对象。
map<string, object> getsession()
返回一个map类型的httpsession对象。
void setapplication(map<string, object> application)
 设置application上下文。
void setsession(map<string, object> session)
设置一个map类型的session值 。

ps:通过对这三种方式的使用,可以发现通过实现特定接口和使用servletactioncontext类,action是与servlet api进行直接耦合的,这样并不利于程序解耦。所以开发中建议优先使用actioncontext。

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网