1. 程式人生 > 其它 >[JavaWeb學習筆記]——Servlet

[JavaWeb學習筆記]——Servlet

Servlet其實就一個執行在web伺服器上的小的Java程式,用於處理從web客戶端傳送的請求,並且對請求作出響應。

Servlet學習筆記

Servlet其實就一個執行在web伺服器上的小的Java程式,用於處理從web客戶端傳送的請求,並且對請求作出響應。

使用

Servlet介面作為入門使用:

  1. 實現Servlet介面
  2. 在web.xml中配置實現類

實際程式設計中一般使用HttpServlet類:

學習參考:https://www.cnblogs.com/libingbin/p/5960456.html

​ SUN設計之初,是有野心,以後的網際網路不僅僅只使用http協議,可以通過GenericSrvlet實現。HttpServlet是一個與協議相關的Servlet,是專門用來處理HTTP協議的請求。通常編寫一個Servlet 一般都會讓這個Servlet 繼承Httpervlet 重寫service方法。
​ 在service方法內部根據請求方式不同執行不同的doXXX的方法(get 請求執行doGet方法,如果是post請求就會執行doPost方法)。
​ 所以往往繼承了HttpServlet 之後不需要重寫service 方法,只需要重寫doGet和doPost方法即可。往往請求要處理的內容的程式碼都是一致的,所以需要讓doGet和doPost相互呼叫可以簡化程式設計。

學習參考:https://www.cnblogs.com/isme-zjh/p/11820298.html

生命週期

英文文件介紹:

This interface defines methods to initialize a servlet, to service requests, and to remove a servlet from the server. These are known as life-cycle methods and are called in the following sequence:

  1. The servlet is constructed, then initialized with the init
    method.
  2. Any calls from clients to the service method are handled.
  3. The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized.

ServletConfig物件

用來獲得Servlet的相關的配置的物件

程式碼演示:

web.xml配置

<servlet>
    <servlet-name>ServletConfig</servlet-name>
    <servlet-class>servlet.demo.ServletConfig</servlet-class>
    
    <init-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>ServletConfig</servlet-name>
    <url-pattern>/config</url-pattern>
</servlet-mapping>

繼承HTTPServlet的類:

public class ServletConfig extends HttpServlet {

    @Override
    public void init(jakarta.servlet.ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("初始化");
        System.out.println("程式別名:"+config.getServletName());
        System.out.println("初始化引數username的值:"+config.getInitParameter("username"));
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }
}

或者直接這樣寫

@WebServlet(name = "Servlet", urlPatterns = "/config",
        initParams = {
                @WebInitParam(name = "username", value = "root")
        }
)

public class ServletConfig extends HttpServlet {

    @Override
    public void init(jakarta.servlet.ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("初始化");
        System.out.println("程式別名:"+config.getServletName());
        System.out.println("初始化引數username的值:"+config.getInitParameter("username"));
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }
}

ServletContext物件

獲取web專案資訊

SeryletContext: Servlet 的上下文物件。ServletContext 物件對Servlet之前和之後的內容
都知道。這個物件-個web專案只有一一個。 在伺服器啟動的時候為每個web專案建立一-個
單獨的ServletContext物件。

public class ServletContextDemo extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //獲取檔案的MIME的型別
        ServletContext servletContext = this.getServletContext();
        String mimeType = servletContext.getMimeType("aa.txt");
        System.out.println(mimeType);
        //獲得請求路徑的工程名
        String path = servletContext.getContextPath();
        System.out.println(path);
        //獲取全域性初始化引數
        String username = servletContext.getInitParameter("username");
        String password = servletContext.getInitParameter("password");
        System.out.println(username+"  "+password);

        Enumeration<String> names = servletContext.getInitParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            String value = servletContext.getInitParameter(name);
            System.out.println(name + "  " + value);
        }
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            doGet(request,response);
        }
    }

web.xml配置

注意<context>標籤寫在<servlet>外面

    <context-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>123123</param-value>
    </context-param>

    <servlet>
        <servlet-name>ServletContext</servlet-name>
        <servlet-class>servlet.demo.ServletContextDemo</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ServletContext</servlet-name>
        <url-pattern>/context</url-pattern>
    </servlet-mapping>

讀取web專案下的檔案

之前使用I0流就可以讀取檔案(java專案中)。現在是-個web專案, web專案需要釋出到tomcat下才能訪問的。獲取web專案下的檔案如果使用傳統的10就會出現問題(原因:路徑中使用的是相對路徑,相對的是JRE環境)。

@WebServlet(name = "Servlet", urlPatterns = "/context")
public class ServletDemo extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Properties properties = new Properties();

        //建立一個檔案的輸入流
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/servlet/demo/db.properties");

//        String path = this.getServletContext().getRealPath("/WEB-INF/classes/servlet/demo/db.properties");
//        System.out.println(path);
//        InputStream is = new FileInputStream(path);

        properties.load(is);

        //獲取資料
        String driverClassName = properties.getProperty("driverClassName");
        String url = properties.getProperty("url");
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");

        System.out.println(driverClassName);
        System.out.println(url);
        System.out.println(username);
        System.out.println(password);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            doGet(request,response);
        }
    }

域物件:

域物件:指的是將資料存入到域物件中,這個資料就會有一定的作用範圍。域指的是一定的作用範圍。

​ ServletContext是在伺服器啟動的時候為每個web專案單獨建立一個ServletContext物件。當web專案從伺服器中移除,或者是關閉伺服器的時候ServletContext 物件會被銷燬。向ServletContext中儲存的資料一直存在 (當伺服器關閉的時候SenvletContext物件被銷燬,然後裡面資料才會失效)。範圍:整個web應用。