1. 程式人生 > >Servlet學習(二)

Servlet學習(二)

name clas com context 自動創建 println nco extends 自動

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) throws
ServletException, 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學習(二)