JSP中的内置对象和Struts中的Web资源的详解
JSP中的内置对象有如下几种:
request :继承于HttpServletRequest, HttpServletRequest继承ServletRequest,
获得的Request对象的方法:只能在Servlet中获取的doGet()和doPost()方法中获取
作用:封装用户请求信息
response : 继承于HttpServletResponse, HttpServletResponse继承ServletResponse
获得response对象的方法:只能在Servlet中获取的doGet()和doPost()方法中获取
作用:封装服务器返回的信息
session :继承于HttpSession
获得Session对像:只能在Servlet中获取的doGet()和doPost()方法中使用Request获取
作用:为每个用户指定一个与服务器的会话过程,保存会话过程的信息
out :继承于JSPWriter对象,
获得out对象的方法:response.getWrite()
作用:向特定页面打印字符串,Ajax的时候是返回信息
application:继承于:javax.servle.ServletContext
获得application对象的方法:
作用:是一个共享对象,全网站都可以使用,
pageContext:
page :
config :
exception
Struts2中的Web资源访问,也就是jSP内置对象中的访问
- 解耦的方法(解耦的方法:不是完全的继承JSP的内置对象,只能实现部分功能的,),解耦的方法有以下两种
1)---通过ActionContext方式----(只能获取Request,Session,application)
①获取ActionContext对象: actionContext actionContext=ActionContext.getActionContext();
②获取XX对象,并封装在Map中: Map<String,object> XXMap=actionContext.getXX();
request对象比较特别点: Map<String,object> requestMap=(Map<Stirng,Object>)actionContext.get("request");
③然后可以使用Map对象的put()、get(),对属性进行设置和获取
xxxxMap.put("requestKey","requestValue");
XXXMap.get("XXXkey");
代码示例:1 package com.Web.ActionContext; 2 import java.util.*; 3 4 import com.opensymphony.xwork2.ActionContext; 5 6 public class TextActionContext { 7 //原理通过调用ActonContext的getXXX()方法,xxx代表jSP的内置对象 8 //--->进而调用(Map<String, Object>) get(XXX);.... public static final String XXX = "com.opensymphony.xwork2.ActionContext.XXX" 9 返回一个Map<String,xxx>列表 11 //所以Map的put和get方法最终都是操纵xxx对象的 12 public String execute(){ 13 ActionContext actionContext=ActionContext.getContext(); 14 Map<String,Object> applicationMap=actionContext.getApplication(); 15 applicationMap.put("applicationKey", "applicationvalue"); 16 //request对象的获取 17 Map<String, Object> requestMap=(Map<String, Object>)actionContext.get("request"); 18 return "sucess"; 19 } 20 21 }
2)----实现XXXAware接口的方法(可以获取大部分内置对象)
①编写一个新的Java类继承XxxAware接口,并添加需要实现的方法
implement XXxAware
②声明XXX对象
private Map<Sting,object> XXX-------->private Map<String,Object> request;
并声明setXXX()方法;
③使用Map的put、get对属性进行设置;
notice----1)Session对应的Map实际是一个SessionMap类型的,强制转换后若调用invalidate()方法,可以使其Session失效
2)若一个Action有多个action方法,且每个action方法都需要用到web资源对象时建议使用ActionAware接口1 package com.Web.ActionAware; 2 3 import java.util.Map; 4 5 import org.apache.struts2.dispatcher.SessionMap; 6 import org.apache.struts2.interceptor.ApplicationAware; 7 import org.apache.struts2.interceptor.RequestAware; 8 import org.apache.struts2.interceptor.SessionAware; 9 10 public class TextActionAware implements RequestAware,ApplicationAware,SessionAware{//继承接口 11 private Map<String, Object> requestMap;//2声明一个RequestMap对象 12 private Map<String , Object> applicationMap; 13 private Map<String , Object> sessionMap; 14 public void setRequest(Map<String, Object> arg0) {//3为RequestMap对象设置对象 15 // TODO Auto-generated method stub 16 this.requestMap=arg0; 17 18 } 19 public void setApplication(Map<String, Object> arg0) { 20 // TODO Auto-generated method stub 21 this.applicationMap=arg0; 22 23 } 24 public String execute(){ 25 requestMap.put("requestAwareKey", "requestAwareValue");//4设置属性 26 applicationMap.put("applicationAwareKey","applicationAwareValue"); 27 sessionMap.put("SessionAwareKey", "SessionAwareValue"); 28 if(sessionMap instanceof SessionMap){//这里是为了验证Map类型的Session对象是不是真正的JSP内置对象, 29 SessionMap sm=(SessionMap)sessionMap; 30 sm.invalidate(); 31 } 32 return "sucess"; 33 } 34 public void setSession(Map<String, Object> arg0) { 35 // TODO Auto-generated method stub 36 this.sessionMap=arg0; 37 } 38 39 }
- 耦合的方式:也有以下两种
1)------通过原生的使用ServletAPI-----ServletActionContext(可以获取大部分内置对象)
example:-------HttpServletRequest request=ServletActionContext.getRequest()
example:--------httpSession session=ServletActionContext.getRequest().getSession();
example:--------ServletContext ServletContext=ServletContext.getServletContext();
notice: ServletContext 与application的异同
相同:其实servletContext和application 是一样的,就相当于一个类创建了两个不同名称的变量。在
servlet中ServletContext就是application对象。大家只要打开jsp编译过后生成的Servlet中的
jspService()方法就可以看到如下的声明:
ServletContext application = null;
application = pageContext.getServletContext();
不同:两者的区别就是application用在jsp中,servletContext用在servlet中。application和page
request session 都是JSP中的内置对象,在后台用ServletContext存储的属性数据可以用
application对象获得。
代码示例package com.Web.ServletAPI; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; public class TextServletAPI { public String execute() { HttpServletRequest request=ServletActionContext.getRequest(); HttpSession session=ServletActionContext.getRequest().getSession(); ServletContext ServletContext=ServletActionContext.getServletContext(); request.setAttribute("requestKey", "ServletAPIrequestValue"); return "sucess"; } }
2)-------通过实现ServletXxxAware接口可以由Struts2注入需要的原生Servlet对象
example:---implements ServletRequestAware,ServletContextAware
notice:不要在成员变量或者是构造方法里调用ActionContext,getSession()而把它放在其它方法里.
代码示例:
1 package com.Web.ServletXxxAware; 2 3 import javax.servlet.ServletContext; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 import javax.servlet.http.HttpSession; 7 8 import org.apache.struts2.interceptor.ServletRequestAware; 9 import org.apache.struts2.interceptor.ServletResponseAware; 10 import org.apache.struts2.util.ServletContextAware; 11 12 public class TestServletXxxAware implements ServletResponseAware,ServletContextAware,ServletRequestAware{//实现原生内置对象的接口 13 HttpServletRequest request;//2声明原生对象 14 HttpServletResponse response; 15 public void setServletResponse(HttpServletResponse response) {//3为原生对象设置方法 16 // TODO Auto-generated method stub 17 this.response=response; 18 19 20 } 21 22 public void setServletContext(ServletContext context) { 23 // TODO Auto-generated method stub 24 } 25 26 public void setServletRequest(HttpServletRequest request) { 27 // TODO Auto-generated method stub 28 this.request=request; 29 } 30 public String execute(){ 31 request.setAttribute("requestKey", "requestServletXxxAwareValue");//4直接可以调用原生方法 32 return "success"; 33 } 34 }