Java web學習筆記之二——編寫Servlet

創建一個Servlet類

A Servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.

javax.servlet.Servlet是一個接口。抽象類javax.servlet.GenericServlet實現了它,這是一個與協議無關的Servlet抽象類。我們要討論的主要是javax.servlet.http.HttpServlet,這個類繼承了GenericServlet實現了其service抽象方法用來處理HTTP請求,最後針對不同的HTTP方法調用doGet,doPost等一系列方法。自定義Servlet時,繼承HttpServlet,然後重寫doXXX方法。

在Web容器中,一個Servlet只有一個實例,如果Servlet配置爲容器啓動時加載,那麼在Web容器啓動時加載,並且會調用其init方法,否則init在Servlet第一次被請求時調用。當Web容器關閉時,調用destroy方法。這兩個方法都在Servlet接口中進行了定義。要注意的是init方法其實有個參數javax.servlet.ServletConfig,不過GenericServlet實現了該方法並調用了無參數的init方法。init方法的調用發生在Servlet構造方法之後,在能進行響應請求之前,該方法中適合用於初始化數據庫之類的操作。準確的說,只有在init方法調用之後,Servlet纔是一個真正的Servlet,ServletConfig和javax.servlet.ServletContext對象都已經準備完畢。

public class HelloServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
    {
        response.getWriter().println("Hello, World!");
    }
}

在部署描述文件中配置Servlet

部署描述文件就是位於WEB-INF目錄中web.xml,在該文件中放置應用程序中所有的listeners,servlets和filters。類似於Android應用程序中的AndroidManifest.xml清單文件。

<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.wrox.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

load-on-startup使得Servlet在容器啓動時加載並調用其init方法。標籤中的數字表示啓動順序的優先級,數字越小越優先。

映射URL到Servlet

可以映射多個URL到一個Servlet

<servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/greeting</url-pattern>
    <url-pattern>/salutation</url-pattern>
    <url-pattern>/wazzup</url-pattern>
</servlet-mapping>

使用註解

@WebServlet(
name = "helloServlet",
urlPatterns = {"/greeting", "/salutation", "/wazzup"},
loadOnStartup = 1
)
public class HelloServlet extends HttpServlet
{

}

接收query參數和post參數

String user = request.getParameter("user");

在使用該方法接收了post參數(位於請求體中)後,不能再調用request的getInputStream或者getReader,否則發生異常。有的參數有多個值,比如複選框。如下獲取。

String[] array = request.getParameterValues("color");

使用init參數配置應用

使用Context init參數

這些參數只能在部署描述文件中定義。

<context-param>
    <param-name>settingOne</param-name>
    <param-value>foo</param-value>
</context-param>
<context-param>
    <param-name>settingTwo</param-name>
    <param-value>bar</param-value>
</context-param>

被所有Servlet公有,Servlet中這樣使用:

ServletContext c = this.getServletContext();
c.getInitParameter("settingOne");

使用Servlet init參數

在部署描述文件中定義Servet的init參數

<servlet>
    <servlet-name>servletParameterServlet</servlet-name>
    <servlet-class>com.wrox.ServletParameterServlet</servlet-class>
    <init-param>
        <param-name>database</param-name>
        <param-value>CustomerSupport</param-value>
    </init-param>
    <init-param>
        <param-name>server</param-name>
        <param-value>10.0.12.5</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>servletParameterServlet</servlet-name>
    <url-pattern>/servletParameters</url-pattern>
</servlet-mapping>

在註解中配置

@WebServlet(
    name = "servletParameterServlet",
    urlPatterns = {"/servletParameters"},
    initParams = {
        @WebInitParam(name = "database", value = "CustomerSupport"),
        @WebInitParam(name = "server", value = "10.0.12.5")
    }
)
public class ServletParameterServlet extends HttpServlet
{

}

使用Form上傳文件

在Servlet上添加註解
文件小於fileSizeThreshold則存在內存中
maxFileSize爲能上傳的最大文件
maxRequestSize爲能接收的Request的最大大小,不管文件多大。

@MultipartConfig(
        fileSizeThreshold = 5_242_880, //5MB
        maxFileSize = 20_971_520L, //20MB
        maxRequestSize = 41_943_040L //40MB
)

假設html中文件上傳控件如此定義

<input type="file" name="file1"/>

Servlet中如此處理Request

Part filePart = request.getPart("file1");
InputStream inputStream = filePart.getInputStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int read;
final byte[] bytes = new byte[1024];
while((read = inputStream.read(bytes)) != -1)
{
    outputStream.write(bytes, 0, read);
}
//獲取上傳時的原文件名
filePart.getSubmittedFileName();
outputStream.toByteArray();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章