1. Servlet
1.1 Servlet簡介
Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務(wù)程序或服務(wù)連接器,用Java編寫的服務(wù)器端程序,具有獨(dú)立于平臺(tái)和協(xié)議的特性,主要功能在于交互式地瀏覽和生成數(shù)據(jù),生成動(dòng)態(tài)Web內(nèi)容。
- 把實(shí)現(xiàn)了Sun公司開發(fā)的Servlet接口的java程序叫做Servlet
1.2 第一個(gè)Servlet程序
-
構(gòu)建一個(gè)普通的Maven項(xiàng)目(可以刪除src目錄,方便都會(huì)創(chuàng)建子項(xiàng)目)(具體如何構(gòu)建看我上一篇文章)
-
Maven添加jsp,servlet依賴--
-
去官網(wǎng) Maven Repository: Search/Browse/Explore (mvnrepository.com)搜索Java Servlet API找到對(duì)應(yīng)版本復(fù)制Maven依賴代碼如:
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
-
復(fù)制到maven項(xiàng)目中pom.xml的依賴模塊中如:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
刷新項(xiàng)目導(dǎo)入依賴
-
-
同理到官網(wǎng)找到j(luò)sp的依賴JavaServer Pages(TM) API導(dǎo)入
-
-
創(chuàng)建一個(gè)子模塊(Maven的web項(xiàng)目)
-
父項(xiàng)目中(pom.xml):
<modules> <module>SonMaven</module> </modules>
-
子項(xiàng)目中(pom.xml):
<parent> <artifactId>javaweb</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent>
- 子項(xiàng)目可以直接使用父項(xiàng)目的jar包,就是java的exntend
-
-
-
給子項(xiàng)目中的webapp/WEN-INF/web.xml換成最新的,否則以后可能某些東西無法創(chuàng)建
? 可以參考如:
```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"
metadata-complete="true">
</web-app>
```
- 最好在main中創(chuàng)建一個(gè)java 一個(gè)resources文件夾符合maven規(guī)范以后有用
-
java文件夾中創(chuàng)建servlet文件
-
創(chuàng)建一個(gè)普通java類
-
實(shí)現(xiàn)servlet接口,我們一般直接通過繼承HttpServlet實(shí)現(xiàn)
-
servlet接口的另外一個(gè)實(shí)現(xiàn)類是GenericServlet,實(shí)際上是GenericServlet實(shí)現(xiàn)了Servlet,而HttpServlet繼承GenericServlet
-
servlet接口有一些方法,GenericServlet相對(duì)幾乎沒變,而HttpServle則多了許多方法其中doGet和doPost方法比較重要
void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy();
-
重寫HttpServlet的doGet和doPost方法(當(dāng)然其他方法也可以但是目前用不到)
public class MyFirstServlet extends HttpServlet { // 由于get和post這是請(qǐng)求實(shí)現(xiàn)的不同方式,可以相互調(diào)用邏輯都一樣 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 自己寫的 PrintWriter writer = resp.getWriter();//響應(yīng)流 writer.print("Hello,Serlvlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
-
-
編寫Servlet的映射
為什么需要映射:我們寫的是Java程序但是需要通過瀏覽器訪問,而瀏覽器需要連接web服務(wù)器,使用需要再web服務(wù)中注冊(cè)我們寫的Servlet,還需要一個(gè)瀏覽器訪問路徑
配置到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" metadata-complete="true"> <!--注冊(cè)servlet--> <servlet> <servlet-name>hello</servlet-name> <!-- 剛才寫的serverlet位置相對(duì)于java文件夾--> <servlet-class>MyFirstServlet</servlet-class> </servlet> <!-- servlet的請(qǐng)求路徑--> <servlet-mapping> <servlet-name>hello</servlet-name> <!-- 瀏覽器查看的url--> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
-
配置Tomcat
之前寫過,不再贅述,只是強(qiáng)調(diào)一個(gè)出現(xiàn)的問題:tomcat部署時(shí)沒有自己需要部署的項(xiàng)目:
中deployment點(diǎn)擊加號(hào)沒有出現(xiàn)artifact
Tomcat是一個(gè)開源的Java Servlet容器,用于運(yùn)行JavaWeb應(yīng)用程序。在部署應(yīng)用程序之前,需要在Tomcat中進(jìn)行相關(guān)的配置。 部署應(yīng)用程序的最常見方式是將應(yīng)用程序打成.war包。
? 通過這篇文章解決大概之后刷新maven后,成功出現(xiàn)
-
運(yùn)行測試:
這個(gè)頁面出自index.jsp是主項(xiàng)目默認(rèn)頁面,如果沒有servlet覆蓋主路徑,默認(rèn)主路徑顯示這個(gè)。我們后面細(xì)說
? 這是我們?cè)趙eb.xml 中配置的瀏覽器訪問路徑
1.3 Servlet原理
-
Servlet是由web服務(wù)器調(diào)用,當(dāng)Web服務(wù)器接收到一個(gè)瀏覽器的請(qǐng)求時(shí),它會(huì)先判斷請(qǐng)求內(nèi)容——如果是靜態(tài)網(wǎng)頁數(shù)據(jù),Web服務(wù)器將會(huì)自行處理,然后產(chǎn)生響應(yīng)信息;如果牽涉到動(dòng)態(tài)數(shù)據(jù),Web服務(wù)器會(huì)將請(qǐng)求轉(zhuǎn)交給Servlet容器。此時(shí)Servlet容器會(huì)找到對(duì)應(yīng)的處理該請(qǐng)求的Servlet實(shí)例來處理,結(jié)果會(huì)送回Web服務(wù)器,再由Web服務(wù)器傳回用戶端。
針對(duì)同一個(gè)Servlet,Servlet容器會(huì)在第一次收到http請(qǐng)求時(shí)建立一個(gè)Servlet實(shí)例,然后啟動(dòng)一個(gè)線程。第二次收到http請(qǐng)求時(shí),Servlet容器無須建立相同的Servlet實(shí)例,而是啟動(dòng)第二個(gè)線程來服務(wù)客戶端請(qǐng)求。所以多線程方式不但可以提高Web應(yīng)用程序的執(zhí)行效率,也可以降低Web服務(wù)器的系統(tǒng)負(fù)擔(dān)。
參考時(shí)序圖:
-
Web Client 向Servlet容器(Tomcat)發(fā)出Http請(qǐng)求;
-
Servlet容器接收Web Client的請(qǐng)求;
-
Servlet容器創(chuàng)建一個(gè)HttpRequest對(duì)象,將Web Client請(qǐng)求的信息封裝到這個(gè)對(duì)象中;
-
Servlet容器創(chuàng)建一個(gè)HttpResponse對(duì)象;
-
Servlet容器調(diào)用HttpServlet對(duì)象的service方法,
-
HttpRequest對(duì)象與HttpResponse對(duì)象作為參數(shù)傳給 HttpServlet對(duì)象;
-
HttpServlet調(diào)用HttpRequest對(duì)象的有關(guān)方法,獲取Http請(qǐng)求信息;
-
HttpServlet調(diào)用HttpResponse對(duì)象的有關(guān)方法,生成響應(yīng)數(shù)據(jù);
-
Servlet容器把HttpServlet的響應(yīng)結(jié)果傳給Web Client;
上述來自該文章
鏈接:https://www.jianshu.com/p/7dcd2c689729
1.4 Mapping問題
一個(gè)servlet可以指定一個(gè)、多個(gè)、通用的路徑:文章來源:http://www.zghlxwxcb.cn/news/detail-481895.html
<servlet-mapping>
<servlet-name>hello</servlet-name>
//這是一個(gè)路徑,多個(gè)就是多粘貼幾個(gè)<servlet-mapping>每個(gè)給的路徑不同
<url-pattern>/hello</url-pattern>
//通用: /hello/后面使用的所有路徑都到這個(gè)servlet
//<url-pattern>/hello/*</url-pattern>
//后面這個(gè)的意思是以.aaa結(jié)尾的都可以
//<url-pattern>*.aaa</url-pattern>
</servlet-mapping>
另外當(dāng)出現(xiàn)兩個(gè)servlet路徑重疊的情況,路徑范圍小的優(yōu)先級(jí)高文章來源地址http://www.zghlxwxcb.cn/news/detail-481895.html
到了這里,關(guān)于servlet介紹和如何在idea中寫一個(gè)servlet程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!