[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
):
生成如下項(xiàng)目結(jié)構(gòu):
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.
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為例:
組織結(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)胡岔。
我們會(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
方法處理润匙。
如何分別處理get
和post
?
- 所有請(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堪澎。
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,具體可以參考: