一、默认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值修改了,当第一个到了三秒后,就打印出已经被修改了的值。