1.雖然可以用:String name=getServletConfig().getServletName()得到Servlet名稱,但可以從GenericServlet直接繼承getServletName方法更方便. Service就不用象doPost激活了
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out=response.getWriter(); out.print( this.getServletName( ) );
Enumeration e=this.getInitParameterNames();//得到多個參數玫舉數組
while(e.hasMoreElements()){ String key=(String)e.nextElement();
String value=getInitParameter(key); out.print(key+"="+value); }
ServletContext context=this.getServletContext();//也可從GenericServlet中直接得到
String path=context.getRealPath("/"); out.print(path); 得到:C:\tomcat\webapps\test\
2. 用ServletContext得到初始化參數:(從GenericServlet中直接得到)
public class Context extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out=response.getWriter();
Enumeration e=getServletContext().getInitParameterNames();
while(e.hasMoreElements()){ String key=(String)e.nextElement();
String value=getServletContext().getInitParameter(key);out.print(key+"="+value);}}}
ServletContext在web.xml中的配置: <servlet> <servlet-name>Context</servlet-name>
<servlet-class>test.Context</servlet-class> </servlet>
不同于<init-param>在Servlet內部配 <context-param><param-name>company</param-name>
<param-value>witbridge</param-value></context-param>
3.使用輸入流訪問資源文件:public class FileAccess extends HttpServlet {
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {PrintWriter out=response.getWriter();
FileInputStream fis=new FileInputStream("it315.properties");
//文件必和tomcat啟動程序同級別目錄: user=root,否則全路徑:c:\\test\\it315.properties
Properties props=new Properties(); props.load(fis);
//Properties保存在流中或從流中加載, load從輸入流中讀取屬性列表,getPXX返回String
out.print(props.getProperty("user")); fis.close();}} //用指定鍵在屬性列表中搜索屬性
4.使用ServletContext接口訪問資源文件:public class Resource extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out=response.getWriter();
URL urlIt315=this.getServletContext().getResource("/it315.properties");
InputStream ips=this.getServletContext().getResourceAsStream("/it315.properties");
out.print(urlIt315.toString());Properties props=new Properties();props.load(ips);
out.print(props.getProperty("dataBase")); } }//好處:路徑與調試環境無關,只要/
setHeader(java.lang.String name, java.lang.String value)
5.HttpServletResponse的應用:響應消息頭:如setContentType(“text/html;charset=””);
a.SetHeader(自動刷新,URL覆蓋)public class Refresh extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response.setHeader("Refresh", "2");
response.setHeader("Refresh", 1;URL=http://localhost:8080/ "); } }
b.禁止瀏覽器緩存顯示動態圖片:public class Cache extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html ");
response.setDateHeader("Expires", 0); response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache"); //防止不同瀏覽器支持不同響應頭
PrintWriter out=response.getWriter(); out.print(Math.random()); }}
response.setBufferSize(0);int len=response.getBufferSize( );out.print(len);//8192
6.RequestDispatcher(共享數據和URL不變)和response.SendRidirect:
a.Include:被包含的Servlet程序不能改變響應消息的狀態碼和響應頭,如果他里面存在這樣的語句執行結果將被忽略:public class Included extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
response.setContentType("text/html;charset=GB2312");//被包含執行時將被忽略
PrintWriter out=response.getWriter(); out.print("中國"+"<br>");
out.print("URL"+request.getRequestURI()+"<br>");///test/servlet/Include根目錄下
out.print("QueryString:"+request.getQueryString()+"<br>");//為null,得到?后面語句
out.print("Param p1:"+request.getParameter("p1")+"<br>");}} //可以得到參數的
測試:public class Include extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
response.setContentType("text/html;charset=GB2312");
PrintWriter out=response.getWriter(); String china="中國";
RequestDispatcher rd=this.getServletContext().getRequestDispatcher
("/servlet/Included?p1="+china); rd.include(request, response);} }//從Config中繼承
b.forward:在調用者和被調用者程序中設置響應狀態碼和狀態頭都不會被忽略,URL仍為調用方
response.setContentType("text/html;charset=GB2312");//也需要設置,轉向全部元素全路徑
RequestDispatcher rd=this.getServletContext().getRequestDispatcher("/index.jsp");
rd.forward(request, response);
c:sendRedirect方法用于生成302響應碼和Location響應頭,從而通知客戶端去重新訪問
Location響應頭中指定的URL,調用和被調用者之間就不能共同享用request和response對象.
response.sendRedirect(request.getContextPath()+”/page.jsp”);
7. 為防止用戶在等待過程中多次提交數據:
<script> Var isCommitted=false;//通過返回值進行判斷
Function checkPost(){ if(!isCommitted){isCommitted=true;return true;}
Else { alert(“不能重復提交表單”);return false;} } </script>