JavaWeb——Servlet

cool_cool_coo1發表於2019-01-14

Servlet:

Java類必須符合一定的規範

  •     a.必須繼承  javax.servlet.http.HttpServlet
  •     b.重寫其中的 doGet()或doPost()方法

 

  • doGet(): 接受 並處 所有get提交方式的請求
  • doPost():接受 並處 所有post提交方式的請求


Servlet要想使用,必須配置
Serlvet2.5:web.xml
Servle3.0: @WebServlet


Serlvet2.5:web.xml:

專案的根目錄:WebContent 、src

<a href="WelcomeServlet">所在的jsp是在 WebContent目錄中,因此 發出的請求WelcomeServlet  是去請求專案的根目錄。

Servlet流程:
請求 -><url-pattern> -> 根據<servlet-mapping>中的<servlet-name> 去匹配  <servlet> 中的<servlet-name>,然後尋找到<servlet-class>,求中將請求交由該<servlet-class>執行。

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
		<a href="WelcomeServlet">WelcomeServlet</a><br/>
		<form action="/WelcomeServlet" method="post">
			<input type="submit" >
		</form>
</body>
</html>

WelcomeServlet

package b1;


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 WelcomeServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doGet...");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//System.out.println("doPost...");
		this.doGet(req, resp);
	}
	
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  
  <servlet>
  		<servlet-name>WelcomeServlet</servlet-name>
  		<servlet-class>b1.WelcomeServlet</servlet-class>
  </servlet>
  
  
  <servlet-mapping>
  		<servlet-name>WelcomeServlet</servlet-name>
  		<url-pattern>/WelcomeServlet</url-pattern>
  </servlet-mapping>

</web-app>

2個/:
jsp:/  localhost:8888
web.xml: /   http://localhost:8888/專案名/

1.回顧純手工方法建立第一個Servlet

步驟:

  1. 編寫一個類,繼承HttpServlet
  2. 重寫doGet()、doPost()方法
  3. 編寫web.xml 中的servlet對映關係

2.藉助於Eclipse快速生成Servlet


直接新建Servlet即可!(繼承、重寫、web.xml  可以藉助Eclipse自動生成)

Servlet3.0,與Servlet2.5的區別:
Servlet3.0不需要在web.xml中配置,但 需要在 Servlet類的定義處之上編寫 註解@WebServlet("url-pattern的值") 
匹配流程:  請求地址 與@WebServlet中的值 進行匹配,如果匹配成功 ,則說明 請求的就是該註解所對應的類

3.   /

專案根目錄:WebContent、src(所有的構建路徑)
例如:
WebContent中有一個檔案index.jsp
src中有一個Servlet.java  

如果: index.jsp中請求 <a href="abc">...</a> ,則 尋找範圍:既會在src根目錄中找  也會在WebContent根目錄中找

如果:index.jsp中請求<a href="a/abc"></a>,尋找範圍:先在src或WebContent中找a目錄,然後再在a目錄中找abc

  • web.xml中的 /:代表專案根路徑——————http://localhost:8888/Servlet25Project/
  • jsp中的/: 伺服器根路徑——————http://localhost:8888/

構建路徑、WebContent:根目錄

4.Servlet生命週期:5個階段 

  • 載入
  • 初始化: init()  ,該方法會在 Servlet被載入並例項化的以後 執行
  • 服務  :service() ->doGet()  doPost
  • 銷燬  :destroy(),  Servlet被系統回收時執行
  • 解除安裝

init():

                 a.預設第一次訪問 Servlet時會被執行 (只執行這一次
                 b.可以修改為 Tomcat啟動時自動執行
                     i.Servlet2.5:  web.xml
                          <servlet>
                                        ...
                               <load-on-startup>1</load-on-startup>
                            </servlet>
                         其中的“1”代表第一個。
                    ii.Servlet3.0
                        @WebServlet( value="/WelcomeServlet" ,loadOnStartup=1  )


service()

->doGet()  doPost :呼叫幾次,則執行幾次

destroy()

關閉tomcat服務時,執行一次

package org.lanqiao.servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class WelcomeServlet extends HttpServlet{
	
	@Override
	public void init() throws ServletException {
		System.out.println("init...");
		//獲取當前Servlet的初始化引數
		String value = super.getInitParameter("servletparamname") ;
		System.out.println("當前Servlet的引數servletparamname的值是:"+value);
		//獲取當前Web容器的初始化引數
		
		ServletContext servletContext = super.getServletContext() ;
		String globalValue = servletContext.getInitParameter("globalParam") ;
		System.out.println("當前Web容器的 引數globalValue的值是:"+globalValue);
		
	}
	
	@Override
	public void destroy() {
		System.out.println("destroy....");
	}
	
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("service的具體實現(doGet...doPost..)...");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//System.out.println("doPost...");
		this.doGet(req, resp);
	}
	
}


5 Servlet API :

由兩個軟體包組成: 對應於HTTP協議的軟體包、對應於除了HTTP協議以外的其他軟體包
即Servlet  API可以適用於 任何 通訊協議。 
我們學習的Servlet,是位於javax.servlet.http包中的類和介面,是基礎HTTP協議。

6.Servlet繼承關係

ServletConfig:介面 

  • ServletContext getServletContext():獲取Servlet上下文物件   application
  • String  getInitParameter(String name):在當前Servlet範圍內,獲取名為name的引數值(初始化引數)

     a.ServletContext中的常見方法(application):

  • getContextPath():相對路徑
  • getRealPath():絕對路徑
  • setAttribute() 、getAttribute()
  • String getInitParameter(String name);在當前Web容器範圍內,獲取名為name的引數值(初始化引數)

Servlet3.0方式 給當前Servlet設定初始值:
@WebServlet( .... , initParams= {@WebInitParam(name="serveltparaname30",value="servletparavalue30")   }   )
注意,此註解只 隸屬於某一個具體的Servlet ,因此無法為 整個web容器設定初始化引數 (如果要通過3.0方式設定 web容器的初始化引數,仍然需要在web.xml中設定)

HttpServletRequest中的方法:(同request),例如setAttrite()、getCookies()、getMethod()
HttpServletResponse中的方法:同response

Servlet使用層面:

注1:Eclipse中在src建立一個Servlet,然後重寫doGet()  doPost()就可以  (doGet() doPost()只需要編寫一個)。

注2:介面類空實現:實現類只需要重寫需要的方法,不使用的不需要重寫

相關文章