1. 程式人生 > 實用技巧 >JavaWeb學習一Servlet

JavaWeb學習一Servlet

servlet是什麼

  1. Servlet 是javaEE規範之一。規範就是介面
  2. servlet 是javaweb 三大元件之一。三大元件分別是 Servlet程式,Filter過濾器,Listen 監聽器。
  3. Servlet 是執行在伺服器上的java 程式,它可以接受客戶端傳送的請求,並響應給客戶端。

第一個Servlet程式

  1. 編寫一個類去實現 Servlet 介面
  2. 實現services方法,處理請求,並響應資料。
  3. 到web.xml 中配置servlet程式的訪問地址。

手動新增servlet jar包

右鍵 -> open Module setting

image.png

新建一個類,繼承所有方法。

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 可以看到列印輸出

image.png

每一次訪問都會執行 `services` 方法,但是 `init` 方法只執行一次。

停止時觸發destroy

image.png

使用idea快捷生成servlet

image.png

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

image.png

idea 啟動 servlet

  1. 新增啟動方式

image.png

  1. 新增專案目錄

image.png

image.png

註解servlet 代替 web.xml 配置(2.5版本以上)

image.png

常用配置

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());
  }

image.png

設定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");
  }
}

image.png