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内置对象中的访问

 

  1.  解耦的方法(解耦的方法:不是完全的继承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 }

     

  2. 耦合的方式:也有以下两种
    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 }

 

posted @ 2014-09-24 10:02  Jeremy_software  阅读(400)  评论(0编辑  收藏  举报