Java Web 之Servlet

前言

學一學Java Web 三大組件之一Servlet。

簡介

Servlet 是運行在Web服務器或者應用服務器上的Java程序,用來接收并響應來自Web客戶端的請求。

創(chuàng)建servlet實例

IDEA創(chuàng)建HelloServlet類,并實現(xiàn)servlet接口

package com.guigu.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author cseroad
 */
public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //處理請求并響應數(shù)據(jù)
        System.out.println("serlvet 被訪問");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

并修改web.xml文件,給servlet配置上可訪問的URI映射地址

  <!-- servlet 標簽tomcat配置servlet程序 -->
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <!-- servlet 別名,一般為類名 -->
    <servlet-class>com.guigu.servlet.HelloServlet</servlet-class>
    <!-- servlet 程序的全類名 -->
  </servlet>
  
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <!-- 當前配置給哪個servlet 程序使用 -->
    <url-pattern>/hello</url-pattern>
    <!-- 表示訪問地址為http://ip:port/project/hello -->
  </servlet-mapping>

當訪問 http://localhost:8080/Servlet/hello 時,就會映射到HelloServlet這個serlvet,進而查找到com.guigu.servlet.HelloServlet這個類。

image.png

過程如下:
Web客戶端訪問地址和端口,找到tomcat服務,進而訪問Servlet工程,然后找到eclipse的Servlet工程下的hello,通過web.xml的url-pattern配置信息,找到映射的HelloServlet 程序,進而找到com.guigu.servlet.HelloServlet類名執(zhí)行到service方法。

Servlet 生命周期

Servlet的生命周期定義了一個Servlet如何被加載、初始化、處理響應數(shù)據(jù)、銷毀。
創(chuàng)建HelloServlet來觀察Servlet 的生命周期。

package com.guigu.servlet;

import javax.servlet.*;
import java.io.IOException;

/**
 * @author cseroad
 */
public class HelloServlet implements Servlet {
    public void HelloServlet(){
        System.out.println("1. 構(gòu)造器方法");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2. init初始化方法");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //處理請求并響應數(shù)據(jù)
        System.out.println("serlvet 被訪問");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("4. destroy 銷毀方法");
    }
}

生命周期主要階段如下:
1、執(zhí)行Servlet構(gòu)造器方法
2、執(zhí)行init()初始化方法
3、執(zhí)行service()方法
4、執(zhí)行destroy()銷毀方法
過程如下:
當創(chuàng)建Servlet時,會調(diào)用構(gòu)造器方法(只會調(diào)用一次),創(chuàng)建 Servlet 的實例對象。并調(diào)用 init()方法,完成Servlet實例對象的初始化(只會調(diào)用一次);
然后web客戶端每次訪問該serlvelt時,都會執(zhí)行service()方法;
當Web工程停止或重啟時,再執(zhí)行destory()方法;

Servlet的三種創(chuàng)建方式

Servlet-api.jar包提供了三個基本接口或類用于創(chuàng)建Servlet:

  • 實現(xiàn)javax.servlet.Servlet接口
  • 繼承javax.servet.GenericServlet類
  • 繼承javax.servlet.http.HttpServlet類

而他們的關系是HttpServlet類繼承GenericServlet類, GenericServlet類是實現(xiàn)的 Servlet接口。
如創(chuàng)建一個HelloServlet2類,繼承HttpServlet類,并重寫doGet()doPost()方法來體現(xiàn)請求的分發(fā)處理(即GET請求和POST請求)。

package com.guigu.servlet;

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloServlet2 extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("helloservlet的doget方法");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("helloservlet的dopost方法");
    }   
}

并配置web.xml

    <servlet>
        <servlet-name>Servlet2</servlet-name>
        <servlet-class>com.guigu.servlet.Servlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet2</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>

再編寫index.html,使用不同的HTTP請求訪問地址

<html>
<body>
<form action="http://localhost:8080/Servlet/hello2" method="post">
  <input type="text" name="username" value="">
  <input type="submit" name="submit" value="submit">

</form>
</body>
</html>

HelloServlet2就會根據(jù)客戶端不同的HTTP請求方式自動調(diào)用doget()dopost()方法。

image.png

過程如下:
1、編寫類繼承HttpServlet類;
2、重寫doGet()doPost()方法;
3、再配置web.xml

ServletConfig 對象

ServletConfig對象是由每個Servlet的Web容器創(chuàng)建的。這個對象可用于從web.xml文件中獲取配置信息。
在web.xml添加一些鍵值對,用來后續(xù)操作ServletConfig對象的方法。

      <servlet>
        <servlet-name>Servlet2</servlet-name>
        <servlet-class>com.guigu.servlet.Servlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet2</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <!-- servlet 別名,一般為類名 -->
        <servlet-class>com.guigu.servlet.HelloServlet</servlet-class>
        <!-- servlet 程序的全類名 -->
        <!-- init-param初始化參數(shù) -->
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

在初始化方法里添加操作ServletConfig對象的方法。
如:
getServletName() 表示獲取當前Servlet在web.xml中配置的名字;
getInitParameter(String name) 表示獲取當前Servlet指定名稱的初始化參數(shù)值;
getInitParameterNames() 表示獲取當前Servlet所有初始化參數(shù)的名字組成的枚舉;
getServletContext() 表示獲取當前web應用的ServletContext對象;

    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2. init初始化方法");
        String servletName = servletConfig.getServletName();
        System.out.println("HelloServlet程序的別名是:"+servletName);
        System.out.println("HelloServlet程序的別名是:"+servletConfig.getServletName());
        System.out.println("初始化參數(shù)username的值是:"+servletConfig.getInitParameter("username"));
        System.out.println("當前ServletContext對象值是:"+servletConfig.getServletContext());
    }
image.png

ServletContext 對象

當WEB容器在啟動時,它會為每個Web應用程序都創(chuàng)建一個對應的ServletContext,它代表當前Web應用。并且它會被所有客戶端共享。
在繼承HttpServlet類的doGet()方法里操作ServletContext對象。
如:
getInitParameter() 表示獲取web.xml配置上下文參數(shù)context-para;
getContextPath() 表示獲取當前工程路徑;
getRealPath() 表示獲取應用部署絕對地址;
setAttribute(String name, Object obj); 表示設置指定元素上的某個屬性值;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("servlet2的doget方法");
        ServletContext context = getServletConfig().getServletContext();
        String username = context.getInitParameter("username");
        //獲取web.xml配置上下文參數(shù)context-param
        System.out.println("context-param 參數(shù)username的值是"+username);
        System.out.println("當前工程路徑是"+context.getContextPath());
        System.out.println("當前應用部署路徑是"+context.getRealPath("/"));
        context.setAttribute("name", "小明");
        Object name = context.getAttribute("name");
        System.out.println(name);
    }
image.png

HttpServletRequest 對象

通過HttpServletRequest 對象獲取客戶端所有的請求信息。
如:
getRequestURL()方法,表示返回客戶端發(fā)出請求時的完整URL;
getHeaderNames()方法,表示獲取客戶端請求頭信息;
getParameter() 方法,表示獲取客戶端單選框請求參數(shù);
getParameterValues(String name)方法,表示獲取客戶端復選框請求參數(shù);
setCharacterEncoding()方法,表示設置字符集編碼格式;

簡單制作表單并映射到Servlet2上。
demo.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="http://localhost:8080/Project_javaweb/hello2" method="get">
    用戶名:<input type="text" name="username"><br/>
    密碼:<input type="password" name="password"><br/>
    興趣愛好:<input type="checkbox" name="hobby" value="cpp">C++
    <input type="checkbox" name="hobby" value="java">java
    <input type="checkbox" name="hobby" value="js">JavaScript<br/>
    <input type="submit">
</form>
</body>
</html>

Servlet2類的doGet()方法

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("URI地址:"+request.getRequestURI());
        // 設置UTF-8編碼格式
        request.setCharacterEncoding("UTF-8");
        // 獲取所有Header請求頭并依次打印
        Enumeration<String> enums = request.getHeaderNames();
        while (enums.hasMoreElements()) {
            String headerName = (String) enums.nextElement();
            String headerValue = request.getHeader(headerName);
            System.out.print("<b>" + headerName + "</b>: ");
            System.out.println(headerValue + "<br/>");
        }
        //獲取復選框值并存進array
        System.out.println("選擇的愛好"+ Arrays.asList(request.getParameterValues("hobby")));
    }

HttpServletResponse 對象

通過HttpServletResponse 對象獲取服務器的響應信息。
setContentType()方法 表示設置響應編碼格式;
getOutputStream()方法,表示獲取字節(jié)流向客戶端瀏覽器輸出;
getWriter()方法,表示獲取字符流向客戶端瀏覽器輸出;
比如在響應瀏覽器輸出中文字符。

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String data = "中國";
        OutputStream outputStream = response.getOutputStream();//獲取OutputStream輸出流
        response.setHeader("content-type", "text/html;charset=UTF-8");
        byte[] dataByteArr = data.getBytes("UTF-8");//將字符轉(zhuǎn)換成字節(jié)數(shù)組,指定以UTF-8編碼進行轉(zhuǎn)換
        outputStream.write(dataByteArr);//使用OutputStream流向客戶端輸出字節(jié)數(shù)組
    }

Servlet 腦圖

image.png

參考資料

https://blog.csdn.net/hu360983/article/details/114490231
https://www.bilibili.com/video/BV1Y7411K7zz?p=189
https://codeantenna.com/image/https://img-blog.csdn.net/20150111215251000

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 本文包括: Servlet簡介關于Servlet的一些類 Servlet生命周期 ServletConfig獲得初...
    廖少少閱讀 4,108評論 1 67
  • servlet是運行在web服務器或應用服務器上的組件,用于接收請求(主要是http請求)和響應請求的,它是 數(shù)據(jù)...
    n油炸小朋友閱讀 356評論 0 0
  • Servlet接口: Servlet主要方法: init()--ServletConfig servlet實例化后...
    cxm11閱讀 772評論 0 3
  • Servlet Servlet是只運行在服務器端的java類,運行Servlet程序需要將代碼部署到服務器Serv...
    shawXXQ閱讀 212評論 0 0
  • 一、web服務器 相信大家都聽過說web服務器,常用的J2EE開發(fā)--Tomcat,.NET開發(fā)--IIS等。HT...
    小木58閱讀 534評論 0 1

友情鏈接更多精彩內(nèi)容