Servlet常見用法
Servlet的學習
Servlet是一個Java程式,執行在web伺服器上,用來接受和響應客戶端的http請求。
更多的是配合動態資源來做。當然靜態資源也需要使用Servlet,只不過Tomcat已經定義了一個DefaultServlet;Tomcat實際上是Servlet的一個容器
當剛開始要寫Servlet時,出現了個小問題,就是在Myeclipse下找不到Servlet包,原因可能是當初從jdk1.8切換到1.7時,tomcat的jdk還沒切換過來;或者是得改一下tomcat伺服器的一個Targeted Runtimes選項的配置。
所以又得鼓搗,下面是解決方案:
1.先把配置tomcat的jdk版本換到1.7,步驟為
1)Window->Preferences
2)搜尋tomcat 選擇7.x,在選擇jdk,接著將jdk1.8改為1.7即可
2.修改tomcat伺服器的一個Targeted Runtimes選項
1)右擊專案名->properties
2)選擇下面的Targeted Runtimes
3)選擇右邊你所開啟的Tomcat 伺服器->apply->ok即可
Servlet簡單使用
1.一個web工程,一個伺服器
2.測試執行web工程
3.新建一個類,實現Servlet介面
4.配置Servlet,告訴伺服器,應用有的Servlet
先給出Servlet在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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>JavaWeb_1</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 向tomcat登記,這個應用裡又這個Servlet叫s1,具體路徑是/JavaWeb_1/src/cw/Servlet/Servlet01.java --> <servlet> <servlet-name>qq</servlet-name> <servlet-class>cw.Servlet.Servlet01</servlet-class> </servlet> <!-- 註冊Servlet的對映,servlet-name,找到上面註冊的具體Servlet,url-pattern:在位址列上的path --> <servlet-mapping> <servlet-name>qq</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping> <servlet> <servlet-name>kk</servlet-name> <servlet-class>cw.Servlet.Servlet02</servlet-class> </servlet> <servlet-mapping> <servlet-name>kk</servlet-name> <url-pattern>/b</url-pattern> </servlet-mapping> <servlet> <servlet-name>mm</servlet-name> <servlet-class>cw.Servlet.Servlet03</servlet-class> </servlet> <servlet-mapping> <servlet-name>mm</servlet-name> <url-pattern>/c</url-pattern> </servlet-mapping> <servlet> <servlet-name>gg</servlet-name> <servlet-class>cw.Servlet.Servlet04</servlet-class> <!-- 讓servlet提前加的一個標籤,數值越小,在伺服器建立的時間越早 --> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>gg</servlet-name> <url-pattern>/d</url-pattern> </servlet-mapping> <servlet> <servlet-name>hh</servlet-name> <servlet-class>cw.Servlet.Servlet05</servlet-class> <!-- 可以新增初始化引數 --> <init-param> <param-name>add</param-name> <param-value>haiK</param-value> </init-param> <init-param> <param-name>add2</param-name> <param-value>haiK2</param-value> </init-param> <init-param> <param-name>add3</param-name> <param-value>haiK3</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hh</servlet-name> <url-pattern>/e</url-pattern> </servlet-mapping> </web-app>
1.Servlet的通用寫法:
Servlet是一個介面,GenericServlet是一個實現Servlet的類,HttpServlet是GenericServlet的子類。HttpServlet用於處理http的請求,可以定義一個類,繼承HttpServlet複寫doGet和doPost.
Servlet01.java
package cw.Servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Servlet01 implements Servlet{
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("hello world");
}
public void destroy() {
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
public void init(ServletConfig arg0) throws ServletException {
}
}
Servlet02.java
package cw.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 Servlet02 extends HttpServlet{
//Get請求會來這個方法
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("get.....");
}
//Post請求會來這個方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("Post.....");
}
}
2.Servlet的生命週期
生命週期:從建立到銷燬的一段時間
生命週期的方法:從建立到銷燬,所呼叫的方法
1)建立該servlet的例項時,就執行該方法,預設情況是訪問該servlet,就會建立例項.一個servlet只會初始化一次,init()方法只會執行一次
2)只要客戶端來了一個請求,那麼就執行service方法,該方法可以被執行很多次.一次請求,對應一次service方法的呼叫.
3)servlet銷燬時,會呼叫該方法.該專案從tomcat的裡面移除會呼叫;正常關閉tomcat就會執行shutdown.bat.
Servlet03.java
package cw.Servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Servlet03 implements Servlet{
/*
1.建立該servlet的例項時,就執行該方法,預設情況是訪問該servlet,就會建立例項.
一個servlet只會初始化一次,init()方法只會執行一次
*/
public void init(ServletConfig arg0) throws ServletException {
System.out.println("Servlet初始化");
}
/*
2.只要客戶端來了一個請求,那麼就執行這個方法
該方法可以被執行很多次,一次請求,對應一次service方法的呼叫
*/
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("++service方法被呼叫");
}
/*
3.servlet銷燬時,會呼叫該方法.
1)該專案從tomcat的裡面移除會呼叫
2)正常關閉tomcat就會執行shutdown.bat
*/
public void destroy() {
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
}
3.用於讓servlet建立例項的時機提前的寫法:
(1)因為在預設情況下,只有在初次訪問servlet時,才會執行init方法。而我們有時需要在這個方法裡面執行一些初始工作,所以我們選擇讓這個初始化的時間提前.
(2)在配置時,使用load-on-startup元素來指定,給定的數字越小,啟動的實際越早.
Servlet04.java
package cw.Servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Servlet04 implements Servlet{
public void init(ServletConfig arg0) throws ServletException {
System.out.println("Servlet初始化+1");
}
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
}
public void destroy() {
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
}
4.ServletConfig的作用:
ServletConfig:可以獲取servlet在配置的一些資訊
用途:當自己開發的一些應用,使用別人的技術,它的程式碼放置在了自己的servlet類裡面;剛好這個servlet裡面需要一個數字或者叫做變數值,但是這個值不能是固定的,所以要求使用到這個servlet的開發人員,在註冊servlet的時候,必須要在web.xml裡面宣告init-params
Servlet05.java
package cw.Servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet05 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//1.得到servlet配置物件,專門用於在配置servlet的資訊
ServletConfig sc=getServletConfig();
//2.獲取servlet名稱,獲取到的是配置servlet裡面servlet-nbame的文字內容
String scName=sc.getServletName();
System.out.println(scName);
//3.可以獲取某一個引數
String add=sc.getInitParameter("add");
if(add==null){
throw new IllegalArgumentException("servlet在配置時,一定要寫add這個引數");
}else{
System.out.println("add....");
}
System.out.println(add); //haiK
//4.可以獲取所有引數的名稱
Enumeration<String> names=sc.getInitParameterNames();
//遍歷取出所有的引數名稱
while(names.hasMoreElements()){
String name=(String)names.nextElement();
String value=sc.getInitParameter("name");
System.out.println(name+"..."+value);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
}