JavaWeb筆記1、Servlet 詳解

1、建立一個 Servlet 簡單實現類

一、建立一個 HelloServlet 類(測試 Servlet 接口方法)

 1 //建立一個 HelloServlet 類並實現 Servlet 接口
 2 public class HelloServlet implements Servlet {
 3 
 4     // Tomcat 中止服務時 Servlet 的銷燬方法
 5  @Override 6 public void destroy() { 7 System.out.println("destroy....."); 8  } 9 10  @Override 11 public ServletConfig getServletConfig() { 12 System.out.println("getServletConfig"); 13 return null; 14  } 15 16  @Override 17 public String getServletInfo() { 18 System.out.println("getServletInfo"); 19 return null; 20  } 21 22 // Servlet 加載時 初始化方法 23  @Override 24 public void init(ServletConfig servletConfig) throws ServletException { 25 System.out.println("init"); 26  } 27 28 // servlet 運行時的方法 每次請求調用 29  @Override 30 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { 31 System.out.println("service"); 32  } 33 34 // HelloServlet 實現類的構造方法 加載時調用 35 public HelloServlet() { 36 System.out.println("HelloServlet's constructor"); 37  } 38 39 }

二、配置和映射 Servlet

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 4     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 5     id="WebApp_ID" version="3.1">
 6 
 7     <!-- 配置和映射 Servlet -->
 8     <servlet>
 9         <!-- Servlet 註冊的名字 -->
10         <servlet-name>HelloServlet_java</servlet-name>
11         <!-- Servlet 的全類名 -->
12         <servlet-class>com.panku.javaWeb1.HelloServlet</servlet-class>
13         <!-- 能夠指定 Servlet 被建立的時機 -->
14         <load-on-startup>1</load-on-startup>
15     </servlet>
16 
17     <servlet-mapping>
18         <!-- 須要和某一個 Servlet 節點的 servlet-name 子節點的文本節點一致 -->
19         <servlet-name>HelloServlet_java</servlet-name>
20         <!-- 映射的具體訪問路徑: / 表明當前 Web 應用的根目錄. -->
21         <url-pattern>/hello</url-pattern>
22     </servlet-mapping>
23 
24 </web-app>

 

2、Servlet 生命週期

Servlet 生命週期的方法: 如下方法都是由 Serlvet 容器負責調用.

1). 構造器: 只被調用一次. 只有第一次請求 Servlet 時, 建立 Servlet 的實例. 調用構造器. 這說明 Serlvet 的單實例的!java

2). init 方法: 只被調用一次. 在建立好實例後當即被調用. 用於初始化當前 Servlet. web

3). service: 被屢次調用. 每次請求都會調用 service 方法. 實際用於響應請求的. 數組

4). destroy: 只被調用一次. 在當前 Servlet 所在的 WEB 應用被卸載前調用. 用於釋放當前 Servlet 所佔用的資源.服務器

3、ServletConfig 對象(getInitParameterNames、getInitParameter、getServletName(不經常使用)、getServletContext四個接口方法)

一、在 web.xml 文件中配置 servlet 的初始化參數(init-param 節點)

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 4     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 5     id="WebApp_ID" version="3.1">
 6 
 7     <!-- 配置和映射 Servlet -->
 8     <servlet>
 9         <!-- Servlet 註冊的名字 -->
10         <servlet-name>HelloServlet_java</servlet-name>
11         <!-- Servlet 的全類名 -->
12         <servlet-class>com.panku.javaWeb1.HelloServlet</servlet-class>
13 
14         <!-- 配置 Servlet 的初始化參數 -->
15         <init-param>
16             <!-- 參數名 -->
17             <param-name>user</param-name>
18             <!-- 參數值 -->
19             <param-value>root</param-value>
20         </init-param>
21 
22         <init-param>
23             <param-name>password</param-name>
24             <param-value>123456</param-value>
25         </init-param>
26 
27         <!-- 能夠指定 Servlet 被建立的時機 -->
28         <load-on-startup>1</load-on-startup>
29     </servlet>
30 
31     <servlet-mapping>
32         <!-- 須要和某一個 Servlet 節點的 servlet-name 子節點的文本節點一致 -->
33         <servlet-name>HelloServlet_java</servlet-name>
34         <!-- 映射的具體訪問路徑: / 表明當前 Web 應用的根目錄. -->
35         <url-pattern>/hello</url-pattern>
36     </servlet-mapping>
37 
38 </web-app>

 

二、servlet實現類的 init()方法中 ServletConfig 對象實例(ServletConfig的getInitParameterNames、getInitParameter、getServletName(不經常使用)方法實例)

 1     // Servlet 加載時 初始化方法
 2     @Override
 3     public void init(ServletConfig servletConfig) throws ServletException { 4 System.out.println("init"); 5 6 // 獲取初始化參數值 7 String user = servletConfig.getInitParameter("user"); 8 System.out.println("user:" + user); 9 10 // 獲取初始化參數名和值 11 Enumeration<String> names = servletConfig.getInitParameterNames(); 12 while (names.hasMoreElements()) { 13 String name = names.nextElement(); 14 String value = servletConfig.getInitParameter(name); 15 System.out.println("^^name:" + name + ":" + value); 16  } 17 18 // 獲取 Servlet 註冊名稱 19 String servletName = servletConfig.getServletName(); 20  System.out.println(servletName); 21 }

 

三、在 servlet 實現類的 init()方法中 經過 ServletConfig 對象獲得 ServletContext 對象

ServletContext的常見方法: getInitParameter()、getInitParameterNames()、getRealPath()、getContextPath()、getResourceAsStream()

 1     // Servlet 加載時 初始化方法
 2     @Override
 3     public void init(ServletConfig servletConfig) throws ServletException { 4 System.out.println("init"); 5 6 // WEB初始化參數: 能夠爲全部的 Servlet 所獲取, 而 Servlet 的初始化參數只用那個 Serlvet 能夠獲取. 7 // 獲取 ServletContext 對象 8 ServletContext servletContext = servletConfig.getServletContext(); 9 10 // 獲取當前 WEB 初始化參數值 11 String driver = servletContext.getInitParameter("driver"); 12 System.out.println("driver:" + driver); 13 14 // 獲取當前 WEB 初始化參數名和值 15 Enumeration<String> name2 = servletContext.getInitParameterNames(); 16 while (name2.hasMoreElements()) { 17 String name = name2.nextElement(); 18 String value = servletContext.getInitParameter(name); 19 System.out.println("-->" + name + ":" + value); 20  } 21 22 // 獲取當前 WEB 應用的某一個文件在服務器上的絕對路徑, 而不是不部署前的路徑 23 String realPath = servletContext.getRealPath("/111.txt"); 24 // 不是 E:\eclipse\workspace\JavaWeb\WebContent\111.txt 25  System.out.println(realPath); 26 27 // 獲取當前 WEB 應用的名稱 28 String contextPath = servletContext.getContextPath(); 29  System.out.println(contextPath); 30 31 // 獲取一個文件的輸入流(部署前的路徑) 32 try { 33 ClassLoader classLoader = getClass().getClassLoader(); 34 InputStream is = classLoader.getResourceAsStream("jdbc.properties"); 35 System.out.println("1." + is); 36 } catch (Exception e) { 37  e.printStackTrace(); 38  } 39 40 // 獲取一個文件的輸入流(服務器上的路徑) 41 try { 42 InputStream is2 = servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties"); 43 System.out.println("2." + is2); 44 } catch (Exception e) { 45  e.printStackTrace(); 46  } 47 }

 4、servlet 實現類的 service()方法中的 Request 對象

一、Request 的經常使用方法: getParameter(String name)、getParameterValues(String name)、getParameterNames()、getParameterMap()

 1     // 用於應答請求: 由於每次請求都會調用 service() 方法
 2     // ServletRequest: 封裝了請求信息, 能夠從中獲取到任何的請求信息
 3     // ServletResponse: 封裝了響應信息, 若是想給用戶什麼響應, 具體可使用該接口的方法實現
 4     @Override
 5     public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { 6 System.out.println("請求成功......."); 7  System.out.println(request); 8 9 // String getParameter(String name): 根據請求參數的名字, 返回參數值. 10 String user = request.getParameter("user"); 11 String password = request.getParameter("password"); 12 System.out.println(user + "," + password); 13 14 // getParameter()方法只能獲取一個參數值 15 String interesting = request.getParameter("interesting"); 16  System.out.println(interesting); 17 18 // String[] getParameterValues(String name): 根據請求參數的名字, 返回請求參數對應的字符串數組 19 String[] interestings = request.getParameterValues("interesting"); 20 for (String string : interestings) { 21 System.out.println("-->" + string); 22  } 23 24 // Enumeration getParameterNames(): 返回參數名對應的 Enumeration 對象,相似於 25 // ServletConfig(或 ServletContext) 的 getInitParameterNames() 方法. 26 Enumeration<String> names = request.getParameterNames(); 27 while (names.hasMoreElements()) { 28 String name = names.nextElement(); 29 String valuee = request.getParameter(name); 30 System.out.println("==>" + name + ", " + valuee); 31  } 32 33 // Map getParameterMap(): 返回請求參數的鍵值對: key: 參數名, value: 參數值, String 數組類型. 34 Map<String, String[]> map = request.getParameterMap(); 35 for (Map.Entry<String, String[]> entry : map.entrySet()) { 36 System.out.println("**" + entry.getKey() + ":" + Arrays.asList(entry.getValue())); 37  } 38 }

 

 二、httpServletRequest 的經常使用方法:getRequestURI()、getMethod()、getQueryString()、getServletPath()

 1     public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
 2         System.out.println("請求成功......."); 3  System.out.println(request); 4 // 獲取請求的 URI 5 HttpServletRequest httpServletRequest = (HttpServletRequest) request; 6 String requestURI = httpServletRequest.getRequestURI(); 7  System.out.println(requestURI); 8 9 // 獲取請求方式 10 String method = httpServletRequest.getMethod(); 11  System.out.println(method); 12 13 // 如果一個 GET 請求, 獲取請求參數對應的那個字符串, 即 ? 後的那個字符串. 14 String queryString = httpServletRequest.getQueryString(); 15  System.out.println(queryString); 16 17 // 獲取請求的 Serlvet 的映射路徑 18 String servletPath = httpServletRequest.getServletPath(); 19  System.out.println(servletPath); 20 }

 

5、servlet 實現類的 service()方法中的 Response 對象

Response 目前經常使用方法:setContentType()、getWriter()

 1     public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
 2         System.out.println("請求成功......."); 3  System.out.println(request); 4 // 設置響應方式 5 response.setContentType("application/msword"); 6 7 // 在頁面響應一個內容 8 PrintWriter out = response.getWriter(); 9 out.println("HelloWorld..."); 10 }

 6、GenericServlet 實現 Servelt、ServletConfig接口

 1 public abstract class MyGenericServlet implements Servlet, ServletConfig {
 2 
 3     // 如下方法爲 Servlet 接口的方法
 4     @Override
 5     public void destroy() {
 6     }
 7 
 8     @Override
 9     public ServletConfig getServletConfig() {
10         return servletconfig;
11     }
12 
13     @Override
14     public String getServletInfo() {
15         return null;
16     }
17 
18     private ServletConfig servletconfig;
19 
20     @Override
21     public void init(ServletConfig arg0) throws ServletException {
22         this.servletconfig = arg0;
23         init();
24     }
25 
26     public void init() throws ServletException {
27     }
28 
29     @Override
30     public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException;
31 
32     // 如下方法爲 ServletConfig 接口的方法
33     @Override
34     public String getInitParameter(String arg0) {
35         return servletconfig.getInitParameter(arg0);
36     }
37 
38     @Override
39     public Enumeration<String> getInitParameterNames() {
40         return servletconfig.getInitParameterNames();
41     }
42 
43     @Override
44     public ServletContext getServletContext() {
45         return servletconfig.getServletContext();
46     }
47 
48     @Override
49     public String getServletName() {
50         return servletconfig.getServletName();
51     }
52 
53 }
View Code

 

 

 

 7、HttpServlet 繼承 GenericServlet類

 1 public class MyHttpServlet extends MyGenericServlet {
 2 
 3     @Override
 4     public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
 5 
 6         if (arg0 instanceof HttpServletRequest) {
 7             HttpServletRequest request = (HttpServletRequest) arg0;
 8 
 9             if (arg1 instanceof HttpServletResponse) {
10                 HttpServletResponse response = (HttpServletResponse) arg1;
11 
12                 service(request, response);
13             }
14         }
15     }
16 
17     public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
18 
19         // 1.獲取請求方式
20         String method = request.getMethod();
21 
22         // 2.根據請求方式再調用對應的處理方法
23         if ("get".equalsIgnoreCase(method)) {
24             doGet(request, response);
25         } else if ("set".equalsIgnoreCase(method)) {
26             doPost(request, response);
27         }
28     }
29 
30     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
31 
32     }
33 
34     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
35 
36     }
37 
38 }
View Code
相關文章
相關標籤/搜索