<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-126  評(píng)論-247  文章-5  trackbacks-0

      
     在 java 中, 常見的 Context 有很多,

     像: ServletContext, ActionContext, ServletActionContext, ApplicationContext, PageContext, SessionContext ...

     那么, Context 究竟是什么東西呢? 直譯是上下文、環(huán)境的意思。比如像: "今天我收到了一束花, 男朋友送的!" 又或者 "今天我收到了一束花, 送花的人送錯(cuò)了的!"

     同樣是收到一束花, 在不同的上下文環(huán)境中表達(dá)的意義是不一樣的。

     同樣的, Context 其實(shí)也是一樣, 它離不開所在的上下文環(huán)境, 否則就是斷章取義了。

     另外, 在網(wǎng)絡(luò)上也有些人把 Context 看成是一些公用信息或者把它看做是一個(gè)容器的, 個(gè)人覺得這種解釋稍好。

     接下來說說 ServletContext, ActionContext, ServletActionContext
     
     1> ServletContext

     一個(gè) WEB 運(yùn)用程序只有一個(gè) ServletContext 實(shí)例, 它是在容器(包括 JBoss, Tomcat 等)完全啟動(dòng) WEB 項(xiàng)目之前被創(chuàng)建, 生命周期伴隨整個(gè) WEB 運(yùn)用。

     當(dāng)在編寫一個(gè) Servlet 類的時(shí)候, 首先是要去繼承一個(gè)抽象類 HttpServlet, 然后可以直接通過 getServletContext() 方法來獲得 ServletContext 對(duì)象。

     這是因?yàn)?HttpServlet 類中實(shí)現(xiàn)了 ServletConfig 接口, 而 ServletConfig 接口中維護(hù)了一個(gè) ServletContext 的對(duì)象的引用。

     利用 ServletContext 能夠獲得 WEB 運(yùn)用的配置信息, 實(shí)現(xiàn)在多個(gè) Servlet 之間共享數(shù)據(jù)等。

     eg:
     

      
    <?xml version="1.0" encoding="UTF-8"?>

      
    <context-param>
        
    <param-name>url</param-name>
        
    <param-value>jdbc:oracle:thin:@localhost:1521:ORC</param-value>
      
    </context-param>
      
    <context-param>
        
    <param-name>username</param-name>
        
    <param-value>scott</param-value>
      
    </context-param>
      
    <context-param>
        
    <param-name>password</param-name>
        
    <param-value>tigger</param-value>
      
    </context-param>
      
      
    <servlet>
        
    <servlet-name>ConnectionServlet</servlet-name>
        
    <servlet-class>net.yeah.fancydeepin.servlet.ConnectionServlet</servlet-class>
      
    </servlet>
      
    <servlet-mapping>
        
    <servlet-name>ConnectionServlet</servlet-name>
        
    <url-pattern>/ConnectionServlet.action</url-pattern>
      
    </servlet-mapping>
      
      
    <servlet>
        
    <servlet-name>PrepareConnectionServlet</servlet-name>
        
    <servlet-class>net.yeah.fancydeepin.servlet.PrepareConnectionServlet</servlet-class>
      
    </servlet>
      
    <servlet-mapping>
        
    <servlet-name>PrepareConnectionServlet</servlet-name>
        
    <url-pattern>/PrepareConnectionServlet.action</url-pattern>
      
    </servlet-mapping>

    </web-app>
      

     

      
    package net.yeah.fancydeepin.servlet;

    import java.io.IOException;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class PrepareConnectionServlet extends HttpServlet {

        
    private static final long serialVersionUID = 1L;

        
    public void init() throws ServletException {
            
            ServletContext context 
    = getServletContext();
            String url 
    = context.getInitParameter("url");
            String username 
    = context.getInitParameter("username");
            String password 
    = context.getInitParameter("password");
            context.setAttribute(
    "url", url);
            context.setAttribute(
    "username", username);
            context.setAttribute(
    "password", password);
        }

        
    protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
            
            doPost(request, response);
        }

        
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            response.sendRedirect(
    "ConnectionServlet.action");
        }
    }

      

     

      
    package net.yeah.fancydeepin.servlet;

    import java.io.IOException;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServlet;

    public class ConnectionServlet extends HttpServlet {

        
    private static final long serialVersionUID = 1L;

        
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
            
            ServletContext context 
    = getServletContext();
            System.out.println(
    "***************************************");
            System.out.println(
    "URL: " + context.getAttribute("url"));
            System.out.println(
    "Username: " + context.getAttribute("username"));
            System.out.println(
    "Password: " + context.getAttribute("password"));
            System.out.println(
    "***************************************");
            
    super.service(request, response);
        }
    }
      

     
     當(dāng)訪問 PrepareConnectionServlet.action 時(shí), 后臺(tái)打印輸出:
     

      
    ***********************************************
    URL:  jdbc:oracle:thin:@localhost:1521:ORC
    Username:  scott
    Password:  tigger
    ***********************************************
      


     
     2> ActionContext
     
     ActionContext 是當(dāng)前 Action 執(zhí)行時(shí)的上下文環(huán)境, ActionContext 中維護(hù)了一些與當(dāng)前 Action 相關(guān)的對(duì)象的引用, 

     如: Parameters (參數(shù)), Session (會(huì)話), ValueStack (值棧), Locale (本地化信息) 等。
     
     在 Struts1 時(shí)期, Struts1 的 Action 與 Servlet API 和 JSP 技術(shù)的耦合度都很緊密, 屬于一個(gè)侵入式框架:

      
    public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){
        
    // TODO Auto-generated method stub
        return null;
    }
      


     到了 Struts2 時(shí)期, Struts2 的體系結(jié)構(gòu)與 Struts1 之間存在很大的不同。Struts2 在 Struts1 的基礎(chǔ)上與 WebWork 進(jìn)行了整合, 成為了一個(gè)全新的框架。

     在 Struts2 里面, 則是通過 WebWork 來將與 Servlet 相關(guān)的數(shù)據(jù)信息轉(zhuǎn)換成了與 Servlet API 無關(guān)的對(duì)象, 即 ActionContext 對(duì)象。

     這樣就使得了業(yè)務(wù)邏輯控制器能夠與 Servlet API 分離開來。另外, 由于 Struts2 的 Action 是每一次用戶請(qǐng)求都產(chǎn)生一個(gè)新的實(shí)例, 因此, 

     ActionContext 不存在線程安全問題, 可以放心使用。

      
    package net.yeah.fancydeepin.action;

    import java.util.Map;
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.util.ValueStack;

    public class ContextAction extends ActionSupport {

        
    private static final long serialVersionUID = 1L;
        
    private String username;
        
    private String password;

        
    public String execute(){
            
            ActionContext context 
    = ActionContext.getContext();
            ValueStack value 
    = context.getValueStack();
            value.set(
    "username", username);
            value.set(
    "password", password);
            Map
    <String, Object> session = context.getSession();
            session.put(
    "url""http://www.tkk7.com/fancydeepin");
            
    return SUCCESS;
        }

        
    public void setUsername(String username) {
            
    this.username = username;
        }

        
    public void setPassword(String password) {
            
    this.password = password;
        }
    }

      

     

      
    <s:property value="username"/><BR>
    <s:property value="password"/><BR>
    <s:property value="#session.url"/><BR>
      

     

     當(dāng)訪問 context.action 并傳給相應(yīng)的參數(shù)的時(shí)候, 在瀏覽器中會(huì)輸出相應(yīng)的信息。

     留意到上面 Struts2 的 Action 中并有沒添加屬性的 getting 方法, 而是手動(dòng)的將參數(shù)值放到值棧(ValueStack)中的, 否則頁面是得不到參數(shù)來輸出的。

     3> ServletActionContext

     首先, ServletActionContext 是 ActionContext 的一個(gè)子類。ServletActionContext 從名字上來看, 意味著它與 Servlet API 緊密耦合。


     ServletActionContext 的構(gòu)造子是私有的, 主要是提供了一些靜態(tài)的方法, 可以用來獲取: ActionContext, ActionMapping, PageContext,

     HttpServletRequest, HttpServletResponse, ServletContext, ValueStack, HttpSession 對(duì)象的引用。
     

      
    public String execute(){
            
        
    //或 implements ServletRequestAware
        HttpServletRequest request = ServletActionContext.getRequest();
       
    //或 implements ServletResponseAware
        HttpServletResponse response = ServletActionContext.getResponse();
        
    //或 implements SessionAware
        HttpSession session = request.getSession();
        
    //或 implements ServletContextAware
        ServletContext context = ServletActionContext.getServletContext();
            
        
    return SUCCESS;
    }
      


     
     
     



      
    posted on 2013-03-31 15:30 fancydeepin 閱讀(20667) 評(píng)論(6)  編輯  收藏

    評(píng)論:
    # re: 幾個(gè) Context 上下文的區(qū)別[未登錄] 2013-12-04 10:47 | kyle
    作者總結(jié)性極強(qiáng),幫助很大,多謝了~  回復(fù)  更多評(píng)論
      
    # re: 幾個(gè) Context 上下文的區(qū)別[未登錄] 2014-02-28 12:01 | cxh
    作者寫得很好,對(duì)我初學(xué)者很好幫助,謝謝  回復(fù)  更多評(píng)論
      
    # re: 幾個(gè) Context 上下文的區(qū)別[未登錄] 2015-03-27 16:12 | windy
    多給幾個(gè)贊!  回復(fù)  更多評(píng)論
      
    # re: 幾個(gè) Context 上下文的區(qū)別[未登錄] 2015-07-30 15:27 | windy
    # re: 幾個(gè) Context 上下文的區(qū)別 2015-08-07 17:16 | 編程小王子
    是不是還有后續(xù)幾個(gè)的???  回復(fù)  更多評(píng)論
      
    # re: 幾個(gè) Context 上下文的區(qū)別 2016-03-11 13:28 | 溫柔次
    請(qǐng)3534起特特愛聽  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 可以免费看的卡一卡二| 国产精品玖玖美女张开腿让男人桶爽免费看| 中文字幕的电影免费网站| 国产免费拔擦拔擦8x| 亚洲私人无码综合久久网| 和日本免费不卡在线v| 亚洲小视频在线播放| 最近中文字幕免费完整| 亚洲综合一区二区| 国产精品色拉拉免费看| 巨胸狂喷奶水视频www网站免费| 免费一级毛片免费播放| 日韩a毛片免费观看| 3d动漫精品啪啪一区二区免费| 亚洲欧洲日韩不卡| 成人免费视频网站www| 国产成人精品日本亚洲18图| 国产一卡二卡3卡四卡免费| 国产 亚洲 中文在线 字幕| 日本免费电影一区| 七次郎成人免费线路视频| 亚洲综合无码AV一区二区| 亚洲成a人片在线网站| 久久不见久久见免费影院| 久久亚洲AV成人无码国产电影| 免费a在线观看播放| 国产午夜无码片免费| 精品亚洲成AV人在线观看| 男女一边桶一边摸一边脱视频免费| 日韩免费精品视频| 亚洲AV噜噜一区二区三区| 亚洲综合无码AV一区二区| 免费国产作爱视频网站| 污网站免费在线观看| 亚洲精品高清视频| 国产网站免费观看| 亚洲午夜成人精品无码色欲| 亚洲Av无码乱码在线znlu| 日本在线看片免费人成视频1000 | 国产精品亚洲专区一区| 亚洲无线码在线一区观看|