一:Servlet的一些細(xì)節(jié):
1、由于客戶端是通過 URL 地址訪問 web 服務(wù)器中的資源,所以 Servlet 程序若想被外界訪問,必須把 servlet 程序映射到一個 URL 地址上,這個工作在 web.xml 文件中使用 <servlet> 元素和 <servlet-mapping> 元素完成。
<servlet> 元素用于注冊 Servlet ,它包含有兩個主要的子元素: <servlet-name> 和 <servlet-class> ,分別用于設(shè)置 Servlet 的注冊名稱和 Servlet 的完整類名。
一個 <servlet-mapping> 元素用于映射一個已注冊的 Servlet 的一個對外訪問路徑,它包含有兩個子元素: <servlet-name> 和 <url-pattern> ,分別用于指定 Servlet 的注冊名稱和 Servlet 的對外訪問路徑。
例如:
2、同一個 Servlet 可以被映射到多個 URL 上,即多個 <servlet-mapping> 元素的 <servlet-name> 子元素的設(shè)置值可以是同一個 Servlet 的注冊名。
在 Servlet 映射到的 URL 中也可以使用 * 通配符,但是只能有兩種固定的格式:一種格式是“ *. 擴(kuò)展名”,另一種格式是以正斜杠( / )開頭并以“ /* ”結(jié)尾。
例如:
3 、 Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
其中 URL 請求與哪個最相像,就歸為哪一類,強(qiáng)調(diào): /* 比 *.do 優(yōu)先級高
4 、針對客戶端的多次 Servlet 請求,通常情況下,服務(wù)器只會創(chuàng)建一個 Servlet 實(shí)例對象,也就是說 Servlet 實(shí)例對象一旦創(chuàng)建,它就會駐留在內(nèi)存中,為后續(xù)的其它請求服務(wù),直至 web 容器退出, servlet 實(shí)例對象才會銷毀。
在 Servlet 的整個生命周期內(nèi), Servlet 的 init 方法只被調(diào)用一次。而對一個 Servlet 的每次訪問請求都導(dǎo)致 Servlet 引擎調(diào)用一次 servlet 的 service 方法。對于每次訪問請求, Servlet 引擎都會創(chuàng)建一個新的 HttpServletRequest 請求對象和一個新的 HttpServletResponse 響應(yīng)對象,然后將這兩個對象作為參數(shù)傳遞給它調(diào)用的 Servlet 的 service() 方法, service 方法再根據(jù)請求方式分別調(diào)用 doXXX 方法。
例子代碼:
5 、在 <servlet> 元素中配置了一個 <load-on-startup> 元素,那么 WEB 應(yīng)用程序在啟動時,就會裝載并創(chuàng)建 Servlet 的實(shí)例對象、以及調(diào)用 Servlet 實(shí)例對象的 init() 方法。
例子:
5、缺省 Servlet
6、線程安全:
例子代碼:
二、ServletConfig對象
在 Servlet 的配置文件中,可以使用一個或多個 <init-param> 標(biāo)簽為 servlet 配置一些初始化參數(shù)
當(dāng) servlet 配置了初始化參數(shù)后, web 容器在創(chuàng)建 servlet 實(shí)例對象時,會自動將這些初始化參數(shù)封裝到 ServletConfig 對象中,并在調(diào)用 servlet 的 init 方法時,將 ServletConfig 對象傳遞給 servlet 。進(jìn)而,程序員通過 ServletConfig 對象就可以得到當(dāng)前 servlet 的初始化參數(shù)信息
例子:
packagecn.csdn.web.servlet;
importjava.io.IOException;
importjava.io.PrintWriter;
importjava.util.Enumeration;
importjavax.servlet.ServletConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassDemoServletextendsHttpServlet{
intx=1;
@Override
publicvoiddestroy(){
//TODOAuto-generatedmethodstub
super.destroy();
System.out.println("銷毀");
}
publicDemoServlet(){
super();
System.out.println("創(chuàng)建對象");
}
@Override
publicvoidinit()throwsServletException{
//TODOAuto-generatedmethodstub
super.init();
System.out.println("---------初始化------------");
}
@Override
publicvoidinit(ServletConfigconfig)throwsServletException{
super.init(config);
System.out.println("================"+config);
}
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
this.doPost(request,response);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
/*設(shè)置編碼*/
request.setCharacterEncoding("UTF-8");
Stringversion=this.getServletConfig().getInitParameter("version");
StringcharacterEncoding=this.getServletConfig().getInitParameter("characterEncoding");
request.setCharacterEncoding(characterEncoding);
/*獲取一下PrintWriter對象*/
PrintWriterout=response.getWriter();
out.print("=-"+version);
Enumeration<String>enumer=this.getServletConfig().getInitParameterNames();
/*遍歷*/
while(enumer.hasMoreElements()){
Stringname=enumer.nextElement();
Stringvalue=this.getServletConfig().getInitParameter(name);
System.out.println(name+"===="+value);
}
}
}
三、ServletContext應(yīng)用
----》在MyEclipse中的開發(fā)
---->首先建立
--->Demo01Servlet.java中寫入:
packagecn.csdn.web.servlet;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletContext;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassDemo01ServletextendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
this.doPost(request,response);
}
@Override
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
request.setCharacterEncoding("UTF-8");
/* 怎么樣獲取 ServletContext 對象 */
ServletContextcontext=this.getServletConfig().getServletContext();
context=this.getServletContext();
context.setAttribute("date","ddd");
response.sendRedirect("./data.html");
}
}
--->Demo02Servlet.java中寫入:
packagecn.csdn.web.servlet;
importjava.io.IOException;
importjavax.servlet.ServletContext;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassDemo02ServletextendsHttpServlet{
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
this.doPost(req,resp);
}
@Override
protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)
throwsServletException,IOException{
/* 怎么獲取共享數(shù)據(jù) */
ServletContextcontext=this.getServletContext();
Stringdata=(String)context.getAttribute("data");
resp.getWriter().write(data);
}
}
--->在web.xml中寫入:
<servlet>
<servlet-name>Demo01Servlet</servlet-name>
<servlet-class>cn.csdn.web.servlet.Demo01Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo01Servlet</servlet-name>
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Demo02Servlet</servlet-name>
<servlet-class>cn.csdn.web.servlet.Demo02Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo02Servlet</servlet-name>
<url-pattern>/demo02</url-pattern>
</servlet-mapping>
----->建立一個data.html:添加
<body>
<div>
<ahref="./demo02">查看共享數(shù)據(jù)</a>
</div>
</body>
---->ok
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
