servlet
添加依賴坐標(biāo)(maven)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
小測試
? 所有請求都會固定攜帶一個參數(shù)(method)代表請求的方式(GET,POST,PUT,DELETE,OPTION)
public class HelloServlet extends HttpServlet {
@Override
// req 對應(yīng)的是請求對象,代表的是請求
// resp 對應(yīng)的是響應(yīng)對象,代表的是響應(yīng)
// Java依然按照面向?qū)ο蟮脑O(shè)計(jì)方式,開發(fā)者如果想操作請求和響應(yīng),只需要使用對應(yīng)的對象調(diào)用方法即可,對象實(shí)例化也是由 tomcat 自行完成
// 此方法表示處理的是 get 請求,如果發(fā)送的 post 請求,那么網(wǎng)頁就會報錯405
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 通過響應(yīng)對象,設(shè)置響應(yīng)內(nèi)容
// 準(zhǔn)備響應(yīng)內(nèi)容
String content = "This is a text content!";
// 獲取響應(yīng)對應(yīng)的輸出流,和 socket 變成的流的獲取類似
PrintWriter printWriter = resp.getWriter();
// 將數(shù)據(jù)讀取到輸出流中
printWriter.write(content);
// 當(dāng)doGet方法運(yùn)行完成之后,響應(yīng)會被 tomcat 自動返回給客戶端
}
}
// 在 web.xml 文件中配置路由
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.iweb.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
一個post請求的全流程
<!--頁面代碼-->
<body>
<!--action:點(diǎn)擊提交按鈕的時候所發(fā)送的請求路徑-->
<!--method:請求方式,如果不寫默認(rèn)get-->
<form action="login" method="post">
用戶名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
// 服務(wù)端代碼
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 中文處理:在請求的參數(shù)接受之前,設(shè)置請求中的參數(shù)的字符串
req.setCharacterEncoding("UTF-8");
// 借助請求對象,獲取form表單中所對應(yīng)的參數(shù)
// getParameter對應(yīng)的參數(shù),是form表單中input所對應(yīng)的name屬性
String username = req.getParameter("username");
String password = req.getParameter("password");
// req.getParameterValues("name") 獲取多個值
System.out.println(username + " : " + password);
String html = "";
if("admin".equals(username)&& "123".equals(password)){
html = "<div style='color:red'>login success!</div>";
}else{
html = "<div style='color:green'>login failed!</div>";
}
// 在響應(yīng)返回之前,設(shè)置響應(yīng)中的內(nèi)容類型和指定字符集編碼
// 1. 在Java層面將想用中的字符設(shè)置為UTF-8編碼
// 2. 通知瀏覽器使用UTF-8編碼顯示數(shù)據(jù)
resp.setContentType("text/html;charset=UTF-8");
// 響應(yīng)返回
resp.getWriter().write(html);
}
}
<!--web.xml-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.iweb.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
Get請求的幾種情況
- 瀏覽器地址欄輸入地址訪問
- 通過超鏈接點(diǎn)擊發(fā)送的請求方式
- form表單的默認(rèn)提交方式
- ajax指定get方式發(fā)送的請求
Post請求方式
- form表單指定post方式提交
- ajax指定post方式發(fā)送請求
POST 和 GET 的區(qū)別
- get 請求匹配 doGet 方法,post請求匹配 doPost 方法,如果不匹配,會出現(xiàn)405
- post 請求中如果攜帶參數(shù),參數(shù)不會出現(xiàn)在 url 中,get 請求中如果攜帶參數(shù),參數(shù)會出現(xiàn)在 url 中
- get 請求中參數(shù)大小是有限的,過大的參數(shù)無法攜帶,port 請求中參數(shù)大小遠(yuǎn)大于 get 方式
servlet生命周期
-
實(shí)例化(特性:延遲加載,單例)
? tomcat 運(yùn)行的時候,servlet 并不會立刻實(shí)例化,直到有用戶發(fā)送請求,并且根據(jù) web.xml 中所配置的映射關(guān)系,找到了對應(yīng)的 servlet 類的類路徑的時候,tomcat 這個時候會利用反射創(chuàng)建出對應(yīng) servlet 類的對象,為了保證效率,servlet類是單例的。
-
初始化
? init方法來自于從HttpServlet 的繼承,該方法是成員方法,所以一定是在實(shí)例化之后調(diào)用的,會在構(gòu)造方法運(yùn)行之后運(yùn)行,但是無論訪問多少次,Servlet init,只會初始化一次。
-
提供服務(wù)
? 正常執(zhí)行 Service 方法,開發(fā)者在方法中借助 req 和 resp 進(jìn)行請求和響應(yīng)的處理,方法運(yùn)行結(jié)束之后,響應(yīng)自動返回
-
銷毀
? tomcat 服務(wù)器關(guān)閉的時候,destory 方法被調(diào)用。這個過程不是很直觀的能被觀察到
-
被回收
? servlet 被銷毀之后,不再有引用存儲實(shí)例的內(nèi)存地址,這個時候,servlet實(shí)例就滿足了被 GC 回收的條件
// 重寫方法觀察生命周期
public class HelloServlet extends HttpServlet {
public HelloServlet() {
System.out.println("HelloServlet -> HelloServlet()");
}
@Override
public void init() throws ServletException {
System.out.println("HelloServlet -> init()");
}
@Override
public void destroy() {
System.out.println("HelloServlet -> destroy()");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 通過響應(yīng)對象,設(shè)置響應(yīng)內(nèi)容
// 準(zhǔn)備響應(yīng)內(nèi)容
String content = "This is a text content!";
// 獲取響應(yīng)對應(yīng)的輸出流,和 socket 變成的流的獲取類似
PrintWriter printWriter = resp.getWriter();
// 將數(shù)據(jù)讀取到輸出流中
printWriter.write(content);
// 當(dāng)doGet方法運(yùn)行完成之后,響應(yīng)會被 tomcat 自動返回給客戶端
// 定義 url 映射,讓服務(wù)器知道客戶端發(fā)送的哪一個請求,會由當(dāng)前 servlet 處理
}
}
CDN快速構(gòu)建前端頁面
布局網(wǎng)站:https://www.runoob.com/try/bootstrap/layoutit/
<link rel="stylesheet">
<script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
<script src="http://cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
頁面跳轉(zhuǎn)(至靜態(tài)頁面)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 模擬頁面跳轉(zhuǎn)
// 通過轉(zhuǎn)發(fā)方式跳轉(zhuǎn)到指定頁面(或者發(fā)送指定請求)
req.getRequestDispatcher("頁面文件路徑").forward(req,resp);
// 通過重定向方式跳轉(zhuǎn)到指定頁面(或者發(fā)送指定請求)
req.sendRedicrect("頁面文件路徑");
}
轉(zhuǎn)發(fā)和重定向的區(qū)別:轉(zhuǎn)發(fā)是一次請求(將請求資源直接發(fā)送給客戶端),重定向是兩次請求(通知客戶端去訪問資源),如果用戶訪問的資源不可以被直接獲取,那么重定向可以判斷該用戶有沒有權(quán)限獲得這些資源,轉(zhuǎn)發(fā)并不可以,轉(zhuǎn)發(fā)則是可以保護(hù)頁面資源,因?yàn)椴恢涝擁撁媸菑暮味鴣?mark hidden color="red">文章來源:http://www.zghlxwxcb.cn/news/detail-601981.html
servlet自啟動(通過注解去啟動servlet)
? 一般在自啟動的servlet類中配置init方法,可以在tomcat啟動的時候,該servlet類會自動被實(shí)例化以及初始化,但是并不會調(diào)用service文章來源地址http://www.zghlxwxcb.cn/news/detail-601981.html
@WebServlet(loadOnStartup = 10)
// 取值范圍為1-99 值越大,優(yōu)先級越低,反之值越小,優(yōu)先級越高
req,resp常用方法
req常用方法
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 瀏覽器發(fā)送請求時候的完整url,包括協(xié)議,主機(jī)名,端口號
System.out.println(req.getRequestURL());
// 將url去除掉協(xié)議和主機(jī)名,并輸出(上下文,訪問資源路徑)
System.out.println(req.getRequestURI());
// 獲取請求中的參數(shù)數(shù)據(jù),也就是 ? 之后的信息,只能獲取GET方式請求的參數(shù),無法獲取POST
System.out.println(req.getQueryString());
// 獲取客戶端的ip地址
System.out.println(req.getRemoteAddr());
// 獲取客戶端的主機(jī)名
System.out.println(req.getRemoteHost());
// 獲取服務(wù)器端自己的ip地址
System.out.println(req.getLocalAddr());
// 獲取服務(wù)器端自己的主機(jī)名
System.out.println(req.getLocalName());
// 獲取客戶端返送請求的請求方式
System.out.println(req.getMethod());
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 接收單個值的參數(shù)
System.out.println(req.getParameter("jerk"));
// 接收多值參數(shù)
System.out.println(Arrays.asList(req.getParameterValues("hobby")));
// 使用ParamMap進(jìn)行參數(shù)和參數(shù)值的讀取,其中該Map的Key類型為String,值類型為String[]
Map<String,String[]> params = req.getParameterMap();
Set<String> paramNames = params.keySet();
for (String name : paramNames) {
String[] value = params.get(name);
System.out.println(name + " : " + Arrays.asList(value));
}
}
到了這里,關(guān)于Java后端01(初識servlet)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!