Servlet---默認Servlet/線程安全問題(網頁串數據)

一、默認Servlet

默認Servlet,當請求的路徑在web.xml中沒有匹配上,那麼就導向該servlet,避免客戶端出現404這些找不到資源的錯誤。
注意,它可能會屏蔽掉我們放在安全目錄以外的有效的資源(因爲這些路徑沒有在web.xml中配置)
默認Servlet通過只會在項目正式發佈時配置,測試階段一般不會,因爲我們無法看到具體的出錯信息。

web.xml中要寫上這幾句

  <servlet>
    <servlet-name>DefaultServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.DefaultServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>DefaultServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
而這個DefaultServlet中的東西自然是隨你自己了,如:

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DefaultServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		
		out.println("<h1><font color='red'>404,找不頁面,杯具啦!!!!</font></h1>");
		
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}

二、網頁串數據

(通過兩個瀏覽器分別採用doGet方式發一個上傳用戶名的請求,即要在網址上輸入信息) 輸出結果,可會出現:第一個請求顯示出的name是第二個請求上傳的參數值。
下面模擬一下實現這種現象吧

代碼如下:

package cn.hncu.servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ThreadServlet extends HttpServlet {
	private String name=null;
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		name=request.getParameter("name");
		try {
			Thread.sleep(3000);//停三秒再響應
		} catch (InterruptedException e) {
			throw new RuntimeException(e);
		}
		response.getWriter().print("name="+name);
	}

}
現象如下:




那麼爲什麼會出現這種現象呢?

本例告訴我們,servlet在Tomcat中其實是單例,多個請求其實是共享servlet池中的同一個對象,因此該對象中的成員變量是共享的,容易出現串數據。尤其是servlet功能比較複雜的時候,可能會寫多個方法,然後又要共用變量,很可能會想到把它定義成成員變量,這時就是一個坑!!!-----應該通過別的辦法去解決,如通過方法參數傳遞,,數據庫

本例中的name就是一個成員變量,第一個瀏覽器發送請求後停三秒的這段時間裏,另一個瀏覽器發出了請求,於是將name值修改了,當第一個到了三秒後,就打印出已經被修改了的值。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章