日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

JavaWeb(五)——Servlet、Mapping问题、ServletContext

發布時間:2025/3/13 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaWeb(五)——Servlet、Mapping问题、ServletContext 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1. Servlet 簡介
  • 2. HelloServlet
  • 3. Servlet原理
  • 4. Mapping問題
  • 5. ServletContext

1. Servlet 簡介

  • Servlet就是sun公司開發動態web的一門技術

  • Sun在這些API中提供一個接口叫做:Servlet,如果你想開發一個Servlet程序,只需要完成兩個小步驟:

    • 編寫一個類,實現Servlet接口
    • 把開發好的Java類部署到web服務器中

把實現了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 {//由于get或者post只是請求實現的不同的方式,可以相互調用,業務邏輯都一樣;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//ServletOutputStream outputStream = resp.getOutputStream();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/*</url-pattern></servlet-mapping>


(4)默認請求路徑

<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>


(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>/*</url-pattern></servlet-mapping>


由上圖可知,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 {//this.getInitParameter() 初始化參數//this.getServletConfig() Servlet配置//this.getServletContext() Servlet上下文ServletContext context = this.getServletContext();String username = "大佬"; //數據context.setAttribute("username", username);//將一個數據保存在了ServletContext中,名字為: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");//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //轉發的請求路徑//requestDispatcher.forward(req,resp); //調用forward實現請求轉發;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>**/*.properties</include><include>**/*.xml</include></includes><filtering>true</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><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);} }
  • 再在web.xml 中添加如下配置:
<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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。