一、默認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值修改了,當第一個到了三秒後,就打印出已經被修改了的值。