天天看點

Javaweb開發了解前端知識七、Servlet(一)1.Servlet技術2.Servlet類的繼承體系3.ServletConfig類4.ServletContext類1.Servlet技術 2.Servlet類的繼承體系3.ServletConfig類4.ServletContext類

1.Servlet技術

2.Servlet類的繼承體系

3.ServletConfig類

4.ServletContext類

1.Servlet技術

a) 什麼是Servlet

Servlet是javaWeb的三大元件。Servlet程式,Listener監聽器。Filter過濾器。

Servlet程式主要是運作在Tomcat伺服器上。

Servlet程式的作用:接收用戶端的請求。響應給用戶端資料。

b) 手動實作Servlet程式

1、編寫一個類去實作Servlet接口

2、實作Servlet程式中的service方法(處理業務的方法)

3、到web.xml中去配置Servlet程式的通路位址

Servlet程式的源代碼:

public class HelloServlet implements Servlet {

	/**
	 * 	Servlet程式接收用戶端的請求,并且響應資料<br/>
	 *  service在每請求進來 的時候,負責 處理業務
	 */
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		System.out.println("HelloServlet 程式被通路了~");
	}
}
           

web.xml中的配置:

<!-- servlet标簽用來配置一個Servlet程式 -->
	<servlet>
		<!-- 給你要配置的Servlet程式起一個名稱,一般放的是類名(可以任意自定義) -->
		<servlet-name>HelloServlet</servlet-name>
		<!-- servlet-class标簽是配置Servlet程式的全類名 -->
		<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
	</servlet>
	<!-- servlet-mapping是配置Servlet程式的通路位址 -->
	<servlet-mapping>
		<servlet-name>HelloServlet</servlet-name>
		<!-- 
			url-paatern是配置通路位址。
			/hello 表示http://ip:port/工程名/hello
		 -->
		<url-pattern>/hello</url-pattern>
</servlet-mapping>
           
Javaweb開發了解前端知識七、Servlet(一)1.Servlet技術2.Servlet類的繼承體系3.ServletConfig類4.ServletContext類1.Servlet技術 2.Servlet類的繼承體系3.ServletConfig類4.ServletContext類

a) Servlet的生命周期

1、先執行Servlet的構造方法

2、執行Servlet程式的init初始化方法

構造方法和init初始化方法,隻是第一次通路的時候由Tomcat伺服器來調用,隻調用一次

3、執行Service方法 (每次通路都會被調用)

4、執行destroy方法(伺服器停止,停止web工程 )

b) 模拟GET請求和POST請求的分發

請求分為GET請求和POST請求。(一般GET請求和POST請求有可能會做不同的業務操作)

伺服器如何區分 GET請求和POST請求。

/**
	 * 	Servlet程式接收用戶端的請求,并且響應資料<br/>
	 *  service在每請求進來 的時候,負責 處理業務
	 */
	@Override
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
//		System.out.println("HelloServlet 程式被通路了~");
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		// getMethod傳回是GET或POST,傳回請求的方式
		String method = httpRequest.getMethod();
		System.out.println(method);
		if ("GET".equals(method)) {
			// 如果是GET請求,執行get業務
			doGet();
		} else if ("POST".equals(method)) {
			//執行post請求的業務操作
			doPost();
		}
		
	}
	/**
	 * 這是GET請求需要做的工作
	 */
	public void doGet() {
		System.out.println("doGet 這是GET請求");
	}
	/**
	 * 這是POST請求需要做的工作
	 */
	public void doPost() {
		System.out.println("doPost 這是POST請求");
	}
           

a) 通過繼承HttpServlet實作Servlet程式

在實作的開發中,我們都是使用HttpServlet抽取類去實作Servlet程式。

1、編寫一個類去繼承HttpServlet類

2、重寫doGet方法和doPost方法

3、到web.xml中去配置Servlet程式的通路位址

HelloServlet2類

public class HelloServlet2 extends HttpServlet {

	/**
	 * doGet方法,是GET請求的時候,會自動的調用
	 */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("這是GET請求,調用了doGet方法");
	}

	/**
	 * doPost方法,是POST請求的時候,會自動的調用
	 */
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("這是POST請求,調用了doPost方法");
	}

}
           

web.xml中的配置:

<servlet>
		<servlet-name>abc</servlet-name>
		<servlet-class>com.atguigu.servlet.HelloServlet2</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>abc</servlet-name>
		<!-- url-pattern 中 /ccc 表示http://ip:port/工程名/ccc
				<br/>
			 url-pattern以斜線打頭,配置的位址跟在工程名的後面
			 
			 web.xml中有了修改之後一定要重新開機Tomcat伺服器才能生效
			 
			 在浏覽器位址欄中輸入位址,然後敲 回車是GET請求
		  -->
		<url-pattern>/ccc</url-pattern>
</servlet-mappi
           

2.Servlet類的繼承體系

Javaweb開發了解前端知識七、Servlet(一)1.Servlet技術2.Servlet類的繼承體系3.ServletConfig類4.ServletContext類1.Servlet技術 2.Servlet類的繼承體系3.ServletConfig類4.ServletContext類

我們在重寫doGet方法或doPost方法的時候,方法體内,一定不能調用super.doGet或super.doPost代碼。否則會報405錯誤

3.ServletConfig類

我們所有的類都是由tomcat伺服器進行建立。我們負責使用。

ServletConfig類它封裝了Servlet程式的配置資訊。

a) ServletConfig類的三大作用

1、擷取Servlet程式在web.xml中配置的名稱

2、擷取在web.xml中配置的初始化參數

3、擷取ServletContext對象

public class ConfigServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void init(ServletConfig config) throws ServletException {
//		1、擷取Servlet程式在web.xml中配置的名稱
		System.out.println("在web.xml中配置的servlet-name名稱:" + config.getServletName());
//		2、擷取在web.xml中配置的初始化參數
		System.out.println("username初始化參數值:" + config.getInitParameter("username"));
		System.out.println("url初始化參數值:" + config.getInitParameter("url"));
//		3、擷取ServletContext對象
		System.out.println( config.getServletContext() );
	}
}
           

web.xml中的配置:

<servlet>
    <servlet-name>ConfigServlet</servlet-name>
    <servlet-class>com.atguigu.servlet.ConfigServlet</servlet-class>
    <!-- init-param 是給Servlet程式配置一個初始化鍵值對參數 -->
    <init-param>
    	<!-- param-name是參數名 -->
    	<param-name>username</param-name>
    	<!-- param-value是參數值 -->
    	<param-value>root</param-value>
    </init-param>
    <!-- init-param 是給Servlet程式配置一個初始化鍵值對參數 -->
    <init-param>
    	<!-- param-name是參數名 -->
    	<param-name>url</param-name>
    	<!-- param-value是參數值 -->
    	<param-value>jdbc:mysql://localhost:3306/test</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>ConfigServlet</servlet-name>
    <url-pattern>/configServlet</url-pattern>
  </servlet-mapping>
           

注意:ServletConfig是在GenericServlet類中持有的引用。當我們需要在自己自定義的Servlet程式中重寫init(ServletConfig)初始化方法的時候。

一定要調用super.init(config); 否則父類中的ServletConfig就不能得到初始化

4.ServletContext類

a) 什麼是ServletContext?

1、ServletContext對象是一個接口。

2、ServletContext在一個web工程中隻有一個對象執行個體(也是由Tomcat伺服器建立)。

3、ServletContext是一個域對象。

什麼是域對象?

域對象指的是可以像map一樣存取資料的對象。

put setAttribute 儲存資料

get getAttribute 擷取資料

域指的儲存和擷取資料的範圍。ServletContext對象它的資料操作範圍是整個web工程。

ServletContext對象在web工程啟動的時候建立。在web工程停止的時候銷毀。

b) ServletContext類的四個作用

1、它可以擷取在web.xml中配置的上下文參數<context-param>

2、它可以擷取到目前web工程的工程名(工程路徑)

3、它可以擷取web工程釋出到伺服器上之後。檔案或目錄在伺服器磁盤上的絕對路徑。

4、它可以像map一樣存取資料。

protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// b)ServletContext類的四個作用
		ServletContext ctx = getServletContext();
		// 1、它可以擷取在web.xml中配置的上下文參數<context-param>
		System.out.println("上下文初始化參數password的值:"
				+ ctx.getInitParameter("password"));
		System.out.println("上下文初始化參數driverClass的值:"
				+ ctx.getInitParameter("driverClass"));
		// 2、它可以擷取到目前web工程的工程名(工程路徑)
		// getContextPath()擷取目前工程名
		System.out.println(ctx.getContextPath());
		// 3、它可以擷取web工程釋出到伺服器上之後。檔案或目錄在伺服器磁盤上的絕對路徑。
		// getRealPath是擷取指定的路徑的資源在伺服器上的絕對路徑。
		// / 斜線,表示 根,
		// / 斜線 在web工程中 表示到http://ip:port/工程名/ 映射到 代碼的WebContent目錄
		System.out.println(ctx.getRealPath("/"));
		System.out.println("WebContent/css的絕對路徑是:" + ctx.getRealPath("/css"));
		System.out.println("WebContent/imgs/ludashi.jpg的絕對路徑是:" + ctx.getRealPath("/imgs/ludashi.jpg"));
	}
           

在web.xml中的配置:

<context-param>
    <param-name>password</param-name>
    <param-value>root</param-value>
  </context-param>
  <context-param>
    <param-name>driverClass</param-name>
    <param-value>com.mysql.jdbc.Driver</param-value>
  </context-param>
           

 Javaweb開發了解前端知識六、Tomcat