4. Java Web Servlet開發(fā)中涉及的對象

Servlet開發(fā)中涉及的對象:

HttpservletRequest對象: 封裝請求信息
HttpServletResponse對象: 封裝響應(yīng)信息
ServletConfig對象: 封裝一個(gè)servlet配置參數(shù)信息
ServletContext對象: servlet的上下文對象

ServletConfig對象

servletconfig是配置對象,主要把servlet的初始化參數(shù)封裝到這個(gè)對象中撤奸。一個(gè)網(wǎng)站中可能會存在多個(gè)ServletConfig對象苗踪,一個(gè)ServletConfig對象就封裝了一個(gè)servlet的配置信息战惊。

配置初始化參數(shù)

<servlet>
    <servlet-name>ConfigDemo</servlet-name>
    <servlet-class>com.demo.f_config.ConfigDemo</servlet-class>
    <!-- servlet的初始化參數(shù) -->
    <init-param>
        <param-name>path</param-name>
        <param-value>e:/aaa.txt</param-value>
    </init-param>
  </servlet>

在servlet中獲取初始化參數(shù)
config.getInitParameter("name"); 根據(jù)參數(shù)名稱獲取參數(shù)值
config.getInitParameterNames(); 獲取所有參數(shù)名稱


ServletContext對象

ServletConfig對象叫servlet上下文對象。 一個(gè)網(wǎng)站只會創(chuàng)建一個(gè)ServletContext對象喂走。代表的是整個(gè)網(wǎng)站的環(huán)境信息。
獲取ServletContext對象

this.getServletConfig().getServletContext();  

通過ServletConfig對象來獲取到ServletContext對象的。

ServletContext對象:啟動(dòng)的時(shí)候創(chuàng)建俩莽。
ServletConfig對象:調(diào)用init方法之前創(chuàng)建的,在ServletContext對象創(chuàng)建之前乔遮。

public ServletCofig{
         ServletContext context;
         public ServletConfig(context){
                this.context=context;
         }
         public ServetContxt getServletContext(){
              return;
         }
}

ServletConfig config = new ServletConfig(context);

public MyServlet extends HttpSevlet{
 
       publlic init(ServletConfig config){
                SevletContext context= config. getServletContext();
    }
}

ServletContext的5大作用

1)獲取web的上下文路徑

java.lang.String getContextPath()

/**
* 【context對象的作用1】-獲取web上下文路徑
* @author APPle
*
*/
public class ContextDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        /**
         * 獲取web上下路徑
         */
        //1.1.獲取ServletContext對象
        //ServletContext context = this.getServletConfig().getServletContext();
        /**
         * 推薦使用簡寫
         */
        ServletContext context = this.getServletContext();
        
        //1.2 獲取
        String path = context.getContextPath();
        System.out.println(path); // /demo
        /**
         * web上下文路徑就是項(xiàng)目在tomcat服務(wù)器中運(yùn)行的路徑扮超。注意不是開發(fā)目錄的項(xiàng)目名稱。
         */
        //請求重定向
        //response.sendRedirect("/demo/hello.html");
        
        //作用:可以讓這個(gè)獲取文件的路徑更加靈活
        response.sendRedirect(context.getContextPath()+"/hello.html");
    }

}

2)獲取全局參數(shù)

java.lang.String getInitParameter(java.lang.String name)
java.util.Enumeration getInitParameterNames()

 <web-app version="2.5" 
    xmlns="[http://java.sun.com/xml/ns/javaee](http://java.sun.com/xml/ns/javaee)"
    xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)" 
    xsi:schemaLocation="[http://java.sun.com/xml/ns/javaee](http://java.sun.com/xml/ns/javaee)
    [http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd](http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd)">

    <!-- 配置web應(yīng)用全局的參數(shù) -->
    <context-param>
       <param-name>AAA</param-name>
       <param-value>AAA's value</param-value>
    </context-param>

    <context-param>
       <param-name>BBB</param-name>
       <param-value>BBB's value</param-value>
    </context-param>

    <context-param>
       <param-name>CCC</param-name>
       <param-value>CCC's value</param-value>
    </context-param>

全局參數(shù)對當(dāng)前web應(yīng)用下的所有servlet都有效的蹋肮。

/**
* 【context對象作用2】-獲取全局參數(shù)
* @author APPle
*
*/
public class ContextDemo2 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 得到全局參數(shù)
         */
        ServletContext context =
                this.getServletContext();
        System.out.println(context.getInitParameter("AAA"));
        
        //遍歷所有參數(shù)
        Enumeration<String> enums = context.getInitParameterNames();
        while(enums.hasMoreElements()){
            String paramName = enums.nextElement();
            String paramValue = context.getInitParameter(paramName);
            System.out.println(paramName+"="+paramValue);
        }         
    }
}


3)和域?qū)ο笙嚓P(guān)的

void setAttribute(java.lang.String name, java.lang.Object object) 保存數(shù)據(jù)
java.lang.Object getAttribute(java.lang.String name) 得到數(shù)據(jù)
void removeAttribute(java.lang.String name)清除數(shù)據(jù)

什么是域?qū)ο螅?br> 域?qū)ο笤诓煌馁Y源之間來共享數(shù)據(jù)出刷。保存數(shù)據(jù),獲取數(shù)據(jù)坯辩。
域?qū)ο蟮淖饔茫?主要用于保存數(shù)據(jù)和獲取數(shù)據(jù)巷蚪,用于在web應(yīng)用中不同資源之間共享數(shù)據(jù)。


image.png

例如:
Servlet1
name=eric
response.sendRedirect("/Servlet2?name=eric");

Servlet2
request.getParameter("name");
1)參數(shù)形式: 只能傳遞字符串?dāng)?shù)據(jù)
2)使用域?qū)ο笮问剑?br> 在Servlet1中保存數(shù)據(jù)
在Servlet2中獲取數(shù)據(jù)

public class ScopeDemo1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 把數(shù)據(jù)存儲到ServletContext域?qū)ο?         */
        ServletContext context =
                    this.getServletContext();
        //context.setAttribute("name", "eric");
        List list = new ArrayList();
        list.add("eric");
        list.add("jacky");
        list.add("rose");
        context.setAttribute("list", list);
        System.out.println("保存成功");
    }

}


public class ScopeDemo2 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 從ServletContext域?qū)ο笾腥〕鰯?shù)據(jù)
         */
        ServletContext context =
                this.getServletContext();
        //String name = (String)context.getAttribute("name");
        List list = (List)context.getAttribute("list");
        
        System.out.println(list);
    }
}

ServletContext就是我們學(xué)習(xí)的第一個(gè)域?qū)ο蟆?br> ServletContext域作用范圍:在當(dāng)前的web應(yīng)用中有效濒翻。

Servlet中所有域?qū)ο螅?br> HttpServletRequest對象: request域
ServletContext對象: context域
HttpSession對象: session域

Jsp中域?qū)ο螅?br> PageContext對象: page域


4)轉(zhuǎn)發(fā)相關(guān)的

RequestDispatcher getRequestDispatcher(java.lang.String path)


image.png

在servlet中實(shí)現(xiàn)頁面跳轉(zhuǎn)
請求重定向: response.sendRedirect(路徑);
請求轉(zhuǎn)發(fā): request.getRequestDispacher(路徑).forward(request,respone);

public class RedirectDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 請求重定向(瀏覽器行為)
         */
        //response.sendRedirect("/demo/hello.html");
        
        /**
         * 注意:
         *         可以跳轉(zhuǎn)到當(dāng)前項(xiàng)目的資源屁柏,也可以跳轉(zhuǎn)到其他項(xiàng)目的資源
         */
        //response.sendRedirect("/demo/adv.html");
        
        /**
         * 把數(shù)據(jù)保存到request域?qū)ο?         */
        request.setAttribute("name", "jacky");        
        response.sendRedirect("/demo/GetDataServlet");       
    }
}
public class GetDataServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {       
        /**
         * 從request域?qū)ο笾腥〕鰯?shù)據(jù)
         */
        String name = (String)request.getAttribute("name");
        System.out.println("name="+name);        
    }
}
/**
* 【context對象作用4】--請求轉(zhuǎn)發(fā)
* @author APPle
*
*/
public class ForwardDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 轉(zhuǎn)發(fā):服務(wù)器行為
         */
        /*
        ServletContext context = this.getServletContext();
        RequestDispatcher rd = context.getRequestDispatcher("/hello.html");
        rd.forward(request, response);
        */
        /**
         * 注意:轉(zhuǎn)發(fā)只能轉(zhuǎn)發(fā)都當(dāng)前項(xiàng)目的資源
         */
        //this.getServletContext().getRequestDispatcher("../Demo/adv.html")
            //    .forward(request, response);
        
        /**
         * 把數(shù)據(jù)保存到request域?qū)ο?         */
        request.setAttribute("name", "jacky");
            
        //this.getServletContext().getRequestDispatcher("/GetDataServlet")
            //    .forward(request, response);
        
        /**
         * 簡寫方式
         */
        request.getRequestDispatcher("/GetDateServlet").forward(request, response);
    }
}
求重定向 vs 請求轉(zhuǎn)發(fā) 區(qū)別

請求重定向:
1)地址欄改變,改變?yōu)橹囟ㄏ虻降刂?br> 2)可以重定向到當(dāng)前web應(yīng)用有送,其他web應(yīng)用淌喻,甚至是其他站點(diǎn)資源。
3)處于兩次不同的請求雀摘。不可以使用request域?qū)ο髞砉蚕頂?shù)據(jù)裸删。

請求轉(zhuǎn)發(fā):
1)地址欄不會改變。
2)只能轉(zhuǎn)發(fā)到當(dāng)前web應(yīng)用內(nèi)部資源阵赠。
3)處于同一次請求涯塔〖〉荆可以使用request域?qū)ο髞砉蚕頂?shù)據(jù)


5)讀取web項(xiàng)目的資源文件

java.lang.String getRealPath(java.lang.String path) 得到資源文件的絕對路徑
java.io.InputStream getResourceAsStream(java.lang.String path)
java.net.URL getResource(java.lang.String path)
注意:
1)在java項(xiàng)目中ecplise工具,把java命令的運(yùn)行根目錄設(shè)置到項(xiàng)目根目錄下匕荸。
2)在web項(xiàng)目中. 表示從tomcat的bin開始爹谭,因?yàn)閖ava命令從bin目錄開始執(zhí)行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榛搔,一起剝皮案震驚了整個(gè)濱河市诺凡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌践惑,老刑警劉巖腹泌,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尔觉,居然都是意外死亡凉袱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門侦铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來专甩,“玉大人,你說我怎么就攤上這事泵额∨渖睿” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵嫁盲,是天一觀的道長篓叶。 經(jīng)常有香客問我,道長羞秤,這世上最難降的妖魔是什么缸托? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮瘾蛋,結(jié)果婚禮上俐镐,老公的妹妹穿的比我還像新娘。我一直安慰自己哺哼,他們只是感情好佩抹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著取董,像睡著了一般棍苹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茵汰,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天枢里,我揣著相機(jī)與錄音,去河邊找鬼。 笑死栏豺,一個(gè)胖子當(dāng)著我的面吹牛彬碱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奥洼,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼巷疼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溉卓?” 一聲冷哼從身側(cè)響起皮迟,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤搬泥,失蹤者是張志新(化名)和其女友劉穎桑寨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忿檩,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尉尾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了燥透。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沙咏。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖班套,靈堂內(nèi)的尸體忽然破棺而出肢藐,到底是詐尸還是另有隱情,我是刑警寧澤吱韭,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布吆豹,位于F島的核電站,受9級特大地震影響理盆,放射性物質(zhì)發(fā)生泄漏痘煤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一猿规、第九天 我趴在偏房一處隱蔽的房頂上張望衷快。 院中可真熱鬧,春花似錦姨俩、人聲如沸蘸拔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽调窍。三九已至,卻和暖如春积担,著一層夾襖步出監(jiān)牢的瞬間陨晶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留先誉,地道東北人湿刽。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像褐耳,于是被迫代替她去往敵國和親诈闺。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容