Servlet就是一個介面我們需要寫一個類然後去實現Servlet,就可以被伺服器識別到。request是用來接受客戶端傳過來的參數,respone是用來響應客戶端的頁面。我們所用的容器是一個繼承的java容器tomcat。 ...
0x00前言
Servlet就是一個介面我們需要寫一個類然後去實現Servlet,就可以被伺服器識別到。request是用來接受客戶端傳過來的參數,respone是用來響應客戶端的頁面。我們所用的容器是一個繼承的java容器tomcat。
0x01Servlet快速入門
0x1需要去實現介面Servlet介面實現方法
init方法Servlet創建的時候就會執行
Service方法每次Servlet被訪問的時候就會執行
destroy方法每次伺服器正常結束的時候就會執行,一般用於輸出一些關於Servlet作者的信息
package webdemo1;
import javax.servlet.*;
import java.io.IOException;
public class Servletdemo2 implements Servlet {
public Servletdemo2() {
super();
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//被創建的時候會會執行一次1
System.out.println("init執行了");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//每次訪問service訪問的時候會被執行類似於固定代碼塊stati在類載入的時候也是,訪問異常Servlet就會被執行一次
System.out.println("service 執行了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
//銷毀方法,在伺服器正常結束的時候執行一次
System.out.println("destroy執行了");
}
}
0x2配置Servlet服務
需要在web.xml裡面配置Servlet服務
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>webdemo1.Servletdemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
```,
但是如果Servlet多了以後配置文件會很複雜,3.0以後可以通過註解配置
`@WebServlet(urlPatterns = "/demo3")`這樣配置直接訪問。
####0x3Servlet的繼承的關係
`public class Servletdemo4 extends GenericServlet`它把interface Servlet的方法都給實現了只留下了一個service是抽象方法。
`public abstract class HttpServlet extends GenericServlet`
`HttpServlet`是一個抽象類,它是去接受訪問到的數據的我們平時用到的是doget和dopost對應兩個提交方式做不同的處理
0x02request
0x1繼承關係
ServletRequest --介面
丨繼承
HttpServlet --介面
丨實現
org.apache.catalina.connector.RequestFacade 類(tomcat)
0x2Request
**GET**
String getMethod() 獲取請求方式
String getContextPath() 獲取虛擬目錄
String gerQueryString() 獲取參數
String getRequestURL()獲取請求URL/demo1
StringBuffer getRequestURL()http://127.0.0.1/demo1
String getProtocol() 獲取協議和版本
String getRemoteAddr() 獲取目標可客戶機的IP
String getHeader() 獲取請求頭
Enumeration<String> getHeaderNames 獲取請求頭名稱
**通用形的獲取參數**
String getParameter()獲取請求參數
String[] parameterValues = request.getParameterValues("username");
for (String s:parameterValues) {
System.out.println(s)}根據參數名獲取一個參數值的數組
Map<String, String[]> parameterMap = request.getParameterMap();//獲取所有map集合
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> strings = parameterMap.keySet();
for (String name:strings
) {
String[] strings1 = parameterMap.get(name);
for (String value:strings1
) {
System.out.println(value);
}
}
0x02資源轉發和數據共用
0x1轉發的方法
1.通過request對象獲取請求轉發器對象:RequestDispatcher getRequestDispatcher(String path)
2.使用RequestDispatcher對象來進行轉發:forward(ServletRequest request, ServletResponse response)
@WebServlet(name = "Servletdemo9", value = "/Servletdemo9")
public class Servletdemo9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demmo9被訪問了");
RequestDispatcher requestRequestDispatcher = request.getRequestDispatcher("Servletdemo10");
requestRequestDispatcher.forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
@WebServlet(name = "Servletdemo10", value = "/Servletdemo10")
public class Servletdemo10 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demmo10被訪問了");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
返回的結果是demmo9被訪問了,demmo10被訪問了
0x2轉發的特點
1.瀏覽器的路徑不會發生變化
2.只能訪問伺服器內部的資源
3.使用的是同一次請求
0x3共用數據
1.域對象:一個有作用範圍的對象,可以在範圍內共用數據。
2.request域:代表一次請求的範圍,一般用於請求轉發的多個資源中共用數據
3.方法
void setAttribute(String name,Object obj):存儲數據
Object getAttitude(String name):通過鍵獲取值
void removeAttribute(String name):通過鍵移除鍵值對
4.演示
demo9去存放數據
System.out.println("demmo9被訪問了");
request.setAttribute("msg","hellow");//鍵值對的方式存數據
RequestDispatcher requestRequestDispatcher = request.getRequestDispatcher("Servletdemo10");
requestRequestDispatcher.forward(request,response);
demo10去訪問數據
System.out.println("demmo10被訪問了");
Object msg = request.getAttribute("msg");
System.out.println(msg);
0x03response
0x1狀態碼
1xx:伺服器收到客戶端消息,但是沒有接受完成,等待一段時間後,發送1xx多狀態碼,催促繼續發送
2xx:代表成功,200
3xx:重定向,代表:302(重定向)304(訪問緩存)
4xx:客戶端錯誤。代表:404(路徑沒有對應的資源)405請求方式沒有對應doxxx的方法
5xx:服務端錯誤 伺服器代碼有錯
0x2重要的響應頭
Content-Type:伺服器告訴客戶端本次響應體的數據格式和編碼格式
0x3設置response
1.設置響應行:setStatus(int sc)
2.設置響應頭setHeader(String name,String value)
3.設置響應體
(1)獲取輸出流:字元輸出流PrintWriter getWriter
(2)位元組輸出流:ServletOutputStream getOutputStream
4.路徑設置
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"Servletdemo11");//這樣拼接路徑以後好更改
0x4重定向的使用
重定向:
- 地址欄發生變化
- 重定向可以訪問其他站點(伺服器)的資源
- 重定向是兩次請求。不能使用request對象來共用數據
轉發: - 轉發地址欄路徑不變
- 轉發只能訪問當前伺服器下的資源
- 轉發是一次請求,可以使用request對象來共用數據
代碼:
@WebServlet(name = "Servletdemo11", value = "/Servletdemo11")
public class Servletdemo11 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// **1xx**:伺服器收到客戶端消息,但是沒有接受完成,等待一段時間後,發送1xx多狀態碼,催促繼續發送
// **2xx**:代表成功,200
// **3xx**:重定向,代表:302(重定向)304(訪問緩存)
//**4xx**:客戶端錯誤。代表:404(路徑沒有對應的資源)405請求方式沒有對應doxxx的方法
// **5xx**:服務端錯誤 伺服器代碼有錯
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Servletdemo11會自動訪問Servletdemo12
System.out.println("demo被訪問了");
response.setStatus(302);
response.setHeader("location","Servletdemo12");
}
}
demo2
重定向的方法response.sendRedirect("Servletdemo13");
@WebServlet(name = "Servletdemo12", value = "/Servletdemo12")
public class Servletdemo12 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servletdemo12被訪問了");
response.getWriter().write("我的訪問撒過了");
response.sendRedirect("Servletdemo13");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
0x5write
@WebServlet("/response")
public class Response extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("gbk"); //設置編碼
PrintWriter writer = resp.getWriter(); //獲取輸出對象
writer.write("response");//輸出內容
writer.println("1235");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
輸出位元組流:
ServletOutputStream outputStream = resp.getOutputStream();
outputStream.write("abc".getBytes());
0x05ServletContext使用
1.概念:代表整個web應用,可以和程式的容器(伺服器)來通信
2.獲取
(1)通過request.getServletContext()
(2)通過HttpServletthis.getServletContext()
3.功能
(1)獲取MIME:在互聯網通信過程中定義的一種文件數據類型
格式:大類型/小類型 text/html image/jpeg
(2)域對象:共用數據
(3)獲取文件的真實(伺服器)路徑
request.getServletContext(); : 通過request對象獲取
this.getServletContext(); : 通過HttpServlet獲取
String getMimeType(String file) : 獲取MIME對象
域對象:共用數據
1. setAttribute(String name,Object value)
2. getAttribute(String name)
3. removeAttribute(String name)
獲取文件的真實(伺服器)路徑:
String getRealPath(String path)
簡單的一個超鏈接下載案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="puuture/cat.jpg">圖片1查看</a>
<a href="puuture/cat2.jpg">圖片2查看</a>
<hr>
<a href="Servletdownload?filename=cat.jpg">圖片1下載</a>
<a href="Servletdownload?filename=cat2.jpg">圖片2下載</a>
</body>
</html>
看一下Servlet
@WebServlet(name = "Servletdownload", value = "/Servletdownload")
public class Servletdownload extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getParameter("filename"); //接收filename傳參的值
ServletContext servletContext = this.getServletContext(); //創建servletContext 對象
String Path = servletContext.getRealPath("/puuture/" + filename); //獲取文件真實路徑
String mimeType = servletContext.getMimeType(filename);//獲取mimel類型
FileInputStream fis = new FileInputStream(Path); //路徑參數文件輸入流對象中
response.setHeader("content-type",mimeType); //響應頭設置mime類型
response.setHeader("content-disposition","attachment;filename="+filename); //設置為附件類型
ServletOutputStream outputStream = response.getOutputStream(); //獲取文件輸出流
byte[] buff = new byte[1024]; //設置每次讀取的位元組大小
int len =0;
while ((len = fis.read(buff))!=-1){
outputStream.write(buff,0,len);
}
}
}
0x06總結和歸納
總的來說Servlet(request和response)+Jdbc可以組成簡單的後端基礎處理了。仔細看最後一個案例可以學到很多東西。