ServletDemo
一 Servlet簡(jiǎn)介
1.1 動(dòng)態(tài)資源和靜態(tài)資源
靜態(tài)資源
- 無需在程序運(yùn)行時(shí)通過代碼運(yùn)行生成的資源,在程序運(yùn)行之前就寫好的資源. 例如:html css js img ,音頻文件和視頻文件
動(dòng)態(tài)資源
- 需要在程序運(yùn)行時(shí)通過代碼運(yùn)行生成的資源,在程序運(yùn)行之前無法確定的數(shù)據(jù),運(yùn)行時(shí)動(dòng)態(tài)生成,例如Servlet,Thymeleaf ... ...
- 動(dòng)態(tài)資源指的不是視圖上的動(dòng)畫效果或者是簡(jiǎn)單的人機(jī)交互效果
生活舉例
- 去蛋糕店買蛋糕
- 直接買柜臺(tái)上已經(jīng)做好的 : 靜態(tài)資源
- 和柜員說要求后現(xiàn)場(chǎng)制作 : 動(dòng)態(tài)資源
1.2 Servlet簡(jiǎn)介
Servlet (server applet) 是運(yùn)行在服務(wù)端(tomcat)的Java小程序,是sun公司提供一套定義動(dòng)態(tài)資源規(guī)范; 從代碼層面上來講Servlet就是一個(gè)接口
- 用來接收、處理客戶端請(qǐng)求、響應(yīng)給瀏覽器的動(dòng)態(tài)資源。在整個(gè)Web應(yīng)用中,Servlet主要負(fù)責(zé)接收處理請(qǐng)求、協(xié)同調(diào)度功能以及響應(yīng)數(shù)據(jù)。我們可以把Servlet稱為Web應(yīng)用中的控制器

- 不是所有的JAVA類都能用于處理客戶端請(qǐng)求,能處理客戶端請(qǐng)求并做出響應(yīng)的一套技術(shù)標(biāo)準(zhǔn)就是Servlet
- Servlet是運(yùn)行在服務(wù)端的,所以 Servlet必須在WEB項(xiàng)目中開發(fā)且在Tomcat這樣的服務(wù)容器中運(yùn)行
請(qǐng)求響應(yīng)與HttpServletRequest和HttpServletResponse之間的對(duì)應(yīng)關(guān)系

二 Servlet開發(fā)流程
2.1 目標(biāo)
校驗(yàn)注冊(cè)時(shí),用戶名是否被占用. 通過客戶端向一個(gè)Servlet發(fā)送請(qǐng)求,攜帶username,如果用戶名是'atguigu',則向客戶端響應(yīng) NO,如果是其他,響應(yīng)YES
super.service(req, res);
2.2 開發(fā)過程
步驟1 開發(fā)一個(gè)web類型的module
右擊點(diǎn)擊添加框架支持點(diǎn)擊javaweb 注意版本要在5 1

如果不是添加Tomcat依賴

項(xiàng)目結(jié)構(gòu) 1

步驟2 開發(fā)一個(gè)UserServlet
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲取請(qǐng)求中的參數(shù)
String username = req.getParameter("username");
if("atguigu".equals(username)){
//通過響應(yīng)對(duì)象響應(yīng)信息
resp.getWriter().write("NO");
}else{
resp.getWriter().write("YES");
}
}
}
- 自定義一個(gè)類,要繼承HttpServlet類
- 重寫service方法,該方法主要就是用于處理用戶請(qǐng)求的服務(wù)方法
- HttpServletRequest 代表請(qǐng)求對(duì)象,是有請(qǐng)求報(bào)文經(jīng)過tomcat轉(zhuǎn)換而來的,通過該對(duì)象可以獲取請(qǐng)求中的信息
- HttpServletResponse 代表響應(yīng)對(duì)象,該對(duì)象會(huì)被tomcat轉(zhuǎn)換為響應(yīng)的報(bào)文,通過該對(duì)象可以設(shè)置響應(yīng)中的信息
- Servlet對(duì)象的生命周期(創(chuàng)建,初始化,處理服務(wù),銷毀)是由tomcat管理的,無需我們自己new
- HttpServletRequest HttpServletResponse 兩個(gè)對(duì)象也是有tomcat負(fù)責(zé)轉(zhuǎn)換,在調(diào)用service方法時(shí)傳入給我們用的
步驟3 在web.xml為UseServlet配置請(qǐng)求的映射路徑
1 個(gè)serverlet標(biāo)簽可以對(duì)應(yīng)多個(gè)mappeing標(biāo)簽
<servlet> <servlet-name>servlet1</servlet-name> <servlet-class>com.zxy.Servlet1</servlet-class> </servlet> <servlet-mapping> <servlet-name>servlet1</servlet-name> <url-pattern>/s1</url-pattern> </servlet-mapping>
<?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_5_0.xsd"
version="5.0">
<servlet>
<!--給UserServlet起一個(gè)別名-->
<servlet-name>userServlet</servlet-name>
<!-- userServlet起別名-->
<servlet-class>com.atguigu.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--關(guān)聯(lián)別名和映射路徑-->
<servlet-name>userServlet</servlet-name>
<!--可以為一個(gè)Servlet匹配多個(gè)不同的映射路徑,但是不同的Servlet不能使用相同的url-pattern-->
<url-pattern>/userServlet</url-pattern>
<!-- <url-pattern>/userServlet2</url-pattern>-->
<!--
/ 表示通配所有資源,不包括jsp文件
/* 表示通配所有資源,包括jsp文件
/a/* 匹配所有以a前綴的映射路徑
*.action 匹配所有以action為后綴的映射路徑
-->
<!-- <url-pattern>/*</url-pattern>-->
<!-- 對(duì)應(yīng)form表單action里面的內(nèi)容 action="userServlet";-->
</servlet-mapping>
</web-app>
- Servlet并不是文件系統(tǒng)中實(shí)際存在的文件或者目錄,所以為了能夠請(qǐng)求到該資源,我們需要為其配置映射路徑
- servlet的請(qǐng)求映射路徑配置在web.xml中
- servlet-name作為servlet的別名,可以自己隨意定義,見名知意就好
- url-pattern標(biāo)簽用于定義Servlet的請(qǐng)求映射路徑
- 一個(gè)servlet可以對(duì)應(yīng)多個(gè)不同的url-pattern
- 多個(gè)servlet不能使用相同的url-pattern
- url-pattern中可以使用一些通配寫法
- / 表示通配所有資源,不包括jsp文件
- /* 表示通配所有資源,包括jsp文件
- /a/* 匹配所有以a前綴的映射路徑
- *.action 匹配所有以action為后綴的映射路徑
步驟4 開發(fā)一個(gè)form表單,向servlet發(fā)送一個(gè)get請(qǐng)求并攜帶username參數(shù)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="userServlet">
請(qǐng)輸入用戶名:<input type="text" name="username" /> <br>
<input type="submit" value="校驗(yàn)">
</form>
</body>
</html>
先部署到Tomcat服務(wù)器上在啟動(dòng)項(xiàng)目,訪問index.html ,提交表單測(cè)試
下面的應(yīng)用上下文可以修改訪問路徑 默認(rèn)訪問index.html

- 使用debug模式運(yùn)行測(cè)試
如果在extends HttpServlet 在實(shí)現(xiàn)service方法
沒有把默認(rèn)的super.service(req, resp);給刪除掉就會(huì)出現(xiàn)405報(bào)錯(cuò)
映射關(guān)系圖

// 1 servlet-api.jar 導(dǎo)入問題 java web項(xiàng)目中打包和構(gòu)建無需攜帶這個(gè)jar包,有服務(wù)商Tomcat提供
// 2 Content-Type響應(yīng)頭的文件類型
// MIME 媒體類型,文件類型,響應(yīng)的數(shù)據(jù)類型
// MIME 類型用于告訴客戶端響應(yīng)的數(shù)據(jù)是什么類型,客戶端用什么方式類解析響應(yīng)體

三 Servlet注解方式配置
3.1 @WebServlet注解源碼
官方JAVAEEAPI文檔下載地址
-
@WebServlet注解的源碼閱讀
package jakarta.servlet.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @since Servlet 3.0
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
/**
* The name of the servlet
* 相當(dāng)于 servlet-name
* @return the name of the servlet
*/
String name() default "";
/**
* The URL patterns of the servlet
* 如果只配置一個(gè)url-pattern ,則通過該屬性即可,和urlPatterns屬性互斥
* @return the URL patterns of the servlet
*/
String[] value() default {};
/**
* The URL patterns of the servlet
* 如果要配置多個(gè)url-pattern ,需要通過該屬性,和value屬性互斥
* @return the URL patterns of the servlet
*/
String[] urlPatterns() default {};
/**
* The load-on-startup order of the servlet
* 配置Servlet是否在項(xiàng)目加載時(shí)實(shí)例化
* @return the load-on-startup order of the servlet
*/
int loadOnStartup() default -1;
/**
* The init parameters of the servlet
* 配置初始化參數(shù)
* @return the init parameters of the servlet
*/
WebInitParam[] initParams() default {};
/**
* Declares whether the servlet supports asynchronous operation mode.
*
* @return {@code true} if the servlet supports asynchronous operation mode
* @see jakarta.servlet.ServletRequest#startAsync
* @see jakarta.servlet.ServletRequest#startAsync( jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse)
*/
boolean asyncSupported() default false;
/**
* The small-icon of the servlet
*
* @return the small-icon of the servlet
*/
String smallIcon() default "";
/**
* The large-icon of the servlet
*
* @return the large-icon of the servlet
*/
String largeIcon() default "";
/**
* The description of the servlet
*
* @return the description of the servlet
*/
String description() default "";
/**
* The display name of the servlet
*
* @return the display name of the servlet
*/
String displayName() default "";
}
3.2 @WebServlet注解使用
使用注解了就不能用xml配置
使用@WebServlet注解替換Servlet配置
// name是起別名
@WebServlet(
name = "userServlet",
//value = "/user",
urlPatterns = {"/userServlet1","/userServlet2","/userServlet"},
initParams = {@WebInitParam(name = "encoding",value = "UTF-8")},
loadOnStartup = 6
)
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String encoding = getServletConfig().getInitParameter("encoding");
System.out.println(encoding);
// 獲取請(qǐng)求中的參數(shù)
String username = req.getParameter("username");
if("atguigu".equals(username)){
//通過響應(yīng)對(duì)象響應(yīng)信息
resp.getWriter().write("NO");
}else{
resp.getWriter().write("YES");
}
}
}

浙公網(wǎng)安備 33010602011771號(hào)