Servlet學習(二)
Servlet的三種創建方式
1.實現javax.servlet.Servlet接口(見一)
2.基礎javax.servrt.GenericServler類(適配器模式,用哪個方法就寫哪個,不需要所有父類方法都重寫)
3.繼承javax.servlet.http.HttpServlet類(模板方法設計,常用)
tomcat啟動不起來的時候註意查看web.xml的配置文件
第二種方法例子:
package servlet; import java.io.IOException; import javax.servlet.GenericServlet; import javax.servlet.ServletException;import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class ServletDemo2 extends GenericServlet{ /** * */ private static final long serialVersionUID = -5102796265741373505L; @Override public void service(ServletRequest arg0, ServletResponse arg1) throwsServletException, IOException { System.out.println("service"); } }
第三種方法例子:模板方法設計思想:多態
Servlet s = new ServletDemo3;
s.service() --> 如果ServletDemo3類中重寫doget和dopost方法則調用這兩方法,如果沒有重寫則調用父類的service方法。
package servlet; import java.io.IOException; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo3 extends HttpServlet{ /** * */ private static final long serialVersionUID = -4123099903592371636L; //不能重寫service方法,看源碼service方法裏面最後還是調用回了doget和dopost方法 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doget"); System.out.println(req.getRemoteAddr());//獲取requset的ip地址 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("dopost"); } }
web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <!-- 創建一個servlet實例 --> <servlet> <servlet-name>ServletDemo1</servlet-name> <servlet-class>servlet.ServletDemo1</servlet-class> <!-- servlet在服務器啟動時候就創建 --> <load-on-startup>2</load-on-startup> <!-- 數字越小優先級越高,0默認配置了一個 --> </servlet> <!-- 給servlet提供(映射)一個可供客戶端訪問的URI --> <servlet-mapping> <servlet-name>ServletDemo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletDemo2</servlet-name> <servlet-class>servlet.ServletDemo2</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo2</servlet-name> <url-pattern>/demo2</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletDemo3</servlet-name> <servlet-class>servlet.ServletDemo3</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo3</servlet-name> <url-pattern>/demo3</url-pattern> </servlet-mapping> <!-- 歡迎頁面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
servlet繼承關系:
servlet --> GenericServlet --> HttpServlet --> 自定義servlet類
自動創建servlet,配置url:/demo4 http://loacalhost:8080/demo4
package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServletDemo4 */ @WebServlet("/demo4") public class ServletDemo4 extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ServletDemo4() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("post"); doGet(request, response); } }
servlet映射細節:
一個servlet類可以對應多個url,如下都能找到ServletDemo3這個類:
http://localhost:8080/demo3 http://localhost:8080/demo33 http://localhost:8080/demo333都可
<servlet-mapping> <servlet-name>ServletDemo3</servlet-name> <url-pattern>/demo3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletDemo3</servlet-name> <url-pattern>/demo33</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletDemo3</servlet-name> <url-pattern>/demo333</url-pattern> </servlet-mapping>
url通配:*.;/*,/action/*。三樣都寫上容易出問題。
<servlet-mapping> <servlet-name>ServletDemo3</servlet-name> <url-pattern>*.do</url-pattern><!-- 表示所有以.do結尾的都能找到ServletDemo3類,http://localhost:8080/xxx.do --> </servlet-mapping> <servlet-mapping> <servlet-name>ServletDemo3</servlet-name> <url-pattern>/*</url-pattern><!-- 表示以/結尾都能找到ServletDemo3類,http://localhost:8080/ooo --> </servlet-mapping> <servlet-mapping> <servlet-name>ServletDemo3</servlet-name> <url-pattern>/action/*</url-pattern><!-- 表示以/action/*結尾都能找到ServletDemo3類,http://localhost:8080/action/ooo --> </servlet-mapping>
url優先級:絕對匹配 --> /開頭匹配 --> 擴展名方式匹配
如果url-parttern的值是/,表示執行默認映射。所有資源都是servlet。
http://loacalhost:8080/learn/index.html在tomcat的配置文件web.xml中,有個默認配置通配/,用於找到項目中符合的頁面
判斷:
對於如下的一些映射關系
1.servlet1 --> /abc/*
2.servlet2 --> /*
3.servlet3 --> /abc
4.servlet4 --> *.do
當請求url為/abc/a.html時候,
/abc/*和/*都匹配,哪個servlet響應。
實例化/abc/*(路徑更深)1
當請求url為/abc時,/abc/*和/abc都匹配,哪個servlet響應。
實例化/abc(絕對)3
當請求url為/abc/a.do時候,/abc/*和*.do都匹配,哪個servlet響應。
實例化/abc/* 1
當請求url為/a.do時候,/*和*.do都匹配,哪個servlet響應
實例化/*(斜杠優先)2
當請求url為/xxx/yyy/a.do時候,/*和*.do都匹配,哪個servlet響應。
實例化/*(斜杠優先)2
Servlet學習(二)