一河胎、ServletConfig詳解
1.1 配置Servlet初始化參數(shù)
在Servlet的配置文件中惯退,可以使用一個(gè)或多個(gè)<init-param>
標(biāo)簽為servlet配置一些初始化參數(shù),例如:
<servlet>
<servlet-name>ServletConfigDemo1</servlet-name>
<servlet-class>rain.servlet.study.ServletConfigDemo1</servlet-
class>
<!-- 配置ServletConfigDemo1的初始化參數(shù) -->
<init-param>
<param-name>name</param-name>
<param-value>rain</param-value>
</init-param>
<init-param>
<param-name>score</param-name>
<param-value>140</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>18</param-value>
</init-param>
</servlet>
1.2 通過(guò)ServletConfig獲取初始化參數(shù)
當(dāng)Servlet配置了初始化參數(shù)以后顺囊,web容器在創(chuàng)建servlet實(shí)例對(duì)象時(shí)其兴,會(huì)自動(dòng)將這些參數(shù)封裝到ServletConfig對(duì)象中去,并且在調(diào)用Servlet的init方法時(shí)會(huì)將ServletConfig傳遞過(guò)去籽御。因此我們可以通過(guò)ServletConfig對(duì)象就可以得到配置的初始化參數(shù)信息了肢执。不過(guò)現(xiàn)在有了servlet3.0之后枉阵,有兩種寫法了。例如:
package rain.servlet.study;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ServletConfigDemo1
*/
//@WebServlet(urlPatterns="/ServletConfigDemo1",initParams= {
// @WebInitParam(name="name",value="rain"),
// @WebInitParam(name="score",value="100"),
// @WebInitParam(name="age",value="18")
//})
public class ServletConfigDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
private ServletConfig config;
/**
* 當(dāng)servlet配置了初始化參數(shù)時(shí)预茄,web容器在創(chuàng)建servlet實(shí)例對(duì)象時(shí)會(huì)自動(dòng)將這些初始化參數(shù)封裝到servletconfig
* 對(duì)象中兴溜,并在調(diào)用servlet的init方法時(shí),將改對(duì)象傳遞給servlet
*/
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
// super.init(config);
this.config = config;
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// response.getWriter().append("Served at: ").append(request.getContextPath());
response.setContentType("text/html;charset=utf-8");
String paramVal = this.config.getInitParameter("name");
response.getWriter().print(paramVal);
response.getWriter().print("<hr/>");
//獲取所有的初始化參數(shù)
Enumeration<String> e = config.getInitParameterNames();
while(e.hasMoreElements()) {
String name = e.nextElement();
String value = config.getInitParameter(name);
response.getWriter().print(name + "=" + value + "<br/>");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
上面注釋掉的部分就是Servlet 3.0之后采用注解的形式耻陕,可以看到還是挺方便的拙徽。運(yùn)行結(jié)果如下:
二、ServletContext對(duì)象
web容器在啟動(dòng)時(shí)诗宣,它會(huì)為每個(gè)web應(yīng)用創(chuàng)建一個(gè)對(duì)應(yīng)的ServletContext對(duì)象斋攀,它代表當(dāng)前web應(yīng)用。
ServletConfig對(duì)象中維護(hù)了ServletContext對(duì)象的引用梧田,可以通過(guò)ServletConfig.getServletContext
獲得。
由于一個(gè)web應(yīng)用所有的servlet都共享同一個(gè)ServletContext侧蘸,因此servlet對(duì)象之間可以實(shí)現(xiàn)通訊裁眯。ServletContext對(duì)象通常也被稱之為context域?qū)ο?/p>
三、ServletContext的應(yīng)用
3.1 多個(gè)servlet通過(guò) ServletContext 來(lái)實(shí)現(xiàn)數(shù)據(jù)共享
下面是一個(gè)例子讳癌,兩個(gè)servlet通過(guò)Servletc實(shí)現(xiàn)數(shù)據(jù)共享
package rain.servlet.study;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RainServletContextDemo1
*/
@WebServlet("/RainServletContextDemo1")
public class RainServletContextDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// response.getWriter().append("Served at: ").append(request.getContextPath());
String data = "rain_sample_data";
/**
* ServletConfig對(duì)象中維護(hù)了ServletContext的引用穿稳,可以通過(guò)
* getServletConfig().getServletContext()來(lái)獲取到。
*/
ServletContext context = this.getServletConfig().getServletContext();
context.setAttribute("data", data);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
下面是另外一個(gè)Servlet
package rain.servlet.study;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RainServletContextDemo2
*/
@WebServlet("/RainServletContextDemo2")
public class RainServletContextDemo2 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// response.getWriter().append("Served at: ").append(request.getContextPath());
ServletContext context = getServletContext();
String data = (String) context.getAttribute("data");//從ServletContext對(duì)象中取出數(shù)據(jù)
response.getWriter().print("data="+data);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
先運(yùn)行RainServletContextDemo1晌坤,然后再運(yùn)行RainServletContextDemo2逢艘,即可以實(shí)現(xiàn)數(shù)據(jù)的共享。運(yùn)行結(jié)果如下:
3.2 用ServletContext對(duì)象實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)
RainServletContextDemo3
package rain.servlet.study;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RainServletContextDemo3
*/
@WebServlet("/RainServletContextDemo3")
public class RainServletContextDemo3 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// response.getWriter().append("Served at: ").append(request.getContextPath());
String data = "i am servlet3";
response.getOutputStream().write(data.getBytes());
ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/RainServletContextDemo4");
dispatcher.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
RainServletContextDemo4
package rain.servlet.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RainServletContextDemo4
*/
@WebServlet("/RainServletContextDemo4")
public class RainServletContextDemo4 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getOutputStream().write("i am servlet4 hia!!!".getBytes());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
3.3 用ServletContext對(duì)象讀取資源文件
項(xiàng)目的目錄結(jié)構(gòu):
代碼:使用Servlet讀取資源文件
package rain.servlet.study;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RainServletContextDemo5
* 使用ServletContext讀取資源文件
*/
@WebServlet("/RainServletContextDemo5")
public class RainServletContextDemo5 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// response.getWriter().append("Served at: ").append(request.getContextPath());
response.setHeader("content-type", "text/html;charset=UTF-8");
readSrcDirFile(response);//讀取src目錄下面的文件
response.getWriter().write("<hr/>");
readWebContentFile(response);//讀取webcontent目錄下面的文件
response.getWriter().write("<hr/>");
readPackageFile(response);//讀取rain.servlet.study目錄下的文件
response.getWriter().write("<hr/>");
readDataConfigFile(response);//讀取data.config下的文件
}
/**
* 讀取data.config下的文件 data1.properties
* @param response
* @throws IOException
*/
private void readDataConfigFile(HttpServletResponse response) throws IOException {
InputStream in = getServletContext().getResourceAsStream(
"/WEB-INF/classes/data/config/data1.properties");
Properties prop = new Properties();
prop.load(in);
String name = prop.getProperty("name");
String data = prop.getProperty("data");
String time = prop.getProperty("time");
response.getWriter().println("讀取的是data.config包下面的data2.properties:");
response.getWriter().println(
MessageFormat.format("name={0},data={1},time={2}",
name,data,time));
}
/**
* readPackageFile(response);//讀取rain.servlet.study目錄下的文件 data2.properties
* @param response
* @throws IOException
*/
private void readPackageFile(HttpServletResponse response) throws IOException {
InputStream in = getServletContext().getResourceAsStream(
"/WEB-INF/classes/rain/servlet/study/data2.properties");
Properties prop = new Properties();
prop.load(in);
String name = prop.getProperty("name");
String data = prop.getProperty("data");
String time = prop.getProperty("time");
response.getWriter().println("讀取的是src目錄下面rain.servlet.study包下面的data2.properties:");
response.getWriter().println(
MessageFormat.format("name={0},data={1},time={2}",
name,data,time));
}
/**
* 讀取webcontent目錄下面的文件 data4.properties
* @param response
* @throws IOException
*/
private void readWebContentFile(HttpServletResponse response) throws IOException {
InputStream in = getServletContext().getResourceAsStream(
"/data4.properties");
Properties prop = new Properties();
prop.load(in);
String name = prop.getProperty("name");
String data = prop.getProperty("data");
String time = prop.getProperty("time");
response.getWriter().println("讀取的是webcontent目錄下面的data4.properties:");
response.getWriter().println(
MessageFormat.format("name={0},data={1},time={2}",
name,data,time));
}
/**
* 讀取src目錄下面的文件 data3.properties
* @param response
* @throws IOException
*/
private void readSrcDirFile(HttpServletResponse response) throws IOException {
InputStream in = getServletContext().getResourceAsStream(
"/WEB-INF/classes/data3.properties");
Properties prop = new Properties();
prop.load(in);
String name = prop.getProperty("name");
String data = prop.getProperty("data");
String time = prop.getProperty("time");
response.getWriter().println("讀取的是src目錄下面的data3.properties:");
response.getWriter().println(
MessageFormat.format("name={0},data={1},time={2}",
name,data,time));
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
運(yùn)行結(jié)果如下:
四污抬、在客戶端緩存Servlet的輸出
對(duì)于不是經(jīng)常變化的數(shù)據(jù)酗宋,可以在服務(wù)器端設(shè)置一個(gè)緩存時(shí)間臂拓,以避免瀏覽器頻繁的向服務(wù)器端發(fā)起請(qǐng)求,提高服務(wù)器的性能央拖。
代碼如下:
package rain.servlet.study;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RainServletDemo6
*/
@WebServlet("/RainServletDemo6")
public class RainServletDemo6 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// response.getWriter().append("Served at: ").append(request.getContextPath());
String data = "asdffffdsgsgsfgsgsgs";
response.setDateHeader("expires", System.currentTimeMillis()+24*3600*1000);
response.getWriter().println(data);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}