JavaWeb筆記一、Servlet 詳解,javawebservlet
一、建立一個 Servlet 簡單實作類別1、建立一個 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 @Override11 public ServletConfig getServletConfig() {12 System.out.println("getServletConfig");13 return null;14 }15 16 @Override17 public String getServletInfo() {18 System.out.println("getServletInfo");19 return null;20 }21 22 // Servlet 載入時 初始化方法23 @Override24 public void init(ServletConfig servletConfig) throws ServletException {25 System.out.println("init");26 }27 28 // servlet 運行時的方法 每次請求調用29 @Override30 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 }2、配置和映射 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>
二、Servlet 生命週期Servlet 生命週期的方法: 以下方法都是由 Serlvet 容器負責調用.
1). 構造器: 只被調用一次. 只有第一次請求 Servlet 時, 建立 Servlet 的執行個體. 調用構造器. 這說明 Serlvet 的單一實例的!
2). init 方法: 只被調用一次. 在建立好執行個體後立即被調用. 用於初始化當前 Servlet.
3). service: 被多次調用. 每次請求都會調用 service 方法. 實際用於響應請求的.
4). destroy: 只被調用一次. 在當前 Servlet 所在的 WEB 應用被卸載前調用. 用於釋放當前 Servlet 所佔用的資源.
三、ServletConfig 對象(getInitParameterNames、getInitParameter、getServletName(不常用)、getServletContext四個介面方法)1、在 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>
2、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 }
3、在 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.txt25 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 } 四、servlet 實作類別的 service()方法中的 Request 對象1、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 }
2、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 }
五、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 } 六、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 @Override14 public String getServletInfo() {15 return null;16 }17 18 private ServletConfig servletconfig;19 20 @Override21 public void init(ServletConfig arg0) throws ServletException {22 this.servletconfig = arg0;23 init();24 }25 26 public void init() throws ServletException {27 }28 29 @Override30 public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException;31 32 // 以下方法為 ServletConfig 介面的方法33 @Override34 public String getInitParameter(String arg0) {35 return servletconfig.getInitParameter(arg0);36 }37 38 @Override39 public Enumeration<String> getInitParameterNames() {40 return servletconfig.getInitParameterNames();41 }42 43 @Override44 public ServletContext getServletContext() {45 return servletconfig.getServletContext();46 }47 48 @Override49 public String getServletName() {50 return servletconfig.getServletName();51 }52 53 }View Code
七、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