• 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 }
  • 相关阅读:
    121. Best Time to Buy and Sell Stock
    70. Climbing Stairs
    647. Palindromic Substrings
    609. Find Duplicate File in System
    583. Delete Operation for Two Strings
    556 Next Greater Element III
    553. Optimal Division
    539. Minimum Time Difference
    537. Complex Number Multiplication
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/3989969.html
Copyright © 2020-2023  润新知