javaweb學(xué)習(xí)總結(jié)(一)servlet開發(fā)

一河胎、ServletConfig詳解

1.1 配置Servlet初始化參數(shù)

在Servlet的配置文件中惯退,可以使用一個(gè)或多個(gè)<init-param>標(biāo)簽為servlet配置一些初始化參數(shù),例如:

<servlet>
    <servlet-name>ServletConfigDemo1</servlet-name>
    <servlet-class>rain.servlet.study.ServletConfigDemo1</servlet-  
  class>
<!-- 配置ServletConfigDemo1的初始化參數(shù) -->
<init-param>
    <param-name>name</param-name>
    <param-value>rain</param-value>
</init-param>

<init-param>
    <param-name>score</param-name>
    <param-value>140</param-value>
</init-param>

<init-param>
    <param-name>age</param-name>
    <param-value>18</param-value>
</init-param>
</servlet>
1.2 通過(guò)ServletConfig獲取初始化參數(shù)

當(dāng)Servlet配置了初始化參數(shù)以后顺囊,web容器在創(chuàng)建servlet實(shí)例對(duì)象時(shí)其兴,會(huì)自動(dòng)將這些參數(shù)封裝到ServletConfig對(duì)象中去,并且在調(diào)用Servlet的init方法時(shí)會(huì)將ServletConfig傳遞過(guò)去籽御。因此我們可以通過(guò)ServletConfig對(duì)象就可以得到配置的初始化參數(shù)信息了肢执。不過(guò)現(xiàn)在有了servlet3.0之后枉阵,有兩種寫法了。例如:

package rain.servlet.study;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ServletConfigDemo1
 */
//@WebServlet(urlPatterns="/ServletConfigDemo1",initParams= {
//      @WebInitParam(name="name",value="rain"),
//      @WebInitParam(name="score",value="100"),
//      @WebInitParam(name="age",value="18")
//})
public class ServletConfigDemo1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private ServletConfig config;

/**
 * 當(dāng)servlet配置了初始化參數(shù)時(shí)预茄,web容器在創(chuàng)建servlet實(shí)例對(duì)象時(shí)會(huì)自動(dòng)將這些初始化參數(shù)封裝到servletconfig
 * 對(duì)象中兴溜,并在調(diào)用servlet的init方法時(shí),將改對(duì)象傳遞給servlet
 */
@Override
public void init(ServletConfig config) throws ServletException {
    // TODO Auto-generated method stub
//      super.init(config);
    this.config = config;
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
//      response.getWriter().append("Served at: ").append(request.getContextPath());
    response.setContentType("text/html;charset=utf-8");
    String paramVal = this.config.getInitParameter("name");
    response.getWriter().print(paramVal);
    response.getWriter().print("<hr/>");
    
    //獲取所有的初始化參數(shù)
    Enumeration<String> e = config.getInitParameterNames();
    while(e.hasMoreElements()) {
        String name = e.nextElement();
        String value = config.getInitParameter(name);
        response.getWriter().print(name + "=" + value + "<br/>");
    }
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
  }

}

上面注釋掉的部分就是Servlet 3.0之后采用注解的形式耻陕,可以看到還是挺方便的拙徽。運(yùn)行結(jié)果如下:


image.png

二、ServletContext對(duì)象

web容器在啟動(dòng)時(shí)诗宣,它會(huì)為每個(gè)web應(yīng)用創(chuàng)建一個(gè)對(duì)應(yīng)的ServletContext對(duì)象斋攀,它代表當(dāng)前web應(yīng)用。
ServletConfig對(duì)象中維護(hù)了ServletContext對(duì)象的引用梧田,可以通過(guò)ServletConfig.getServletContext獲得。
由于一個(gè)web應(yīng)用所有的servlet都共享同一個(gè)ServletContext侧蘸,因此servlet對(duì)象之間可以實(shí)現(xiàn)通訊裁眯。ServletContext對(duì)象通常也被稱之為context域?qū)ο?/p>

三、ServletContext的應(yīng)用

3.1 多個(gè)servlet通過(guò) ServletContext 來(lái)實(shí)現(xiàn)數(shù)據(jù)共享

下面是一個(gè)例子讳癌,兩個(gè)servlet通過(guò)Servletc實(shí)現(xiàn)數(shù)據(jù)共享

package rain.servlet.study;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class RainServletContextDemo1
 */
@WebServlet("/RainServletContextDemo1")
public class RainServletContextDemo1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request,         HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request,   HttpServletResponse response) throws ServletException,   IOException {
        // TODO Auto-generated method stub
//      response.getWriter().append("Served at:     ").append(request.getContextPath());
        String data = "rain_sample_data";
        /**
         * ServletConfig對(duì)象中維護(hù)了ServletContext的引用穿稳,可以通過(guò)
         * getServletConfig().getServletContext()來(lái)獲取到。
         */
        ServletContext context = this.getServletConfig().getServletContext();
        context.setAttribute("data", data);
}

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

下面是另外一個(gè)Servlet

package rain.servlet.study;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class RainServletContextDemo2
 */
@WebServlet("/RainServletContextDemo2")
public class RainServletContextDemo2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
//      response.getWriter().append("Served at: ").append(request.getContextPath());
        ServletContext context = getServletContext();
        String data = (String) context.getAttribute("data");//從ServletContext對(duì)象中取出數(shù)據(jù)
        response.getWriter().print("data="+data);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

先運(yùn)行RainServletContextDemo1晌坤,然后再運(yùn)行RainServletContextDemo2逢艘,即可以實(shí)現(xiàn)數(shù)據(jù)的共享。運(yùn)行結(jié)果如下:

image.png
3.2 用ServletContext對(duì)象實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)

RainServletContextDemo3

package rain.servlet.study;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class RainServletContextDemo3
 */
@WebServlet("/RainServletContextDemo3")
public class RainServletContextDemo3 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
//      response.getWriter().append("Served at: ").append(request.getContextPath());
        String data = "i am servlet3";
        response.getOutputStream().write(data.getBytes());
        ServletContext context = getServletContext();
        RequestDispatcher dispatcher = context.getRequestDispatcher("/RainServletContextDemo4");
        dispatcher.forward(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

RainServletContextDemo4

package rain.servlet.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class RainServletContextDemo4
 */
@WebServlet("/RainServletContextDemo4")
public class RainServletContextDemo4 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getOutputStream().write("i am servlet4 hia!!!".getBytes());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
3.3 用ServletContext對(duì)象讀取資源文件
項(xiàng)目的目錄結(jié)構(gòu):
image.png
代碼:使用Servlet讀取資源文件
package rain.servlet.study;

import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class RainServletContextDemo5
 * 使用ServletContext讀取資源文件
 */
@WebServlet("/RainServletContextDemo5")
public class RainServletContextDemo5 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
//      response.getWriter().append("Served at: ").append(request.getContextPath());
        response.setHeader("content-type", "text/html;charset=UTF-8");
        readSrcDirFile(response);//讀取src目錄下面的文件
        response.getWriter().write("<hr/>");
        readWebContentFile(response);//讀取webcontent目錄下面的文件
        response.getWriter().write("<hr/>");
        readPackageFile(response);//讀取rain.servlet.study目錄下的文件
        response.getWriter().write("<hr/>");
        readDataConfigFile(response);//讀取data.config下的文件 
    }

    /**
     * 讀取data.config下的文件 data1.properties
     * @param response
     * @throws IOException 
     */
    private void readDataConfigFile(HttpServletResponse response) throws IOException {
        InputStream in = getServletContext().getResourceAsStream(
            "/WEB-INF/classes/data/config/data1.properties");
        Properties prop = new Properties();
        prop.load(in);
        String name = prop.getProperty("name");
        String data = prop.getProperty("data");
        String time = prop.getProperty("time");
        response.getWriter().println("讀取的是data.config包下面的data2.properties:");
        response.getWriter().println(
            MessageFormat.format("name={0},data={1},time={2}", 
                    name,data,time));
}

/**
 * readPackageFile(response);//讀取rain.servlet.study目錄下的文件  data2.properties
 * @param response
 * @throws IOException 
 */
private void readPackageFile(HttpServletResponse response) throws IOException {
    InputStream in = getServletContext().getResourceAsStream(
            "/WEB-INF/classes/rain/servlet/study/data2.properties");
    Properties prop = new Properties();
    prop.load(in);
    String name = prop.getProperty("name");
    String data = prop.getProperty("data");
    String time = prop.getProperty("time");
    response.getWriter().println("讀取的是src目錄下面rain.servlet.study包下面的data2.properties:");
    response.getWriter().println(
            MessageFormat.format("name={0},data={1},time={2}", 
                    name,data,time));
}

/**
 * 讀取webcontent目錄下面的文件 data4.properties
 * @param response
 * @throws IOException 
 */
private void readWebContentFile(HttpServletResponse response) throws IOException {
    InputStream in = getServletContext().getResourceAsStream(
            "/data4.properties");
    Properties prop = new Properties();
    prop.load(in);
    String name = prop.getProperty("name");
    String data = prop.getProperty("data");
    String time = prop.getProperty("time");
    response.getWriter().println("讀取的是webcontent目錄下面的data4.properties:");
    response.getWriter().println(
            MessageFormat.format("name={0},data={1},time={2}", 
                    name,data,time));
}

/**
 * 讀取src目錄下面的文件 data3.properties
 * @param response
 * @throws IOException 
 */
private void readSrcDirFile(HttpServletResponse response) throws IOException {
    InputStream in = getServletContext().getResourceAsStream(
            "/WEB-INF/classes/data3.properties");
    Properties prop = new Properties();
    prop.load(in);
    String name = prop.getProperty("name");
    String data = prop.getProperty("data");
    String time = prop.getProperty("time");
    response.getWriter().println("讀取的是src目錄下面的data3.properties:");
    response.getWriter().println(
            MessageFormat.format("name={0},data={1},time={2}", 
                    name,data,time));
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
        doGet(request, response);
    }

}
運(yùn)行結(jié)果如下:
image.png

四污抬、在客戶端緩存Servlet的輸出

對(duì)于不是經(jīng)常變化的數(shù)據(jù)酗宋,可以在服務(wù)器端設(shè)置一個(gè)緩存時(shí)間臂拓,以避免瀏覽器頻繁的向服務(wù)器端發(fā)起請(qǐng)求,提高服務(wù)器的性能央拖。

代碼如下:
package rain.servlet.study;

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

/**
 * Servlet implementation class RainServletDemo6
 */
@WebServlet("/RainServletDemo6")
public class RainServletDemo6 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
//      response.getWriter().append("Served at: ").append(request.getContextPath());
        String data = "asdffffdsgsgsfgsgsgs";
        response.setDateHeader("expires", System.currentTimeMillis()+24*3600*1000);
        response.getWriter().println(data);
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
運(yùn)行結(jié)果
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鲜戒,更是在濱河造成了極大的恐慌专控,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遏餐,死亡現(xiàn)場(chǎng)離奇詭異伦腐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)失都,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門柏蘑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嗅剖,你說(shuō)我怎么就攤上這事辩越。” “怎么了信粮?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵黔攒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我强缘,道長(zhǎng)督惰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任旅掂,我火速辦了婚禮赏胚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘商虐。我一直安慰自己觉阅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布秘车。 她就那樣靜靜地躺著典勇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叮趴。 梳的紋絲不亂的頭發(fā)上割笙,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音眯亦,去河邊找鬼伤溉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妻率,可吹牛的內(nèi)容都是我干的乱顾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼舌涨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糯耍!你這毒婦竟也來(lái)了扔字?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤温技,失蹤者是張志新(化名)和其女友劉穎革为,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舵鳞,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡震檩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜓堕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抛虏。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖套才,靈堂內(nèi)的尸體忽然破棺而出迂猴,到底是詐尸還是另有隱情,我是刑警寧澤背伴,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布沸毁,位于F島的核電站,受9級(jí)特大地震影響傻寂,放射性物質(zhì)發(fā)生泄漏息尺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一疾掰、第九天 我趴在偏房一處隱蔽的房頂上張望搂誉。 院中可真熱鬧,春花似錦静檬、人聲如沸炭懊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凛虽。三九已至,卻和暖如春广恢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呀潭。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工钉迷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钠署。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓糠聪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親谐鼎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舰蟆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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