参考资料:http://www.open-open.com/lib/view/open1331598718140.html、
动态web资源开发技术有两种:servlet 和 jsp.
1.什么是servlet?
Servlet是一种服务器端的Java应用程序,Server + Applet =Servlet 意为服务器端的小程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机.
2.servlet有什么作用?
当用户通过 URL 发出一个请求时,这些 Java servlet 类就将之转换成一个 HttpServletRequest,并发送给 URL 所指向的目标。当服务器端完成其工作时,Java 运行时环境(Java Runtime Environment)就将结果包装在一个 HttpServletResponse 中,然后将原 HTTP 响应送回给发出该请求的客户机。在与 Web 应用程序进行交互时,通常会发出多个请求并获得多个响应。所有这些都是在一个会话语境中,Java 语言将之包装在一个 HttpSession 对象中。在处理响应时,您可以访问该对象,并在创建响应时向其添加事件。
3.servlet容器
负责处理客户请求、把请求传送给Servlet并把结果返回给客户。不同程序的容器实际实现可能有所变化,但容器与Servlet之间的接口是由 Servlet API定义好的,这个接口定义了Servlet容器在Servlet上要调用的方法及传递给Servlet的对象类。
Tomcat 的容器模型中,Context 容器是直接管理 Servlet 在容器中的包装类 Wrapper,所以 Context 容器如何运行将直接影响 Servlet 的工作方式。
4.要实现servlet可以继承GenericServlet 或者 HttpServlet
GenericServlet :
定义了一个通用的,无关协议的的 Servlet 。如果要在 Web 应用中使用 Http 进行 Servlet 通信,请扩展 HttpServlet (即继承 HttpServlet )。
public abstract class GenericServlet
implements Servlet, ServletConfig, Serializable
{
private transient ServletConfig config;
public void init()throws ServletException
{
}
public void init(ServletConfig config)throws ServletException
{
this.config = config;
init();
}
public ServletConfig getServletConfig()
{
return this.config;
}
public ServletContext getServletContext()
{
return getServletConfig().getServletContext();
}
public String getServletInfo()
{
return "";
}
public void destroy() {
}
public abstract void service(ServletRequest paramServletRequest, ServletResponse p aramServletResponse)
throws ServletException, IOException;
public String getServletName()
{
return this.config.getServletName();
}
public String getServletName()
{
return this.config.getServletName();
}
}
GenericServlet 是个抽象类,不能直接进行实例化,必须给出子类才能实例化。
即: GenericServlet gs = new GenericServlet(); 编译会报错。
GenericServlet gs = new MyServlet(); 这样是正确的(其中 MyServlet 是其子类)
其 service() 方法是个抽象方法,即它把处理请求的任务交给了子类。子类必须实现该方法。
继承genericServlet
public class genericServlet extends GenericServlet{
//继承GenericServlet必须实现他的抽象service()
@Override
public void service(ServletRequest arg0, ServletResponse resp)
throws ServletException, IOException {
public void service(ServletRequest arg0, ServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
OutputStream out=resp.getOutputStream();
out.write("hello servlet".getBytes());
}
}
}
HttpServlet 也是个抽象类,不能直接进行实例化,必须给出子类才能实例化(即不能直接使用,只能继承它)
httpServlet 是采用 Http 协议进行通信的,所以它也实现 Http 协议中的多种方法,
public abstract class HttpServlet extends GenericServlet implements
Serializable {
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {}
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
string method = req.getMethod();
if (method.equals("GET")) {
long lastModified = getLastModified(req);
if (lastModified == -1L) {
doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if (ifModifiedSince < lastModified / 1000L * 1000L) {
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals("POST")) {
doPost(req, resp);
} else if (method.equals("PUT")) {
doPut(req, resp);
} else if (method.equals("DELETE")) {
doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
doOptions(req, resp);
} else if (method.equals("TRACE")) {
doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);{
}
}
}
HttpServlet 的 service() 方法比较特殊,带 public 关键字的 service() 方法明显是继承自父类,它只接收 HTTP 请求,这里把相应的request 和 response 转换为了基于 HTTP 协议的相应对象 , 最终将请求转到带 protected 关键字的 service() 方法中。
protected service() 方法根据请求的类型将请求转发到相应的 doDelete() 、 doGet()、 doOptions() 、 doPost() 、 doPut() 等方法中。 所以开发自己的 Servlet 时,不需要覆盖 HttpServlet 的 service() 方法,因为该方法最终将请求转发给相应的 doXXX 方法中,只需要覆盖相应的 doXXX 方法进行请求处理即可。如果重写了该方法,那么就不会根据方法名调用其他具体的方法了。
同上道理, doOptions 和 doTrace 方法也不需要覆盖。
查看 doGet 、 doPost 、 doPut 、 doDelete四个方法代码,发现这些方法只是判断协议类型,然后抛出相应的异常,其他什么都没做,所以实现自己的 Servlet 时,需要重写这些方法,以符合自己的需要进行请求处理。
public class servletDemo extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
//super.doGet(req, resp);
PrintWriter out=resp.getWriter();
out.print("hello servlet");
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
//super.doPost(req, resp);
doGet(req,resp);
}
}
5.servlet doGet和doPost的区别
在使用表单提交数据到服务器的时候有两张方式可共选择,一个是post一个是get。可在中的method属性中指定提交的方式。如: