• 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 }
  • 相关阅读:
    [BTS] BizTalk WCF-SQL Adapter 高级应用
    [BTS] BizTalk EDI character set and separator settings
    [ThingWorx] Install Guideline
    [ThingWorx] Install PostgreSQL Issue
    [BTS] BizTalk EDI AS2 Error 1
    [BTS] BizTalk With EF
    [BTS] Exception occurred when persisting state to the database
    [BTS] MSDTC
    [BTS] The value "" for the property InboundId is invalid
    [Android] Android Sutdio on Surface Pro 3
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/3989969.html
Copyright © 2020-2023  润新知