一、Servlet的簡介
- Servlet的概述
servlet是運行在服務端的java程序 servlet是一套規范(接口) 外界都可以訪問到 - servlet的快速入門
步驟:
(1) 創建一個類 實現servlet
(2)覆蓋servlet接口中的全部方法(尤其是service方法)
(3)需要進行虛擬路徑的配置
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>
<servlet>
<!--servlet-name 這里的名字可以任意取,不過需要和 servlet-mapping中的servlet-name匹配
<servlet-name>Demo1</servlet-name>
<!-- 這里需要填寫正確的完整包名來指向java源文件 -->
<servlet-class>com.heima.servlet.Demo1</servlet-class>
</servlet>
<servlet-mapping>
<!-- 這里的name需要和servlet標簽中的名字匹配 每一個Servlet-mapping 標簽中只能配置一組-->
<servlet-name>Demo1</servlet-name>
<!-- 對外訪問的路徑 -->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
<welcome-file-list>
<!-- 這里代表的是歡迎頁面,可以自己去尋找 -->
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Demo1.java工程內容:
package com.heima.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Demo1 implements Servlet
{
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
// 主要業務處理的地方,每次訪問都會執行
PrintWriter writer = res.getWriter();
writer.print("<h1>Hello World</h1>");
writer.print("<h1>Hello World</h1>");
System.out.println(getServletInfo());
}
@Override
public void destroy()
{
// 服務器正常關閉的時候調用
}
@Override
public void init(ServletConfig arg0) throws ServletException
{
// 在服務器servlet對象創建的時候執行
}
@Override
public ServletConfig getServletConfig()
{
// 這個方法用於返回ServletConfig對象,內部封裝的是Servlet配置信息
return null;
}
@Override
public String getServletInfo()
{
// 用來返回Servlet的一些信息
return "";
}
}
由於servlet頁面回寫的時候使用的PrintWrite流,寫出中文由於編碼問題會出現亂碼,可以通過這個方法解決res.setContentType("text/html;charset=utf-8");
二、Servlet的生命周期
- java中的生命周期:對象什么時候創建 什么時候銷毀 這個過程中必然要實行的方法
- servlet對象的生命周期:
創建:默認第一次訪問servlet時創建 創建之后對象駐留在內存中 等待為后面的訪問服務,所以說,servlet對象只有一個。
銷毀:服務器關閉 web應用從服務器中移除
與生命周期想過的方法說明
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
// 主要業務處理的地方每次訪問都會執行
}
@Override
public void destroy()
{
// 服務器正常關閉的時候調用
}
@Override
public void init(ServletConfig arg0) throws ServletException
{
// 在服務器servlet對象創建的時候執行
}
三、Servlet的相關配置文件
- 基本配置
基本格式:
配置servlet的實體:
<servlet>
<sevlet-name>隨意書寫</servlet-name>
<servlet-class>servlet類的一個全包名</servlet-class>
</servlet>
配置servlet的對外訪問的虛擬路徑例子:
<servlet-mapping>
<sevlet-name>和那么上面的name一致</servlet-name>
<url-pattern>/虛擬路徑</url-pattern>
</servlet-mapping>
<servlet>
<!--servlet-name 這里的名字可以任意取,不過需要和 servlet-mapping中的servlet-name匹配 -->
<servlet-name>Demo1</servlet-name>
<!-- 這里需要填寫正確的完整包名來指向java源文件 -->
<servlet-class>com.heima.servlet.Demo1</servlet-class>
</servlet>
<servlet-mapping>
<!-- 這里的name需要和servlet標簽中的名字匹配 -->
<servlet-name>Demo1</servlet-name>
<!-- 對外訪問的路徑 -->
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
虛擬路徑的寫法:
完全匹配: 就是客戶端的訪問地址與配置完全一致才可以訪問到
<url-pattern>/demo1</url-pattern>
<url-pattern>/demo1/*</url-pattern>
<url-pattern>/demo1/*.jpg </url-pattern>
- 服務器一啟動就實例化servlet
格式:寫在Servlet標簽內,<load-on-startup>數字</load-on-startup>
數字代表實例化的順序 數字越小越早創建
<servlet>
<servlet-name>Demo2</servlet-name>
<servlet-class>com.heima.servlet.Servlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
- 缺省的servlet
格式:缺省的servlet就是所有的servlet都不匹配 缺省的servlet去負責執行
就是將url-pattern配置成/
<servlet-mapping>
<servlet-name>Demo2</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 歡迎頁面:相當於IIS里面的的默認打開頁面
<welcome-file-list>
<!-- 這里代表的是歡迎頁面,可以自己去尋找 -->
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
- tomcat默認的全局web.xml
四、Servlet的繼承體系
- 使用IDE工具創建Servlet類和web.xml配置的對應關系
- 我們自己創建servlet的繼承關系
關系:自定義servlet----->HttpServlet------>GenericServlet------>Servlet - service方法的演化過程
servlet接口中service方法
GenericServlet中的service方法
HttpServlet中service方法
這里service調用的是本類中的另外一個重載service方法。
在service(HttpServletRequest,HttpServletResponse)方法中可以進行提交方式的判斷。通過HttpServlet類中的常量來實現。
HttpServlet類中的常量屬性
判斷實現的方式: - init(ServletConfig config)演變過程
在servlet接口中的init方法
在GenericServlet中的init方法
這個有參方法用來接收Servlet的配置信息,進行賦值
這個無參重載方法主要用於覆寫,切不影響GenericServlet中的一些get方法
問題:有參數的init和無參數的init的關系?
首先他們是重載關系。
有參發放主要用來賦值和調用無參方法。所以在子類中覆蓋覆寫無參方法不影響最有效果。 - destroy()的演變過程
servlet接口中的destroy方法
GenericServlet中的destroy方法
五、ServletConfig對象
- 概述:是Servlet的配置對象 內部封裝的是servlet的配置信息 在web容器調用init方法時 將ServletConfig作為參數進行傳遞
- 怎樣獲取?
通過getServletConfig()
查看GenericServlet的源碼發現。
可以直接返回GenericServlet類中的config變量,該變量在此類中的有參inti方法中進行了賦值。可以直接調用的原因是應為inti的在服務器開啟的時候就自動調用了此方法,所以可以正常服務,而不會去除null值。前提是子類不覆蓋有參inti方法。 - ServletConfig的作用
- 獲取servlet的名稱
ServletConfig sc=getServletConfig();
System.out.println(sc.getServletName());
- 獲取初始化參數(多個參數的獲取方式)
設置參數方式:通過init-param來設置參數
ServletConfig sc=getServletConfig();
Enumeration <String> names = sc.getInitParameterNames();
while(names.hasMoreElements())
{
String name=names.nextElement();
System.out.println(name+" "+sc.getInitParameter(name));
}
- 可以獲取web應用的上下文對象 ServletContext
六、ServletContext對象
- 概述
HttpServletservletContext是servlet上下文對象 實質代表web應用上下文對象 對象只有一個 而且所有的servlet共享一個ServletContext
servletContext什么時候創建?
服務器啟動的時候 就會創建ServletContext對象 將這個對象放置在內存中中 供所有的setvlet訪問(有點想靜態變量)
servletContext什么時候銷毀?
關閉服務器時銷毀 web應用新哦那個服務器中移除 - 怎么獲得ServletContext對象
通過servletConfig對象獲得
ServletContext context = getServletConfig().getServletContext();
- ServletContext的作用
- 獲取初始化參數
XML文件設置:
實現代碼:
ServletContext context = getServletConfig().getServletContext();
Enumeration <String> enums =context.getInitParameterNames();
while(enums.hasMoreElements())
{
String name=enums.nextElement();
System.out.println(name+" "+context.getInitParameter(name));
}
- 可以獲取web資源的絕對路徑:context.getRealPath()
重點:getRealPath()相對的位置:相對web應用
ReadFile方法:
public void readFile(String path)
{
BufferedReader bufr;
try
{
bufr = new BufferedReader(new FileReader(path));
System.out.println(bufr.readLine());
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- 可以作為域對象:域對象:代表存儲數據的區域的對象
- context.setAttribute(鍵,值):設置對象的鍵和值
- context.getAttribute(鍵):通過鍵獲取值
ServletContext context =getServletContext();
//設置屬性鍵值
context.setAttribute("name", "zhansan");
//通過鍵獲取值
String attribute=(String) context.getAttribute("name");