文章目錄
- 1. Servlet 簡介
- 2. HelloServlet
- 3. Servlet原理
- 4. Mapping問題
- 5. ServletContext
1. Servlet 簡介
把實現了Servlet接口的Java程序叫做 Servlet
2. HelloServlet
Serlvet接口Sun公司有兩個默認的實現類:HttpServlet,GenericServlet
(1)構建一個普通的Maven項目,刪掉里面的src目錄,以后我們的學習就在這個項目里面建立Moudel;這個空的工程就是Maven主工程;
舉例:先創建一個普通的Maven項目,命名為javaweb-02-servlet,再刪掉里面的src目錄,增加dependencipes,最后在此項目里建立一個Moudel,命名為servlet-01
建立Moudel
(2)關于Maven父子工程的理解
父項目中會有
<modules><module>servlet
-01</module
></modules
>
子項目會有
<parent><artifactId>javaweb
-02-servlet
</artifactId
><groupId>com
.kuang
</groupId
><version>1.0-SNAPSHOT
</version
></parent
>
父項目中的java子項目可以直接使用
son
extends father
(3)Maven環境優化
- 修改web.xml為最新的
- 將maven的結構搭建完整
在main目錄下創建java和resources兩個包,并進行標記
(4)編寫一個Servlet程序
①編寫一個普通類
②實現Servlet接口,這里我們直接繼承HttpServlet
package com
.zz
.servlet
;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
;public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{PrintWriter writer
= resp
.getWriter(); writer
.print("Hello,Serlvet");}@Overrideprotected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{doGet(req
, resp
);}
}
(5)編寫Servlet的映射
為什么需要映射:我們寫的是JAVA程序,但是要通過瀏覽器訪問,而瀏覽器需要連接web服務器,所以我們需要在web服務中注冊我們寫的Servlet,還需給他一個瀏覽器能夠訪問的路徑;
<!--注冊Servlet
--><servlet><servlet
-name
>hello
</servlet
-name
><servlet
-class>com
.zz
.servlet
.HelloServlet
</servlet
-class></servlet
><!--Servlet的請求路徑
--><servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>/hello
</url
-pattern
></servlet
-mapping
>
(6)配置Tomcat
注意:配置項目發布的路徑就可以了
(7)啟動測試,OK!
點擊右上方的啟動按鈕,運行成功后會生成一個名為target文件夾
3. Servlet原理
Servlet是由Web服務器調用,web服務器在收到瀏覽器請求之后,會:
4. Mapping問題
(1)一個Servlet可以指定一個映射路徑
<servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>/hello
</url
-pattern
></servlet
-mapping
>
(2)一個Servlet可以指定多個映射路徑
<servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>/hello
</url
-pattern
></servlet
-mapping
><servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>/hello2
</url
-pattern
></servlet
-mapping
><servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>/hello3
</url
-pattern
></servlet
-mapping
><servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>/hello4
</url
-pattern
></servlet
-mapping
>
(3)一個Servlet可以指定通用映射路徑
<servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>/hello
(4)默認請求路徑
<servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>
(5)指定一些后綴或者前綴等
<!--可以自定義后綴實現請求映射注意點
*前面不能加項目映射的路徑hello
/sajdlkajda
.zz 也可以
-->
<servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>*.zz
</url
-pattern
>
</servlet
-mapping
>
注意:點*前面不能加項目映射的路徑,即去掉點 * 前面的 / 符號
(6)優先級問題
指定了固有的映射路徑優先級最高,如果找不到就會走默認的處理請求;
<!--注冊Servlet
--><servlet><servlet
-name
>hello
</servlet
-name
><servlet
-class>com
.zz
.servlet
.HelloServlet
</servlet
-class></servlet
><!--Servlet的請求路徑
--><servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>/hello
</url
-pattern
></servlet
-mapping
><!--注冊Servlet
--><servlet><servlet
-name
>error
</servlet
-name
><servlet
-class>com
.zz
.servlet
.ErrorServlet
</servlet
-class></servlet
><!--Servlet的請求路徑
--><servlet
-mapping
><servlet
-name
>error
</servlet
-name
><url
-pattern
>
由上圖可知,hello也屬于/* ,但輸入hello,進入的是HelloServlet
5. ServletContext
web容器在啟動的時候,它會為每個web程序都創建一個對應的ServletContext對象,它代表了當前的web應用,具體有如下應用
(1)共享數據
我在這個Servlet中保存的數據,可以在另外一個servlet中拿到;
HelloServlet 中的代碼:
package com
.zz
.servlet
;import javax
.servlet
.ServletContext
;
import javax
.servlet
.ServletException
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;public class HelloServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{ServletContext context
= this.getServletContext();String username
= "大佬"; context
.setAttribute("username", username
);}
}
GetServlet 中的代碼:
package com
.zz
.servlet
;import javax
.servlet
.ServletContext
;
import javax
.servlet
.ServletException
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;public class GetServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{ServletContext context
= this.getServletContext();String username
= (String
) context
.getAttribute("username");resp
.setContentType("text/html");resp
.setCharacterEncoding("utf-8");resp
.getWriter().print("名字為"+username
);}@Overrideprotected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{doGet(req
, resp
);}
}
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
/javaeehttp
://xmlns
.jcp
.org
/xml
/ns
/javaee
/web
-app_4_0
.xsd"version
="4.0"metadata
-complete
="true"><!--注冊Servlet
--><servlet><servlet
-name
>hello
</servlet
-name
><servlet
-class>com
.zz
.servlet
.HelloServlet
</servlet
-class></servlet
><!--Servlet的請求路徑
--><servlet
-mapping
><servlet
-name
>hello
</servlet
-name
><url
-pattern
>/hello
</url
-pattern
></servlet
-mapping
><servlet><servlet
-name
>getc
</servlet
-name
><servlet
-class>com
.zz
.servlet
.GetServlet
</servlet
-class></servlet
><servlet
-mapping
><servlet
-name
>getc
</servlet
-name
><url
-pattern
>/getc
</url
-pattern
></servlet
-mapping
></web
-app
>
測試訪問結果:
- 直接輸入getc
- 先輸入hello ,再輸入getc
(2)獲取初始化參數
創建ServletDemo03
package com
.zz
.servlet
;import javax
.servlet
.ServletContext
;
import javax
.servlet
.ServletException
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;public class ServletDemo03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{ServletContext context
= this.getServletContext();String url
= context
.getInitParameter("url");resp
.getWriter().print(url
);}@Overrideprotected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{doGet(req
, resp
);}
}
在web.xml 中添加如下配置:
<!--配置一些web應用初始化參數
--><context
-param
><param
-name
>url
</param
-name
><param
-value
>jdbc
:mysql
://localhost
:3306/mybatis
</param
-value
></context
-param
>
<servlet><servlet
-name
>gp
</servlet
-name
><servlet
-class>com
.zz
.servlet
.ServletDemo03
</servlet
-class></servlet
><servlet
-mapping
><servlet
-name
>gp
</servlet
-name
><url
-pattern
>/gp
</url
-pattern
></servlet
-mapping
>
測試訪問結果:
(3)請求轉發
創建ServletDemo04
package com
.zz
.servlet
;import javax
.servlet
.ServletContext
;
import javax
.servlet
.ServletException
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;public class ServletDemo04 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{ServletContext context
= this.getServletContext();System
.out
.println("進入了ServletDemo04");context
.getRequestDispatcher("/gp").forward(req
,resp
);}@Overrideprotected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{doGet(req
, resp
);}
}
在web.xml 中添加如下配置:
<servlet><servlet
-name
>sd4
</servlet
-name
><servlet
-class>com
.zz
.servlet
.ServletDemo04
</servlet
-class></servlet
><servlet
-mapping
><servlet
-name
>sd4
</servlet
-name
><url
-pattern
>/sd4
</url
-pattern
></servlet
-mapping
>
測試訪問結果:
可以看出,訪問到的是gp的界面,但訪問地址并不會發生變化
(4)讀取資源文件
Properties
- 在java目錄下新建aa.properties
username=root123
password=hahaha123 - 在resources目錄下新建db.properties
username=root
password=123456
點擊Tomcat運行后,發現db.properties在目錄下,但aa.properties 不在
解決方法:在當前pom.xml文件的build中配置resources,來防止我們資源導出失敗的問題
<build><resources><resource><directory>src
/main
/resources
</directory
><includes><include>***.xml
</include
></includes
><filtering>true</filtering
></resource
><resource><directory>src
/main
/java
</directory
><includes><include>***.xml
</include
></includes
><filtering>true</filtering
></resource
></resources
>
</build
>
再次點擊Tomcat運行后發現:都被打包到了同一個路徑下:classes,我們俗稱這個路徑為classpath:
- 創建ServletDemo05,讀取資源文件aa.properties
思路:需要一個文件流
package com
.zz
.servlet
;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
.InputStream
;
import java
.util
.Properties
;public class ServletDemo05 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{InputStream is
= this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/zz/servlet/aa.properties");Properties prop
= new Properties();prop
.load(is
);String user
= prop
.getProperty("username");String pwd
= prop
.getProperty("password");resp
.getWriter().print(user
+":"+pwd
);}@Overrideprotected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{doGet(req
, resp
);}
}
<servlet><servlet
-name
>sd5
</servlet
-name
><servlet
-class>com
.zz
.servlet
.ServletDemo05
</servlet
-class></servlet
><servlet
-mapping
><servlet
-name
>sd5
</servlet
-name
><url
-pattern
>/sd5
</url
-pattern
></servlet
-mapping
>
測試訪問結果:
讀取資源文件db.properties 與上同理。
總結
以上是生活随笔為你收集整理的JavaWeb(五)——Servlet、Mapping问题、ServletContext的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。