前一天我們介紹了tomcat與IDEA的整合,從無到有架構了web的項目從開發->構建->佈署走了一回,今天我們正式踏入Servlet的領域。
介紹Servlet前我們先來看一下在Server上的兩種資源
File -> New -> module
輸入專案名稱,選擇Archetype為webapp的選項
建立後maven跑完就會有以下路徑了,是不是很快呢
接著src資料夾右鍵
創建java資料夾作為撰寫servlet的路徑,其他標準Maven資料夾可按需創建
Edit configuration
加入day04:war exploded,修改Application Context
啟動tomcat,訪問localhost:8080
調整pom檔,移除用不到的junit,加入前一天提到servlet需要的servlet-api
<dependencies>
<!-- copy from maven repository https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api/6.0.0 -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
首先我們這次的30天挑戰並不會說到jsp,我們先把由maven自動產生的index.jsp刪除,
創建index.html
<body>
<form action="get" action="HelloServlet">
請輸入大名 <input type="username"><br>
<input type="submit" value="Submit">
</form>
</body>
implements Servlet會產生很多override方法,我們重寫service方法
@Override
public void service(ServletRequest request, ServletResponse response) throws IOException {
//get parameter from request
String username = request.getParameter("username");
//handle parameter
String helloMessage = "Hello " + username + "!";
//add message to request
response.getWriter().write(helloMessage);
}
調整web.xml(部署描述檔Deployment Descriptors,簡稱DD檔),由於maven產生的版本比較舊,我們先刪除舊的再透過IDEA重新產生6.0的DD檔
建立6.0的DD檔
url-pattern就是瀏覽器訪問的網址路徑,web container透過這個設定mapping找到對應的Servlet來處理請求
<?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>HandleHelloServlet</servlet-name>
<servlet-class>com.swj.HandleHelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HandleHelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
我們會發現GET請求會將請求參數連同請求網址由?分隔帶到Server端請求
我們修改前面index.html中form表單method為post
<body>
<form action="post" action="HelloServlet">
請輸入大名 <input type="username"><br>
<input type="submit" value="Submit">
</form>
</body>
post請求不會把請求數據放在url中
請求數據放在body中