基本介绍
在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的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
Java Class.forName()用法和newInstance()方法原理解析
网友评论