iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0
Software Development

從Servlet到Spring MVC系列 第 6

Day05 Servlet - URL Pattern and Misc

  • 分享至 

  • xImage
  •  

前言

Day04我們透過Maven構建了專案,相較Day03透過IDE一步一步構建專案,再自己去引入專案相依的Jar檔真的是輕鬆不少,未來皆會以maven的方式並作為日後每日module的起手式。

創建module

創建module day05

https://ithelp.ithome.com.tw/upload/images/20240920/2012808428uWx2lJYX.png

maven 加入servlet api

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.0.0</version>
    <scope>provided</scope>
  </dependency>

創建java資料夾

day05 src資料夾右鍵 -> New -> Directory
https://ithelp.ithome.com.tw/upload/images/20240920/20128084Fe2F1PlTOh.png
選取java資料夾
https://ithelp.ithome.com.tw/upload/images/20240920/20128084bZXJ9gLeTD.png

創建xsd 6.0的部署描述檔

調整web.xml(部署描述檔Deployment Descriptors,簡稱DD檔),由於maven產生的版本比較舊,我們先刪除舊的再透過IDEA重新產生6.0的DD檔
https://ithelp.ithome.com.tw/upload/images/20240920/20128084sp5ugeL4Wj.png
建立6.0的DD檔
https://ithelp.ithome.com.tw/upload/images/20240920/201280840f8Gf7NPeS.png

加入tomcat

edit configurations..
https://ithelp.ithome.com.tw/upload/images/20240920/20128084uV1Jq4W4Ha.png
https://ithelp.ithome.com.tw/upload/images/20240920/201280845f0Es4QMWI.png
https://ithelp.ithome.com.tw/upload/images/20240920/20128084znXTuMsA9e.png
修改Application Context
https://ithelp.ithome.com.tw/upload/images/20240920/2012808430a7vbYtdZ.png
啟動並訪問MyWebApp
https://ithelp.ithome.com.tw/upload/images/20240920/20128084iwiXgWEEw2.png
確認無誤後刪除index.jsp

day06範例建web.xml設定servlet mapping

web.xml設定

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
         version="6.0">
    <servlet>
        <servlet-name>HelloWorldServlet</servlet-name>
        <servlet-class>com.swj.HandleHelloWorldServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloWorldServlet</servlet-name>
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>
</web-app>

創建HandleHelloWorldServlet

day05 java資料夾右鍵 -> New -> class
https://ithelp.ithome.com.tw/upload/images/20240920/20128084uhKXywefJo.png
輸入com.swj.HandleHelloWorldServlet
https://ithelp.ithome.com.tw/upload/images/20240920/20128084XioStsxuCw.png

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    String message = "<h1>Hello World!!!!!~~~</h1>";
    res.getWriter().write(message);
}

一、servlet api 導入問題

你會發現我們在day03透過引入tomcat server時會帶上servlet api
https://ithelp.ithome.com.tw/upload/images/20240920/20128084JFNePO6SCU.png
或是maven加入servlet api 它的scope都是provided
https://ithelp.ithome.com.tw/upload/images/20240920/201280848QBqp9EsI7.png
provided的意思是說只有在編譯、測試會被加到class path,所以在build的時候並不會包含servlet api,為什麼呢?因為當我們部署到tomcat的lib資料夾中就有servlet api的jar檔
https://ithelp.ithome.com.tw/upload/images/20240920/20128084EaDbgy1qi4.png

二、Content-Type

content type亦稱作為mime type用來告訴瀏覽器response的檔案類型是什麼,這樣瀏覽器就會按照它設定的行為去處理它

動態資源

我們在HandleHelloWorldServlet並未設定Content-Type,tomcat也未幫我們設置。我們在Servlet中設定的顯示字串為

String message = "<h1>Hello World!!!!!~~~</h1>";

我們在瀏覽器訪問頁面的時候可以發現response header並未設定Content-Type,但瀏覽器並未出現html標籤,這表示瀏覽器預設的Content-Type就是text/html。
https://ithelp.ithome.com.tw/upload/images/20240920/20128084J5809VCywU.png
我們在下方設定一下application/json

@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    String message = "<h1>Hello World!!!!!~~~</h1>";
    res.setContentType("application/json");
    res.getWriter().write(message);
}

https://ithelp.ithome.com.tw/upload/images/20240920/20128084DlwOhBmAiL.png

靜態資源

如果你是訪問靜態資源,例如js、css、imag等,tomcat會根據你請求的資源副檔名會去conf路徑下web.xml文件中找到對應的請求頭設置

<mime-mapping>
    <extension>html</extension>
    <mime-type>text/html</mime-type>
</mime-mapping>

我們在webapp下創立static目錄放入一張圖片
https://ithelp.ithome.com.tw/upload/images/20240920/20128084DUfsz77ttL.png
訪問靜態資源
https://ithelp.ithome.com.tw/upload/images/20240920/20128084AtAv73olSB.png
tomcat所在conf資料夾下web.xml
https://ithelp.ithome.com.tw/upload/images/20240920/20128084FIwa3JpVMC.png

三、url pattern

我們來看一下網址url怎麼一步步訪問到Servlet的
https://ithelp.ithome.com.tw/upload/images/20240920/20128084wrjRy2ul87.png

1. 一個servlet name可以對應多個url pattern

<servlet-mapping>
    <servlet-name>HelloWorldServlet</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
    <url-pattern>/Hello</url-pattern>
</servlet-mapping>

https://ithelp.ithome.com.tw/upload/images/20240920/20128084nWUXBi7pnP.png

2. 精確匹配

<url-pattern>/HelloWorld</url-pattern>

3. 模糊匹配

  • *作為通用符,*在哪,哪裡就是模糊的
  • /匹配全部,不包含jsp
    demo 輸入任意的文字
    https://ithelp.ithome.com.tw/upload/images/20240920/20128084Skikn9WVGr.png
    demo jsp
    https://ithelp.ithome.com.tw/upload/images/20240920/20128084JopFcjYgBx.png
  • /*匹配全部,包含jsp
    https://ithelp.ithome.com.tw/upload/images/20240920/20128084lQHdqIZKXQ.png
  • /abc/* 匹配前綴,後綴模糊
    https://ithelp.ithome.com.tw/upload/images/20240920/20128084BocTYyUm5J.png
  • *.action匹配後綴,前綴模糊
    https://ithelp.ithome.com.tw/upload/images/20240920/20128084xebVhcADgO.png

四、Servlets - Annotations

除了使用部署描述檔的設定方式,我們也可以透過Annotation的方式完成servlet的設定,先來創建HandleHelloAnnotationServlet

@WebServlet("/HelloAnnotation")
public class HandleHelloAnnotationServlet implements Servlet {
  @Override
  public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
      res.getWriter().write("Hello Annotation Servlet");
  }
  //以下略
}

訪問路徑/HelloAnnotation
https://ithelp.ithome.com.tw/upload/images/20240920/20128084Bzq3xjaLyG.png

Reference


上一篇
Day04 Servlet - Hello Servlet
下一篇
Day06 Servlet - Servlet Life Cycle
系列文
從Servlet到Spring MVC36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言