創建一個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();