servlet學習筆記
- 1、servlet基礎知識
-
- 1.1、什麼是servlet?(what)
- 1.2、為什麼要使用servlet?(why)
- 1.3、怎麼使用servlet?(how)
- 1.4、servlet知識點
- 2、servlet程式設計
-
- 2.1、我們編寫一個簡單的servlet
- 2.2、我們繼續建立一個難度增加的項目
- 2.3、我們繼續更新一下
- 2.4、我們繼續更新一下
1、servlet基礎知識
1.1、什麼是servlet?(what)
Servlet是運作在伺服器上的一個Java程式,可以接收用戶端發來的請求,并響應資料給用戶端。
Servlet是JavaWeb三大元件之一,三大元件分别是Servlet程式、Filter過濾器、Listener監聽器
1.2、為什麼要使用servlet?(why)
我們是web容器的元件之一,既然學習web,那麼三大元件必不可少。而我們之前所學的jsp本質上是一個java類。
舉個例子:demo.jsp,編譯後生成了demo.java和demo.class檔案,而這兩個檔案中會導入有關于servlet的包,那麼學習servlet就必不可少了。
1.3、怎麼使用servlet?(how)
我們可以繼承HttpServlet類或者實作Servlet類來實作這個類servlet化。
1.4、servlet知識點
- servlet的生命周期
- 執行Servlet程式的構造方法
- 執行init方法
- 執行service方法
執行destroy方法
注意:其中1和2是在初次通路并建立Servlet程式時會執行(每次啟動服務隻執行一次),第3步每次重新整理 (通路)都會執行,第4步點選停止時會執行一次
- servlet的繼承關系:
- servletConfig接口:
從名字來看,得知此接口中是Servlet程式的配置資訊:
(1) Servlet程式和ServletConfig對象都是由Tomcat負責建立,程式設計人員負責使用
(2) Servlet程式預設是第一次通路時建立,每個Servlet程式建立時對應的建立ServletConfig對 象,二者互相對應,某個Servlet程式隻可以獲得他對應的ServletConfig對象,無法獲得别的 Servlet程式的ServletConfig對象
ServletConfig接口的三大作用:
(1) 可以擷取Servlet程式的别名(即web.xml的的内容)
(2) 可以擷取web.xml的初始化參數的值
(3) 可以擷取ServletContext對象
- servletContext接口:
- ServletContext接口表示Servlet上下文對象
- 一個web工程隻有一個ServletContext對象執行個體
- ServletContext是在web工程啟動時建立,在web工程停止時銷毀
- ServletContext對象是一個域對象
- 常見的響應碼
200 表示請求成功
302 表示請求重定向
404 表示伺服器收到請求,但是請求的資料不存在(請求位址錯誤)
500 表示伺服器收到請求,但是伺服器内部錯誤(代碼錯誤)
- HttpServletRequest類:
每次隻要有請求進入Tomcat伺服器,Tomcat伺服器就會把請求發來的HTTP協定資訊解析好封裝到Request對象中,然後傳遞到service方法中(調用doGet或doPost方法)供程式設計人員使用,程式設計人員通過HttpServletRequest對象,可以擷取到請求的所有資訊
HttpServletRequest類的常用方法:
getRequestURI():擷取請求的資源路徑
getRequestURL():擷取請求的絕對路徑
getRemoteHost():擷取用戶端的ip位址
getHeader():擷取請求頭
getParameter():擷取請求的參數
getParameterValues():擷取請求的參數(多個值時使用)
getMethod():擷取請求的方式(GET或POST)
setAttribute(key, value):設定域資料
getAttribute(key):擷取域資料
getRequestDispatcher():擷取請求轉發對象
- HttpServletResponse類
每次隻要有請求進入Tomcat伺服器,Tomcat伺服器就會建立一個Response對象傳遞給Servlet程式。HttpServletResponse表示所有響應的資訊(HttpServletRequest表示請求發來的資訊),可以通過HttpServletResponse對象設定傳回給用戶端的資訊
兩個輸出流的說明:
位元組流 getOutputStream(); 常用于下載下傳(傳遞)二進制資料
字元流 getWriter(); 常用于回傳字元串
從伺服器往用戶端(浏覽器)回傳字元串資料
- 請求轉發
請求轉發指的是伺服器收到請求之後,從一個資源跳轉到另一個資源的操作。
- 重定向
請求重定向指的是用戶端給伺服器發送請求,然後伺服器通知用戶端去通路自己的新位址(之前的位址可能被廢棄)叫請求重定向
- “/”的含義:
“/”若被浏覽器解析,得到的位址是:http://ip:port/
(1) /
“/”若被伺服器解析,得到的位址是:http://ip:port/工程路徑
(1) /servlet1
(2) servletContext.getRealPath(“/”);
(3) request.getRequestDispatcher(“/”);
2、servlet程式設計
2.1、我們編寫一個簡單的servlet
- 建立一個web項目。
- 建立一個servlet類,起名加WebDemo1.
package com.controller;
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.util.Arrays;
public class WebDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("這個是get方法1");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("這個是post方法1");
}
}
- 配置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/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>webDemo1</servlet-name>
<servlet-class>com.controller.WebDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>webDemo1</servlet-name>
<url-pattern>/web1</url-pattern>
</servlet-mapping>
</web-app>
- 啟動項目,并通路網站,可以看出結果。
2.2、我們繼續建立一個難度增加的項目
先建立一個jsp頁面,有一個按鈕,點選這個按鈕可以在控制台出現一行字“你成功了”。
- 建立一個servlet類,起名WebDemo1,并寫出内容。
package com.controller;
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.util.Arrays;
public class WebDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("這個是get方法1");
System.out.println("你成功啦");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("這個是post方法1");
}
}
- 修改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/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>webDemo1</servlet-name>
<servlet-class>com.controller.WebDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>webDemo1</servlet-name>
<url-pattern>/web1</url-pattern>
</servlet-mapping>
</web-app>
- 建立一個jsp頁面,名稱叫index1.jsp頁面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/web1" >
<input type="submit" value="送出">
</form>
</body>
</html>
- 通路并檢視結果
2.3、我們繼續更新一下
我們在一個頁面上輸入一些資訊,控制台進行列印。
- 建立一個index.jsp頁面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/web1" method="post">
姓名:<input type="text" name="userName"><br>
密碼:<input type="password" name="password"><br>
性别:<input type="radio" value="男" name="sex">男 <input type="radio" value="女" name="sex">女<br>
位址:<select name="address">
<option value="北京">北京</option>
<option value="南京">南京</option>
</select><br>
愛好:<input type="checkbox" name="hobby" value="籃球">籃球
<input type="checkbox" name="hobby" value="足球">足球
<input type="checkbox" name="hobby" value="羽毛球">羽毛球<br>
<input type="submit" value="送出"/>
</form>
</body>
</html>
- 建立一個servlet類
package com.controller;
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.util.Arrays;
public class WebDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get2");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post2");
//解決中文亂碼
resp.setContentType("text/html;charset=utf-8");
//請求解決亂碼
req.setCharacterEncoding("utf-8");
//響應解決亂碼
resp.setCharacterEncoding("utf-8");
String userName = req.getParameter("userName");
String password = req.getParameter("password");
String address = req.getParameter("address");
String sex = req.getParameter("sex");
String[] hobbies = req.getParameterValues("hobby");
System.out.println("姓名:"+ userName);
System.out.println("密碼:"+ password);
System.out.println("性别:"+ sex);
System.out.println("愛好:"+ Arrays.toString(hobbies));
System.out.println("位址:"+ address);
req.getRequestDispatcher("/result/result1.jsp").forward(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/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>webDemo1</servlet-name>
<servlet-class>com.controller.WebDemo1</servlet-class>
</servlet>
<servlet>
<servlet-name>webDemo2</servlet-name>
<servlet-class>com.controller.WebDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>webDemo2</servlet-name>
<url-pattern>/web2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>webDemo1</servlet-name>
<url-pattern>/web1</url-pattern>
</servlet-mapping>
</web-app>
- 運作、檢視結果。
2.4、我們繼續更新一下
從一個頁面擷取到資訊轉發到另一個頁面顯示
- 寫出index.jsp頁面(2.3有)
- 修改web.xml檔案(2.3有)
- 修改servlet類
package com.controller;
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.util.Arrays;
public class WebDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get2");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post2");
//解決中文亂碼
resp.setContentType("text/html;charset=utf-8");
//請求解決亂碼
req.setCharacterEncoding("utf-8");
//響應解決亂碼
resp.setCharacterEncoding("utf-8");
String userName = req.getParameter("userName");
String password = req.getParameter("password");
String address = req.getParameter("address");
String sex = req.getParameter("sex");
String[] hobbies = req.getParameterValues("hobby");
System.out.println("姓名:"+ userName);
System.out.println("密碼:"+ password);
System.out.println("性别:"+ sex);
System.out.println("愛好:"+ Arrays.toString(hobbies));
System.out.println("位址:"+ address);
req.setAttribute("userName", userName);
req.setAttribute("password", password);
req.setAttribute("sex", sex);
req.setAttribute("hobbies", Arrays.toString(hobbies));
req.setAttribute("address", address);
req.getRequestDispatcher("/result/result1.jsp").forward(req, resp);
}
}
這裡我們用到了一個請求轉發。
- 建立一個result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
姓名:${userName}
性别:${sex}
密碼:${password}
愛好:${hobbies}
位址:${address}
</body>
</html>
這裡我們用到了el表達式進行取出資料。
- 運作、檢視結果
這裡一部分内容借鑒别的部落格,作者在這裡表示衷心感謝。