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 {
}
}