Servlet學(xué)習(xí)的大綱
- servlet概念及相關(guān)接口簡(jiǎn)介
- servet 執(zhí)行過(guò)程
- servlet映射路徑
<url-pattern>
- 缺省servlet -- 應(yīng)用
- servlet生命周期(重點(diǎn)) -- 理解(重點(diǎn))
- Servlet自動(dòng)加載
- Servlet線程安全
- servletConfig對(duì)象
- Servlet相關(guān)接口詳解
- ServletContext對(duì)象 -- 知識(shí)點(diǎn)
Servlet學(xué)習(xí)內(nèi)容
- HttpServletRequest請(qǐng)求對(duì)象 : 獲取請(qǐng)求信息
- HttpServletResponse響應(yīng)對(duì)象 : 設(shè)置響應(yīng)對(duì)象
- ServletConfig對(duì)象 : servlet配置對(duì)象
- ServletContext對(duì)象 : servlet的上下文對(duì)象
servlet概念及相關(guān)接口簡(jiǎn)介
- 如何開(kāi)發(fā)一個(gè)Servlet
- 基本步驟:
- 編寫java類,繼承HttpServlet類
- 重新doGet和doPost方法
- Servlet程序交給tomcat服務(wù)器運(yùn)行殊霞!
3.1 servlet程序的class碼拷貝到WEB-INF/classes目錄
3.2 在web.xml文件中進(jìn)行配置
- Servlet配置信息 (配置一個(gè)Servlet)
// 訪問(wèn)一個(gè)Servlet: http://localhost:8080/myServlet/first
<!-- Servlet的配置-->
<!-- Servlet的配置-->
<Servlet>
<!-- Servlet的內(nèi)部名稱, 自定義, 盡量起的要有意義-->
<servlet-name>First</servlet-name>
<!-- Servlet的類全名: 包名+簡(jiǎn)單類名-->
<servlet-class>myServlet.first</servlet-class>
</Servlet>
<!-- Servlet的映射配置 -->
<servlet-mapping>
<!-- Servlet的內(nèi)部名稱, 一定要和上面的內(nèi)部名稱保持一致-->
<servlet-name>First</servlet-name>
<!-- Servlet的映射路徑 (訪問(wèn)Servlet的名稱)-->
<url-pattern>/first<url-pattern>
</servlet-mapping>
- 具體詳解: 訪問(wèn)一個(gè) http://localhost:8080/myServlet/first (前提: tomcat服務(wù)器啟動(dòng)時(shí), 首先加載webapps中的每個(gè)web應(yīng)用的web.xml配置文件)
- http: 協(xié)議名稱
- localhost : 到本地的host文件查找是否存在改域名對(duì)應(yīng)的IP地址
- 8080 : 找到tomcat服務(wù)器
- /myServlet : 在tomcat的webapps目錄下面找myServlet的目錄
- /first : 資源名稱
1)在day10的web.xml中查找是否有匹配的url-pattern的內(nèi)容(/first)
2)如果找到匹配的url-pattern,則使用當(dāng)前servlet-name的名稱到web.xml文件中查詢是否相同名稱的servlet配置
3)如果找到飞苇,則取出對(duì)應(yīng)的servlet配置信息中的servlet-class內(nèi)容: myServlet.first(字符串) - 通過(guò)反射:
a: 構(gòu)造first的對(duì)象
b: 然后調(diào)用first里面的方法
Servlet的映射路徑<url-pattern>
- 精確匹配:
- url-pattern:
/first
- 瀏覽器輸入: http://localhost:8080/myServlet/first
- url-pattern:
- 模糊匹配:
- url-pattern --> 瀏覽器地址
-
/*
--> http://localhost:8080/myServlet/任意路徑 -
/myFirst/*
--> http://localhost:8080/myServlet/myFirst/任意路徑 -
*.后綴名
--> http://localhost:8080/myServlet/任意路徑.后綴名 *.html(偽靜態(tài))
-
- url-pattern --> 瀏覽器地址
- 注意:
1)url-pattern要么以/
開(kāi)頭眶俩,要么以*
開(kāi)頭础淤。 例如饺蔑, myServlet是非法路徑继榆。
2)不能同時(shí)使用兩種模糊匹配亮元,例如 /myServlet/*.do是非法路徑
3)當(dāng)有輸入的URL有多個(gè)servlet同時(shí)被匹配的情況下:- 3.1 精確匹配優(yōu)先。(長(zhǎng)的最像優(yōu)先被匹配)
- 3.2 以后綴名結(jié)尾的模糊url-pattern優(yōu)先級(jí)最低循头!
Servlet缺省路徑
Servlet的缺省路徑(<url-pattern>/</url-pattern>)是在tomcat服務(wù)器內(nèi)置的一個(gè)路徑绵估。該路徑對(duì)應(yīng)的是一個(gè)DefaultServlet (缺省Servlet) 這個(gè)缺省的Servlet的作用是用于解析web應(yīng)用的靜態(tài)資源文件
- 問(wèn)題: URL輸入http://localhost:8080/myServlet/index.html 如何讀取文件炎疆?
1)到當(dāng)前myServlet應(yīng)用下的web.xml文件查找是否有匹配的url-pattern。
2)如果沒(méi)有匹配的url-pattern国裳,則交給tomcat的內(nèi)置的DefaultServlet處理
3)DefaultServlet程序到myServlet應(yīng)用的根目錄下查找是存在一個(gè)名稱為index.html的靜態(tài)文件
4)如果找到該文件形入,則讀取該文件內(nèi)容,返回給瀏覽器
5)如果找不到該文件缝左,則返回404錯(cuò)誤頁(yè)面 - 結(jié)論: 先找動(dòng)態(tài)資源唯笙,再找靜態(tài)資源
Servlet 執(zhí)行過(guò)程(Servlet的生命周期)
引入: Servlet的生命周期: servlet類對(duì)象什么時(shí)候創(chuàng)建,什么時(shí)候調(diào)用什么方法盒使,什么時(shí)候銷毀崩掘。Servlet程序的生命周期由tomcat服務(wù)器控制的!
-
Servlet重要的四個(gè)生命周期方法
- 構(gòu)造方法 : 創(chuàng)建servlet對(duì)象的時(shí)候調(diào)用少办。默認(rèn)情況下苞慢,第一次訪問(wèn)servlet的時(shí)候創(chuàng)建servlet對(duì)象只調(diào)用1次。證明servlet對(duì)象在tomcat是單實(shí)例的
- init方法 : 創(chuàng)建完servlet對(duì)象的時(shí)候調(diào)用英妓。只調(diào)用1次
- 有參的init方法和無(wú)參的init方法 - 有參的init方法: 該方法是servlet的生命周期方法挽放,一定會(huì)被tomcat服務(wù)器調(diào)用 (如果要編寫初始代碼,不需要覆蓋有參數(shù)的init方法; 如果覆蓋了有參數(shù)的init方法, 那么只會(huì)調(diào)用有參的init()方法 ) - 無(wú)參的init方法: 該方法是servlet的編寫初始化代碼的方法蔓纠。是Sun公司設(shè)計(jì)出來(lái)專門給開(kāi)發(fā)者進(jìn)行覆蓋辑畦,然后在里面編寫servlet的初始邏輯代碼的方法。
- service方法 : 每次發(fā)出請(qǐng)求時(shí)調(diào)用腿倚。調(diào)用n次
- destroy方法 : 銷毀servlet對(duì)象的時(shí)候調(diào)用纯出。停止服務(wù)器或者重新部署web應(yīng)用時(shí)銷毀servlet對(duì)象。只調(diào)用1次
-
偽代碼演示servlet的生命周期 - Tomtcat內(nèi)部代碼運(yùn)行:
1)通過(guò)映射找到到servlet-class的內(nèi)容敷燎,字符串 : my.servlet.FirstServlet
2)通過(guò)反射構(gòu)造FirstServlet對(duì)象 :- 得到字節(jié)碼對(duì)象 :
Class clazz = class.forName("my.servlet.FirstServlet");
- 調(diào)用無(wú)參數(shù)的構(gòu)造方法來(lái)構(gòu)造對(duì)象 :
Object obj = clazz.newInstance();
--> *** 1.servlet的構(gòu)造方法被調(diào)用***
3)創(chuàng)建ServletConfig對(duì)象暂筝,通過(guò)反射調(diào)用init方法 :
- 得到方法對(duì)象:
Method m = clazz.getDeclareMethod("init",ServletConfig.class);
- 調(diào)用方法:
m.invoke(obj,config);
--> ***2.servlet的init方法被調(diào)用 ***
4)創(chuàng)建request, response對(duì)象, 通過(guò)反射調(diào)用service方法 :
- 得到方法對(duì)象 :
Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
2 調(diào)用方法 :m.invoke(obj,request,response);
--> 3.servlet的service方法被調(diào)用
5)當(dāng)tomcat服務(wù)器停止或web應(yīng)用重新部署,通過(guò)反射調(diào)用destroy方法
- 得到方法對(duì)象 :
Method m = clazz.getDeclareMethod("destroy",null);
- 調(diào)用方法 :
m.invoke(obj,null);
-->4.servlet的destroy方法被調(diào)用
- 得到字節(jié)碼對(duì)象 :
Servlet的自動(dòng)加載 (提高用戶體驗(yàn))
- 需求 : 默認(rèn)情況下硬贯,第一次訪問(wèn)servlet的時(shí)候創(chuàng)建servlet對(duì)象焕襟。如果servlet的構(gòu)造方法或init方法中執(zhí)行了比較多的邏輯代碼,那么導(dǎo)致用戶第一次訪問(wèn)sevrlet的時(shí)候比較慢饭豹。
- 解決方案 : 改變servlet創(chuàng)建對(duì)象的時(shí)機(jī), 提前到加載web應(yīng)用的時(shí)候; 在servlet的配置信息中鸵赖,加上一個(gè)<load-on-startup>即可!
<servlet>
<servlet-name>LifeDemo</servlet-name>
<servlet-class>MyLife.LifeDemo</servlet-class>
<!-- 讓servlet對(duì)象自動(dòng)加載 -->
<load-on-startup>1</load-on-startup>
<!-- 注意: 整數(shù)值越大拄衰,創(chuàng)建優(yōu)先級(jí)越低叨咖!(創(chuàng)建多個(gè)servlet的時(shí)候, 數(shù)值會(huì)起作用) -->
</servlet>
Servlet的多線程并發(fā)問(wèn)題(Servlet對(duì)象在tomcat服務(wù)器是單實(shí)例多線程的)
- 引入 : 因?yàn)閟ervlet是多線程的, 所以當(dāng)多個(gè)servlet的線程同時(shí)訪問(wèn)了servlet的共享數(shù)據(jù), 如成員變量, 可能會(huì)引發(fā)線程安全問(wèn)題
- 解決辦法:
- 把使用到共享數(shù)據(jù)的代碼塊進(jìn)行同步 (使用synchronized關(guān)鍵字進(jìn)行同步)
- 建議在Servlet類中盡量不要使用成員變量; 如果確實(shí)要使用成員, 必須同步; 而且盡量縮小同步代碼塊的范圍 (哪里使用到了成員變量, 就同步哪里), 以避免因?yàn)橥蕉鴮?dǎo)致并發(fā)效率降低
/** Servlet的多線程并發(fā)問(wèn)題 */
public class TheradDemo extends HttpServlet {
int count = 1;
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
synchronized (TheradDemo.class) {//鎖對(duì)象必須唯一童漩。建議使用類對(duì)象
response.getWriter().write("你現(xiàn)在是當(dāng)前網(wǎng)站的第"+count+"個(gè)訪客"); //線程1執(zhí)行完, 線程2執(zhí)行
//線程1還沒(méi)有執(zhí)行count++
/*try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
count++;
}
}
}
ServletConfig對(duì)象
- ServletConfig對(duì)象的作用 : 主要是用于加載servlet的初始化參數(shù)赡若。在一個(gè)web應(yīng)用可以存在多個(gè)ServletConfig對(duì)象 (一個(gè)Servlet對(duì)應(yīng)一個(gè)ServletConfig對(duì)象)
- 對(duì)象創(chuàng)建和得到 :
- 創(chuàng)建時(shí)機(jī) : 在創(chuàng)建完servlet對(duì)象之后扣溺,在調(diào)用init方法之前創(chuàng)建
- 得到對(duì)象 : 直接從有參數(shù)的init方法中得到
- Servlet的初始化參數(shù)配置 : servlet的參數(shù)只能由當(dāng)前的這個(gè)servlet獲取镐确!
- ServletConfig的API:
- java.lang.String ->
getInitParameter(java.lang.String name)
: 根據(jù)參數(shù)名獲取參數(shù)值 - java.util.Enumeration ->
getInitParameterNames()
: 獲取所有參數(shù) - ServletContext ->
getServletContext()
: 得到servlet上下文對(duì)象 - java.lang.String ->
getServletName()
: 得到servlet的名稱
- java.lang.String ->
// 配置ServletConfig對(duì)象 : web.xml文件中
<servlet>
<servlet-name>ConfigDemo</servlet-name>
<servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class>
<!-- 初始參數(shù): 這些參數(shù)會(huì)在加載web應(yīng)用的時(shí)候包吝,封裝到ServletConfig對(duì)象中 -->
<init-param>
<param-name>path</param-name>
<param-value>e:/b.txt</param-value>
</init-param>
<init-param>
<param-name>BBB</param-name>
<param-value>BBB's value</param-value>
</init-param>
<init-param>
<param-name>CCCC</param-name>
<param-value>CCCC's value</param-value>
</init-param>
</servlet>
// 獲取ServletConfig對(duì)象
public class ConfigDemo extends HttpServlet {
/**
* 以下兩段代碼GenericServlet已經(jīng)寫了,我們無(wú)需編寫源葫!
*/
/*private ServletConfig config;*/
/**
* 1)tomcat服務(wù)器把這些參數(shù)會(huì)在加載web應(yīng)用的時(shí)候诗越,封裝到ServletConfig對(duì)象中
* 2)tomcat服務(wù)器調(diào)用init方法傳入ServletConfig對(duì)象
*/
/*@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
}*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 讀取servlet的初始參數(shù) : this.getServletConfig() -> 獲取ServletConfig
*/
String path = this.getServletConfig().getInitParameter("path");
File file = new File(path);
//讀取內(nèi)容
BufferedReader br = new BufferedReader(new FileReader(file));
String str = null;
while( (str=br.readLine())!=null ){
System.out.println(str);
}
//查詢當(dāng)前servlet的所有初始化參數(shù)
Enumeration<String> enums = this.getServletConfig().getInitParameterNames();
while(enums.hasMoreElements()){
String paramName = enums.nextElement();
String paramValue = this.getServletConfig().getInitParameter(paramName);
System.out.println(paramName+"="+paramValue);
}
//得到servlet的名稱
String servletName = this.getServletConfig().getServletName();
System.out.println(servletName);
}
}
ServletContext對(duì)象引入
- 引入 : ServletContext對(duì)象, 叫做Servlet的上下文對(duì)象; 表示一個(gè)當(dāng)前的web應(yīng)用環(huán)境; 一個(gè)web應(yīng)用中只有一個(gè)ServletContext對(duì)象
- 對(duì)象創(chuàng)建和得到
- 創(chuàng)建時(shí)機(jī) : 加載web應(yīng)用時(shí)創(chuàng)建ServletContext對(duì)象
- 得到對(duì)象 : 從ServletConfig對(duì)象的getServletContext方法得到
- 設(shè)計(jì)ServletConfig對(duì)象:
- 我們?cè)O(shè)計(jì):創(chuàng)建ServletConfig對(duì)象
public void init( ServletConfig config,ServletContext context ){ 多了一個(gè)參數(shù)
得到ServletConfig對(duì)象
得到ServletContext對(duì)象息堂;
}
- Sun公司設(shè)計(jì) :
- 創(chuàng)建ServletContext對(duì)象 :
ServletContext context = new ServletContext();
- 創(chuàng)建ServletConfig對(duì)象 :
ServetConfig config = new ServletConfig();
config.setServletContxt(context);
- 得到 ServletContext 對(duì)象:
SerlvetContext context = config.getServletContext();
- 創(chuàng)建ServletContext對(duì)象 :
class ServletConfig{
ServletContext context;
public ServletContext getServletContxt(){
return contxt;
}
}
public void init( ServletConfig config ){
// 得到ServletConfig對(duì)象
// 從ServletConfig對(duì)象中得到ServletContext對(duì)象
SerlvetContext context = config.getServletContext();
}
ServletContext對(duì)象的使用
- ServletContext對(duì)象的核心API(作用)
- 得到當(dāng)前web應(yīng)用的路徑 :
getContextPath()
->java.lang.String
- 得到web應(yīng)用的初始化參數(shù)
-
getInitParameter(java.lang.String name)
->java.lang.String
-
getInitParameterNames()
->java.util.Enumeration
-
- 域?qū)ο笥嘘P(guān)的方法
-
void setAttribute
->java.lang.String name, java.lang.Object object
-
getAttribute(java.lang.String name)
->java.lang.Object
-
void removeAttribute
->java.lang.String name
-
- 轉(zhuǎn)發(fā)(類似于重定向) : RequestDispatcher
-
getRequestDispatcher
->java.lang.String path
-
- 得到web應(yīng)用的資源文件
-
getRealPath(java.lang.String path)
->java.lang.String
-
getResourceAsStream(java.lang.String path)
->java.io.InputStream
-
- 得到web應(yīng)用路徑 :
- java.lang.String :
getContextPath()
-- > 用在請(qǐng)求重定向的資源名稱中
public class ContextDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.得到ServletContext對(duì)象
//ServletContext context = this.getServletConfig().getServletContext();
ServletContext context = this.getServletContext(); //(推薦使用)
//2.得到web應(yīng)用路徑 /day10
/**
* web應(yīng)用路徑:部署到tomcat服務(wù)器上運(yùn)行的web應(yīng)用名稱
*/
String contextPath = context.getContextPath();
System.out.println(contextPath);
/**
* 案例:應(yīng)用到請(qǐng)求重定向
*/
response.sendRedirect(contextPath+"/index.html");
}
}
- 得到web應(yīng)用的初始化參數(shù) (全局)
<!-- 配置web應(yīng)用參數(shù) -->
<context-param>
<param-name>AAA</param-name>
<param-value>AAA's value</param-value>
</context-param>
<context-param>
<param-name>BBB</param-name>
<param-value>BBB's value</param-value>
</context-param>
<context-param>
<param-name>CCC</param-name>
<param-value>CCC's value</param-value>
</context-param>
- 得到web應(yīng)用的初始化參數(shù) :
-
getInitParameter(java.lang.String name)
->java.lang.String
-
getInitParameterNames()
->java.util.Enumeration
-
public class ContextDemo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到SErvletContext對(duì)象
ServletContext context = this.getServletContext();
System.out.println("參數(shù)"+context.getInitParameter("AAA"));
Enumeration<String> enums = context.getInitParameterNames();
while(enums.hasMoreElements()){
String paramName = enums.nextElement();
String paramValue =context.getInitParameter(paramName);
System.out.println(paramName+"="+paramValue);
}
//嘗試得到ConfigDemo中的servlet參數(shù)
String path = this.getServletConfig().getInitParameter("path");
System.out.println("path="+path);
}
}
web應(yīng)用參數(shù)可以讓當(dāng)前web應(yīng)用的所有servlet獲热履!
- 域?qū)ο笥嘘P(guān)的方法
- 域?qū)ο?: 作用是用于保存數(shù)據(jù), 獲取數(shù)據(jù); 可以在不同的動(dòng)態(tài)資源之間共享數(shù)據(jù)
- 案例 : 將Servlet1的name=eric / Student 對(duì)象, 傳遞給 Servlet2
- 方案1: 可以通過(guò)傳遞參數(shù)的形式荣堰,共享數(shù)據(jù)床未。局限:只能傳遞字符串類型
- 方案2: 可以使用域?qū)ο蠊蚕頂?shù)據(jù),好處:可以共享任何類型的數(shù)據(jù)振坚!
- ServletContext就是一個(gè)域?qū)ο? 作用范圍在整個(gè)web應(yīng)用中有效薇搁!
- 保存數(shù)據(jù):void setAttribute(java.lang.String name, java.lang.Object object)
- 獲取數(shù)據(jù): java.lang.Object : getAttribute(java.lang.String name)
- 刪除數(shù)據(jù): void removeAttribute(java.lang.String name)
- 所有域?qū)ο螅?
- HttpServletRequet 域?qū)ο?/li>
- ServletContext域?qū)ο?/li>
- HttpSession 域?qū)ο?/li>
- PageContext域?qū)ο?/li>
public class ContextDemo3 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 保存數(shù)據(jù)
//1.得到域?qū)ο? ServletContext context = this.getServletContext();
//2.把數(shù)據(jù)保存到域?qū)ο笾? //context.setAttribute("name", "eric");
context.setAttribute("student", new Student("jacky",20));
System.out.println("保存成功");
}
}
class Student{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}
}
public class ContextDemo4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 獲取數(shù)據(jù)
//1.得到域?qū)ο? ServletContext context = this.getServletContext();
//2.從域?qū)ο笾腥〕鰯?shù)據(jù)
//String name = (String)context.getAttribute("name");
Student student = (Student)context.getAttribute("student");
//System.out.println("name="+name);
System.out.println(student);
}
}
- 轉(zhuǎn)發(fā) / 重定向 :
API : RequestDispatcher : getRequestDispatcher(java.lang.String path)
轉(zhuǎn)發(fā)
a. 地址欄不會(huì)改變
b. 轉(zhuǎn)發(fā)只能轉(zhuǎn)發(fā)到當(dāng)前web應(yīng)用內(nèi)的資源
c. 可以在轉(zhuǎn)發(fā)過(guò)程中,可以把數(shù)據(jù)保存到request域?qū)ο笾?br> RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/GetDataServlet");
rd.forward(request, response);重定向
a. 地址欄會(huì)改變渡八,變成重定向到地址啃洋。
b. 重定向可以跳轉(zhuǎn)到當(dāng)前web應(yīng)用,或其他web應(yīng)用屎鳍,甚至是外部域名網(wǎng)站宏娄。
c. 不能再重定向的過(guò)程,把數(shù)據(jù)保存到request中
response.sendRedirect("/day10/GetDataServlet");結(jié)論: 如果要使用request域?qū)ο筮M(jìn)行數(shù)據(jù)共享逮壁,只能用轉(zhuǎn)發(fā)技術(shù)孵坚!
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 轉(zhuǎn)發(fā)(效果:跳轉(zhuǎn)頁(yè)面)
* @author APPle
*
*/
public class ForwardDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 保存數(shù)據(jù)到request域?qū)ο? */
request.setAttribute("name", "rose");
//轉(zhuǎn)發(fā)
/**
* 注意:不能轉(zhuǎn)發(fā)當(dāng)前web應(yīng)用以外的資源。
*/
/*RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/GetDataServlet");
rd.forward(request, response);*/
this.getServletContext().getRequestDispatcher("/GetDateServlet").forward(request, response);
}
}
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 GetDataServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 從request域?qū)ο笾蝎@取數(shù)據(jù)
*/
String name = (String)request.getAttribute("name");
System.out.println("name="+name);
}
}
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 RedirectDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 保存數(shù)據(jù)到request域?qū)ο? */
request.setAttribute("name", "rose");
//重定向
/**
* 注意:可以跳轉(zhuǎn)到web應(yīng)用內(nèi)窥淆,或其他web應(yīng)用十饥,甚至其他外部域名。
*/
//response.sendRedirect("/day09/adv.html");
response.sendRedirect("/day10/GetDataServlet");
}
}
讀取web應(yīng)用下的資源文件
- 示例: 讀取web應(yīng)用下的properties文件
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResourceDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* . 代表java命令運(yùn)行目錄祖乳。java運(yùn)行命令在哪里逗堵?? 在tomcat/bin目錄下
* 結(jié)論: 在web項(xiàng)目中眷昆, . 代表在tomcat/bin目錄下開(kāi)始蜒秤,所以不能使用這種相對(duì)路徑。
*/
//讀取文件亚斋。在web項(xiàng)目下不要這樣讀取作媚。因?yàn)?表示在tomcat/bin目錄下
/*File file = new File("./src/db.properties");
FileInputStream in = new FileInputStream(file);*/
/**
* 使用web應(yīng)用下加載資源文件的方法
*/
/**
* 1. getRealPath讀取,返回資源文件的絕對(duì)路徑
*/
/*
String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
System.out.println(path);
File file = new File(path);
FileInputStream in = new FileInputStream(file);
*/
/**
* 2. getResourceAsStream() 得到資源文件,返回的是輸入流
*/
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
//讀取資源文件
prop.load(in);
String user = prop.getProperty("user");
String password = prop.getProperty("password");
System.out.println("user="+user);
System.out.println("password="+password);
}
}
練習(xí):
- 改造通訊錄程序, servlet+xml版本
- 要求 : 使用瀏覽器操作系統(tǒng)
- 提示 :
- 添加聯(lián)系人 : 設(shè)計(jì)一個(gè)添加聯(lián)系人html頁(yè)面
- 保存邏輯 : AddServlet (接收頁(yè)面數(shù)據(jù) (getParameter() )帅刊,使用dom4j保存到xml)
- 修改聯(lián)系人 : QueryServlet (xml查詢修改的聯(lián)系人, 把聯(lián)系人顯示到一個(gè)html頁(yè)面(response.getWriter.write("<html></html>")) );
- 修改保存邏輯 : UpdateServlet ( 接收頁(yè)面數(shù)據(jù)纸泡,把數(shù)據(jù)保存xml )
- 刪除聯(lián)系人 : 輸入刪除id的html頁(yè)面
刪除邏輯 : DeleteServle( 接收id, 在xml文件中刪除對(duì)應(yīng)的聯(lián)系人)