在之前的學習中,我們主要學習的是JSP的一些使用方法,在這一節中我們將學習關於Servlet的編寫。
1、Servlet簡單編寫
JSP的本質就是Servlet,使用JSP編寫我們的Web應用可以幫助我們簡化應用表現層的代碼,如果我們直接使用Servlet來編寫和JSP同樣的一個頁面,你會發現我們需要使用大量的out語句來給瀏覽器輸出HTML語句。因此MVC規範出現以後,Servlet的責任明確下來,Servlet僅僅作爲控制器使用,不需要去生成表現層的代碼,這樣就讓我們的Servlet編寫變的更簡便了。
例如下面的代碼:
a.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
form id="form1" action="b.jsp" method="post">
用戶名:<input type="text" name="username">
密碼:<input type="text" name="password">
<input type="submit" value="登錄">
</form>
</body>
</html>
b.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
String username=request.getParameter("username");
String password=request.getParameter("password");
%>
</form>
</body>
</html>
c.java:
public class Servlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,java.io.IOException
{
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charSet=GBK");
String username=request.getParameter("username");
String password=request.getParameter("password");
out.println("\r\n");
out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.println("<html>\r\n");
out.println("<head>\r\n");
out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n");
out.println("<title>Insert title here</title>\r\n");
out.println("</head>\r\n");
out.println("<body>\r\n");
out.println("用戶名"+username);
out.println("密碼"+password);
out.println("</body>\r\n");
out.println("</html>");
}
}
在上述的三個文件中,a.jsp中我們定義了一個表單,讓用戶輸入用戶名和密碼,然後b.jsp可以獲取到用戶的輸入,如果我們想直接編寫一個Servlet獲取用戶的輸入並且將他們輸出到瀏覽器中,那我們就可以用c.java的這段代碼。
在c.java的代碼中,首先我們聲明瞭一個類叫Servlet並且它繼承了HttpServlet,在這個類中我們重寫service方法,在service方法中我們獲取了用戶的用戶名和密碼並且輸出到瀏覽其。通過這段代碼我們可以看出,如果我們要用Servlet同時負責表現層的代碼,會非常麻煩,每一行代碼都要用out輸出流輸出到瀏覽器中才能實現,所以我們在編寫Servlet時儘量避免編寫表現層的代碼。
2、Servlet的配置
Servlet主要有兩種配置方式:
- 在Servlet類中使用@WebServlet註解進行配置。
- 在web.xml中進行配置。
當我們使用Servlet類的@WebServlet註解進行配置的時候,將會用到以下幾條屬性:
- asyncSupported:指定該Servlet是否支持異步操作模式。
- displayName:指定該Servlet的顯示名。
- initParams:給該Servlet配置參數。
- loadOnStartup:將該Servlet配置爲load-on-startup的Servlet。
- name:指定該Servlet的名稱。
- urlPatterns/value:都是用來指定該Servlet處理的URL。
當我們使用註解配置Servlet時,要注意不要在web.xml的根元素中指定metadata-complete=”true”,同時不要在web.xml中配置這個Servlet。
如果我們要用web.xml配置,則要配置Servlet的名字和URL,分別對應於元素和元素。要想讓我們的Servlet頁面能夠響應用戶的請求,我們必須要配置URL。
例如下面的一段代碼就是用來在web.xml中配置一個Servlet的:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instancehttp://www.springmodules.org/schema/cache/springmodules-cache.xsd http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>WebTest</display-name>
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/ser</url-pattern>
</servlet-mapping>
</web-app>
3、JSP/Servlet的生命週期
在Servlet中主要有三個函數,分別是init、service和destroy函數,當客戶端第一次請求一個Servlet的時候,我們就會創建一個Servlet的實例並且使用init方法進行初始化並且使用service方法響應用戶,接下來每當客戶端請求一次這個Servlet,我們都用調用一次service方法來響應用戶,直到調用destroy方法銷燬了這個實例,通常我們在關閉Web應用的時候調用destroy方法。以上就是一個Servlet的生命週期,但是還有一種Servlet並不是在用戶請求時才創建實例,而是在Web應用啓動的時候就創建了實例,這種Servlet我們叫做load-on-startup Servlet。
要想配置一個Servlet成爲load-on-startup Servlet,我們可以在web.xml中用以下代碼配置:
<servlet>
<load-on-startup>1</load-on-startup>
</servlet>
或者使用@WebServlet註解配置:
@WebServlet(loadOnStartup=1)
4、Servlet配置參數
配置Servlet時還可以增加額外的配置參數。具體使用方法如下:
在@WebServlet註解中配置:
@WebServlet(name="servlet",urlPatterns={"/ser"},
initParams={
@WebInitParam=(name="username",value="dasyang"),
@WebInitParam=(name="password",value="12312")})
}
然後可以使用以下代碼獲取參數:
String username=config.getInitParameter("username");
String password=config.getInitParameter("password");
或者我們可以在web.xml中配置額外參數:
<servlet>
<init-param>
<param-name>username</param-name>
<param-value>dasyang</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>494894</param-value>
</init-param>
</servlet>