JavaWeb學習一Servlet
阿新 • • 發佈:2020-10-19
servlet是什麼
- Servlet 是javaEE規範之一。規範就是介面
- servlet 是javaweb 三大元件之一。三大元件分別是 Servlet程式,Filter過濾器,Listen 監聽器。
- Servlet 是執行在伺服器上的java 程式,它可以接受客戶端傳送的請求,並響應給客戶端。
第一個Servlet程式
- 編寫一個類去實現 Servlet 介面
- 實現services方法,處理請求,並響應資料。
- 到web.xml 中配置servlet程式的訪問地址。
手動新增servlet jar包
右鍵 -> open Module setting
新建一個類,繼承所有方法。
package com.study.servlet; import javax.servlet.*; import java.io.IOException; public class HelloServlet implements Servlet { void HelloServlet() { System.out.println("constructor"); } @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init"); } @Override public ServletConfig getServletConfig() { System.out.println("getServletConfig"); return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("service"); } @Override public String getServletInfo() { System.out.println("getServletInfo"); return null; } @Override public void destroy() { System.out.println("destroy"); } } // 配置 web.xml配置 <servlet> <!-- 類名稱 --> <servlet-name>HelloServlet</servlet-name> <!-- 類名加配置 --> <servlet-class>com.study.servlet.HelloServlet</servlet-class> </servlet> <!-- 路徑相關 --> <servlet-mapping> <!-- 類名 --> <servlet-name>HelloServlet</servlet-name> <!-- 路徑 --> <url-pattern>/hello</url-pattern> </servlet-mapping>
然後訪問 /hello
可以看到列印輸出
每一次訪問都會執行 `services` 方法,但是 `init` 方法只執行一次。
停止時觸發destroy
使用idea快捷生成servlet
package com.study.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "Servlet2") public class Servlet2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 觸發post方法時執行 System.out.println("doPost"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 觸發Get方法時執行 System.out.println("doGet"); } }
Servlet獲取請求引數
request.getParameter("name");
Servlet響應內容
PrintWriter out = response.getWriter(); out.println("hello javaweb servlet");
servlet-api jar包關聯
新建lib 目錄,複製servlet-api.jar到lib下面
右鍵lib,mark to Libray
idea 啟動 servlet
- 新增啟動方式
- 新增專案目錄
註解servlet 代替 web.xml 配置(2.5版本以上)
常用配置
name 類名稱 對應 servlet-class
value 對應servlet-mapping 中的 <url-pattern>
urlPatterns 和value 一樣,對應servlet-mapping 中的 <url-pattern>
loadOnStartup 載入順序
@WebServlet(name = "Servlet2",value = {"/servlet2","/servlet3"}) public class Servlet2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doPOST"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doGet"); } }
Request 和 Response
request相關方法
- getMethod(); 獲得請求方式
- getRequestURL(); 返回客戶端發出請求時的完整URL。
- getRequestURI(); 返回請求行中的資源名部分。
- getContextPath(); 當前應用的虛擬目錄
- getQueryString() ; 返回請求行中的引數部分。
- getParameter(); 獲取引數 GET/POST 通用
Response相關方法
- response.setStatus(302); // 設定狀態碼.
- response.setHeader("location","http://www.baidu.com");// 設定響應頭
向客戶端輸出中文資料
- 用OutputStream(位元組流)傳送資料:
-
- response.getOutputStream().write(“中國”.getBytes());//以預設編碼傳送資料
- response.getOutputStream().write("中國".getBytes("UTF-8"));//以UTF-8編碼傳送資料,瀏覽器(預設用GB2312)會出現亂碼
- 用PrintWriter(字元流)傳送資料:
-
- 示例:response.getWriter().write(“中國” );有沒有亂碼?
- 原因:以預設編碼傳送資料 ISO-8859-1(沒有中國二字編碼),此時會發生亂碼
解決辦法:
setCharacterEncoding(“UTF-8”);
//更改編碼為UTF-8
response.setHead(“Context-type”,”text/html;charset=UTF-8”);
//告訴客戶端編碼方式
注意:不要忘記告訴客戶端的編碼方式。
由於經常改動編碼,response提供了一種更簡單的方式
response. setContentType(“text/html;charset=UTF-8”); 其作用相當於以上兩條程式碼。
Cookie 和 Response
設定cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doGet"); // 新增cookie response.addCookie(new Cookie("papa", "aa")); response.addCookie(new Cookie("sid","123")); // 響應結果 response.getOutputStream().write("hello".getBytes()); }
獲取cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doGet"); StringBuilder res = new StringBuilder(); String name = null; String val = null; // 獲取到的cookie是一個 陣列 Cookie[] oldSid = request.getCookies(); for (int i = 0;i<oldSid.length;i++){ name = oldSid[i].getName(); val = oldSid[i].getValue(); res.append(name + " : "+ val +"\n"); } // 新增cookie response.addCookie(new Cookie("papa", "aa")); // 新增sid 隨機 response.addCookie(new Cookie("sid",String.valueOf(Math.random()))); // 響應結果 response.getOutputStream().write(res.toString().getBytes()); }
設定session
// 獲取一個session,如果不存在,則建立 HttpSession session = request.getSession(true); //設定新的時間 session.setAttribute("t",System.currentTimeMillis());
獲取session
// 獲取一個session,如果不存在,則建立 HttpSession session = request.getSession(true); // 獲取上次的時間 Object t = session.getAttribute("t");
ServletContext servlet 上下文
ServletContext官方叫servlet上下文。伺服器會為每一個工程建立一個物件,這個物件就是ServletContext物件。這個物件全域性唯一,而且工程內部的所有servlet都共享這個物件。所以叫全域性應用程式共享物件。
Filter 過濾器
過濾器是指客戶端和請求響應之間的一道過濾技術。
package com.study.servlet; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; // 攔截所有請求 @WebFilter(value = "*") public class HelloFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init"); } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("doFilter"); // 如果沒有攜帶auth 屬性,則未授權 String auth = servletRequest.getParameter("auth"); if (auth == null) { System.out.println("未授權"); } // 繼續,等價於express 的next; filterChain.doFilter(servletRequest, servletResponse); } public void destroy() { System.out.println("destroy"); } }