Java Web(2) 創(chuàng)建servlet

[toc]

1. 簡(jiǎn)易demo

Servlet開發(fā)流程:

  • 創(chuàng)建Servlet類,繼承HttpServlet。
  • 重寫service方法等,編寫代碼
  • 配置web.xml.綁定URL

1.1. 創(chuàng)建應(yīng)用

使用IDEA創(chuàng)建web應(yīng)用(File->new->project->Java Enterprise):

webapplication.png

生成如下項(xiàng)目結(jié)構(gòu):
項(xiàng)目結(jié)構(gòu).png

1.2. 創(chuàng)建Servlet

在src中創(chuàng)建繼承HttpServlet類的FirstServlet(然后右鍵->generate->override Method,可以直接選擇父類HttpServlet的方法)


public class FirstServlet extends HttpServlet {

//service為請(qǐng)求處理的核心方法,無(wú)論是get還是post都會(huì)被service方法處理
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受請(qǐng)求發(fā)來(lái)的參數(shù)
        String name = req.getParameter("name");
        String html = "<h1 style='color:red'>hi," + name + "</h1><hr/>";
        PrintWriter out = resp.getWriter();
        out.println(html); //將htnl返回給瀏覽器
    }
}

1.3. 配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <display-name>FirstServlet</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <!-- 聲明servlet -->
    <servlet>
        <!-- servlet的別名 -->
        <servlet-name>first</servlet-name>
        <!--servlet的包名-->
        <servlet-class>com.example.FirstServlet</servlet-class>
    </servlet>
    <!-- 將servlet與URL綁定-->
    <servlet-mapping>
        <servlet-name>first</servlet-name>
        <url-pattern>/hi</url-pattern>
    </servlet-mapping>
</web-app>

1.4. 啟動(dòng)應(yīng)用

進(jìn)行配置寞蚌,然后點(diǎn)擊run.


configurations.png

2. Tomcat部署

但是有一個(gè)問(wèn)題,就是當(dāng)項(xiàng)目部署后钠糊,我們打開tomcat的webapps目錄下挟秤,并找不到生成的項(xiàng)目。如果在/tomcat/webapps找不到項(xiàng)目抄伍,tomcat怎么能啟動(dòng)項(xiàng)目的呢艘刚?這是因?yàn)槲覀兪褂玫氖?a target="_blank">idea。
Tomcat部署有以下這些方式:

  • 利用Tomcat自動(dòng)部署:項(xiàng)目放到webapps目錄下,啟動(dòng)tomcat,就回自動(dòng)部署截珍。
  • 利用控制臺(tái)進(jìn)行部署:控制臺(tái)不是說(shuō)cmd,而是tomcat啟動(dòng)后進(jìn)入root頁(yè)面,有個(gè)manager管理部署項(xiàng)目攀甚。進(jìn)入tomcat的manager控制臺(tái)的deploy區(qū)域進(jìn)行設(shè)置就可以部署。
  • 使用eclipse:一般自動(dòng)放到/tomcat/webapps岗喉,也可以設(shè)置(略)秋度。
  • 使用IDEA:可以增加自定義的Web部署文件(%Tomcat_Home%\conf\Catalina\localhost\platform-zwml-admin.xml)。也可以通過(guò)IDE設(shè)置钱床。
    打開項(xiàng)目的Project Structure -> artifacts, 設(shè)置output directory:
    output.png

    可以發(fā)現(xiàn)默認(rèn)output就是項(xiàng)目的out文件夾:
    默認(rèn)output.png

3. Java Web目錄

3.1 Java Web工程目錄

以IDEA為例:


idea中Java Web目錄.png
組織結(jié)構(gòu) 描述
/src 寫Java代碼的地方荚斯,如Servlet、JavaBean等
/out 項(xiàng)目的生成目錄查牌,可以通過(guò)Project Structure設(shè)置成其他地方,放在 tomcat/webapps下可直接訪問(wèn)
/web 用來(lái)存放 JSP事期,JS,CSS纸颜,圖片等文件兽泣,是項(xiàng)目訪問(wèn)的默認(rèn)路徑
/web/WEB-INF WEB應(yīng)用的安全目錄,用于存放配置文件
/web/WEB-INF/web.xml web.xml是Web項(xiàng)目核心配置文件
/web/WEB-INF/lib 用于存放web應(yīng)用依賴的jar文件胁孙,一般將外部jar放到此處唠倦,刷新后就可以在/src中使用

3.2 Tomcat應(yīng)用目錄

tomcat部署應(yīng)用的目錄如下:

組織結(jié)構(gòu) 描述
tomcat安裝目錄/webapps Tomcat應(yīng)用根目錄
/web應(yīng)用目錄 Java Web 應(yīng)用目錄
/web應(yīng)用目錄/index.html or index.jsp 默認(rèn)首頁(yè)(可以在web.xml指定首頁(yè))
/web應(yīng)用目錄/WEB-INF WEB應(yīng)用的安全目錄,外部不能訪問(wèn) ,用于存放配置文件
/web應(yīng)用目錄/WEB-INF/web.xml web.xml是“部署描述符文件”浊洞,是該Web項(xiàng)目核心配置文件
/web應(yīng)用目錄/WEB-INF/classes 存放編譯后的classes文件
/web應(yīng)用目錄/WEB-INF/lib 用于存放web應(yīng)用依賴的jar文件
/web應(yīng)用目錄/META-INF/MANIFEST.MF 包含Web應(yīng)用的版本等信息

3.1 Java Web工程目錄轉(zhuǎn)化為Tomcat應(yīng)用目錄

當(dāng)我們?cè)贗DEA中點(diǎn)擊運(yùn)行時(shí)牵敷, Java Web工程目錄會(huì)被轉(zhuǎn)化為Tomcat能夠運(yùn)行的目錄結(jié)構(gòu)胡岔。


生成目錄.png

我們會(huì)發(fā)現(xiàn)生成的應(yīng)用目錄LoginServlet和工程目錄的/web大體一致法希,除了WEB-INF外的其他部分不變。
工程項(xiàng)目中的/src中的Java代碼會(huì)被編譯成class,存放到LoginServlet/WEB-INF/classes中靶瘸。
/web中的內(nèi)容會(huì)在應(yīng)用目錄LoginServlet/WEB-INF/classes/web中備份一份苫亦。

4. Get與Post請(qǐng)求

4.1 Get請(qǐng)求

  • Get請(qǐng)求是將數(shù)據(jù)通過(guò)在URL附加數(shù)據(jù)顯性向服務(wù)器發(fā)送數(shù)據(jù)毛肋。http://localhost:8080/tryServlet/first?name=liming
    get.png

4.2 Pos請(qǐng)求

  • Post請(qǐng)求會(huì)將數(shù)據(jù)存放在“請(qǐng)求體”中隱性向服務(wù)器發(fā)送數(shù)據(jù): http://localhost:8080/tryServlet/first,請(qǐng)求體:name=liming.
    post.png

4.3 處理Get和Post

兩者到服務(wù)器獲取的parameter沒(méi)區(qū)別。
service為請(qǐng)求處理的核心方法屋剑,無(wú)論是get還是post都會(huì)被service方法處理润匙。
如何分別處理getpost?

  • 所有請(qǐng)求:service
  • Get請(qǐng)求: doGet
  • Post請(qǐng)求:doPost
public class RequestMethodServlet extends HttpServlet {
    //處理get請(qǐng)求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        resp.getWriter().println("<h1 >" + name + "</h1>");
    }
    //處理post請(qǐng)求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        resp.getWriter().println("<h1>" + name + "</h1>");
    }
}

5. Servlet生命周期

  • 裝載 - 查看web.xml
  • 創(chuàng)建 - 構(gòu)造函數(shù)
  • 初始化- 在Servlet的生命周期中,僅執(zhí)行一次init()方法唉匾。它是在服務(wù)器裝入Servlet時(shí)執(zhí)行的孕讳,負(fù)責(zé)初始化Servlet對(duì)象∥”欤可以配置服務(wù)器厂财,以在啟動(dòng)服務(wù)器或客戶機(jī)首次訪問(wèn)Servlet時(shí)裝入Servlet。無(wú)論有多少客戶機(jī)訪問(wèn)Servlet礁凡,都不會(huì)重復(fù)執(zhí)行init()吨艇。
  • 提供服務(wù) -service(),doGet(),doPost()
  • 銷毀 - 僅執(zhí)行一次眠副,在服務(wù)器端停止且卸載Servlet時(shí)執(zhí)行該方法。當(dāng)Servlet對(duì)象退出生命周期時(shí)荚恶,負(fù)責(zé)釋放占用的資源。一個(gè)Servlet在運(yùn)行service()方法時(shí)可能會(huì)產(chǎn)生其他的線程磷支,因此需要確認(rèn)在調(diào)用destroy()方法時(shí)谒撼,這些線程已經(jīng)終止或完成。

與 CGI 的區(qū)別在于齐唆,Servlet 處于服務(wù)器進(jìn)程中嗤栓,它通過(guò)多線程方式運(yùn)行其 service 方法,一個(gè)實(shí)例可以運(yùn)行多個(gè)請(qǐng)求箍邮,并且其實(shí)例一般不會(huì)銷毀茉帅,而 CGI 對(duì)每個(gè)請(qǐng)求都產(chǎn)生新的進(jìn)程,服務(wù)完成后就銷毀锭弊,所以效率上低于 Servlet堪澎。


servlet生命周期.jpg

6.注解簡(jiǎn)化配置

隨著項(xiàng)目的擴(kuò)大,web.xml會(huì)越來(lái)越長(zhǎng)味滞,難以維護(hù)樱蛤,每次修改Servlet都要修改相應(yīng)的web.xml的內(nèi)容。Servlet3.0之后引入了注解annotation來(lái)簡(jiǎn)化配置剑鞍。
Servlet的核心注解為@WebServlet昨凡。

package com.example;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/first")
public class FirstServlet extends HttpServlet {
//service為請(qǐng)求處理的核心方法,無(wú)論是get還是post都會(huì)被service方法處理
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受請(qǐng)求發(fā)來(lái)的參數(shù)
        String name = req.getParameter("name");
        String html = "<h1 style='color:red'>hi," + name + "</h1><hr/>";
        PrintWriter out = resp.getWriter();
        out.println(html); //將htnl返回給瀏覽器
    }
}

7.啟動(dòng)時(shí)加載Servlet

servlet一般在第一次請(qǐng)求后進(jìn)行初始化蚁署,通過(guò)啟動(dòng)時(shí)加載 可以提前加載servlet便脊。通常重寫init()方法,進(jìn)行項(xiàng)目的一些預(yù)處理光戈。

7.1 web.xml

web.xml使用<load-on-startup>設(shè)置啟動(dòng)加載哪痰。啟動(dòng)時(shí)加載在工作中常用于系統(tǒng)的預(yù)處理遂赠。(預(yù)處理可以時(shí)實(shí)際工作時(shí)效率更高)

<!-- 0優(yōu)先級(jí)最高-->
<load-on-startup>0~9999</load-on-startup>

7.2 annotition注解

@WebServlet(urlPatterns = "/unused", loadOnStartup = 2)
public class RequestMethodServlet extends HttpServlet { //...}

8.ServletContext和ServletConfig

8.1 .ServletConfig

在運(yùn)行 Servlet 程序時(shí),可能需要一些輔助信息晌杰,例如跷睦,文件使用的編碼、使用 Servlet 程序的共享信息等肋演,這些信息可以在 web.xml 文件中使用一個(gè)或多個(gè) <init-param> 元素進(jìn)行配置抑诸。當(dāng) Tomcat 初始化一個(gè) Servlet 時(shí),會(huì)將該 Servlet 的配置信息封裝到 ServletConfig 對(duì)象中爹殊,此時(shí)可以通過(guò)調(diào)用 init(ServletConfig config)方法將 ServletConfig 對(duì)象傳遞servlet哼鬓。

xml
<servlet>
  <servlet-name>Servlet1</servlet-name>
  <servlet-class>com.Servlet1</servlet-class>
  <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
  </init-param>
</servlet>
//ava
 ServletConfig config = this.getServletConfig();
 String param = config.getInitParameter("encoding");

8.2 .ServletContext

當(dāng) Tomcat 啟動(dòng)時(shí),Tomcat 會(huì)為每個(gè) Web 應(yīng)用創(chuàng)建一個(gè)唯一的 ServletContext 對(duì)象代表當(dāng)前的 Web 應(yīng)用边灭,該對(duì)象封裝了當(dāng)前 Web 應(yīng)用的所有信息异希。可以利用該對(duì)象獲取 Web 應(yīng)用程序的初始化信息绒瘦、讀取資源文件等称簿。

learn more

這里只是簡(jiǎn)要介紹以下Sevlet,具體可以參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惰帽,隨后出現(xiàn)的幾起案子憨降,更是在濱河造成了極大的恐慌,老刑警劉巖该酗,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件授药,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡呜魄,警方通過(guò)查閱死者的電腦和手機(jī)悔叽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爵嗅,“玉大人娇澎,你說(shuō)我怎么就攤上這事《蒙梗” “怎么了趟庄?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)伪很。 經(jīng)常有香客問(wèn)我戚啥,道長(zhǎng),這世上最難降的妖魔是什么锉试? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任猫十,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炫彩。我一直安慰自己,他們只是感情好絮短,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布江兢。 她就那樣靜靜地躺著,像睡著了一般丁频。 火紅的嫁衣襯著肌膚如雪杉允。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天席里,我揣著相機(jī)與錄音叔磷,去河邊找鬼。 笑死奖磁,一個(gè)胖子當(dāng)著我的面吹牛改基,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咖为,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼秕狰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了躁染?” 一聲冷哼從身側(cè)響起鸣哀,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吞彤,沒(méi)想到半個(gè)月后我衬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饰恕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年挠羔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埋嵌。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褥赊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莉恼,到底是詐尸還是另有隱情拌喉,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布俐银,位于F島的核電站尿背,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捶惜。R本人自食惡果不足惜田藐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汽久,春花似錦鹤竭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至三痰,卻和暖如春吧寺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背散劫。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工稚机, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人获搏。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓赖条,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親常熙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谋币,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355