一、第一个servlet

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 MyFirstServlet extends HttpServlet {

    private static final long serialVersionUID = -19154232344556411657451L;

    @Override

    protected void doGet(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException 

    {

        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter();

        try {

            // Write some content

            out.println("<html>");

            out.println("<head>");

            out.println("<title>ServletTest</title>");

            out.println("</head>");

            out.println("<body>");

            out.println("<h2>Servlet Test  " + request.getContextPath() + "</h2>");

            out.println("</body>");

            out.println("</html>");

        } finally {

            out.close();

        }

    }

 

    @Override

    protected void doPost(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {

        //Do something

    }

 

    @Override

    public String getServletInfo() {

        return "ServletTest";

    }

}

在web容器里注册上面的Servlet,你要为你的应用建一个web.xml入口文件。


<?xml version="1.0"?>

<web-app     xmlns="http://xmlns.jcp.org/xml/ns/javaee"

            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee

http://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

    <welcome-file-list>

        <welcome-file>/ServletTest</welcome-file>

    </welcome-file-list>

    <servlet>

        <servlet-name>ServletTest</servlet-name>

        <servlet-class>com.ServletTest.servlets.ServletTest</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>ServletTest</servlet-name>

        <url-pattern>/ServletTest</url-pattern>

    </servlet-mapping>

</web-app>

MyFirstServlet类继承了HttpServlet。这个继承是必须的,因为所有的Servlet必须是要么继承了 javax.servlet.GenericServlet 的普通Servlet,要么是继承了 javax.servlet.http.HttpServlet 的HTTP Servlet。

重新 doGet() 和 doPost() 方法。这两个方法都已在 HttpServlet 类里定义了。当一个GET或POST请求到来时,它就会被映射到相应的方法里。例如,如果你向这个servlet发送一个HTTP GET请求,doGet()方法就会被调用。

这里也有一些其他有用的方法。你可以重写它们来在运行时控制应用。例如getServletInfo()。

HttpServletRequest 和 HttpServletResponse 是所有doXXX()方法的默认参数。

二、servlet生命周期

Servlet生命周期的三个核心方法分别是 init() , service() 和 destroy()。

1) 在Servlet生命周期的初始化阶段,web容器通过调用init()方法来初始化Servlet实例,并且可以传递一个实现 javax.servlet.ServletConfig 接口的对象给它。这个配置对象(configuration object)使Servlet能够读取在web应用的web.xml文件里定义的名值(name-value)初始参数。这个方法在Servlet实例的生命周期里只调用一次。

public void  init() throws ServletException {

    //custom initialization code

}

2) 初始化后,Servlet实例就可以处理客户端请求了。web容器调用Servlet的service()方法来处理每一个请求。service() 方法定义了能够处理的请求类型并且调用适当方法来处理这些请求。编写Servlet的开发者必须为这些方法提供实现。如果发出一个Servlet没实现的请求,那么父类的方法就会被调用并且通常会给请求方(requester)返回一个错误信息。

通常,我们不需要重写(override)这个方法。

protected void service(HttpServletRequest req, HttpServletResponse resp)

    throws ServletException, IOException

{

String method = req.getMethod();

 

if (method.equals(METHOD_GET)) {

    long lastModified = getLastModified(req);

    if (lastModified == -1) {

    // servlet doesn't support if-modified-since, no reason

    // to go through further expensive logic

    doGet(req, resp);

    } else {

    long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);

    if (ifModifiedSince < (lastModified / 1000 * 1000)) {

        // If the servlet mod time is later, call doGet()

                // Round down to the nearest second for a proper compare

                // A ifModifiedSince of -1 will always be less

        maybeSetLastModified(resp, lastModified);

        doGet(req, resp);

    } else {

        resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);

    }

    }

 

} else if (method.equals(METHOD_HEAD)) {

    long lastModified = getLastModified(req);

    maybeSetLastModified(resp, lastModified);

    doHead(req, resp);

 

} else if (method.equals(METHOD_POST)) {

    doPost(req, resp);

 

} else if (method.equals(METHOD_PUT)) {

    doPut(req, resp);   

 

} else if (method.equals(METHOD_DELETE)) {

    doDelete(req, resp);

 

} else if (method.equals(METHOD_OPTIONS)) {

    doOptions(req,resp);

 

} else if (method.equals(METHOD_TRACE)) {

    doTrace(req,resp);

 

} else {

    //

    // Note that this means NO servlet supports whatever

    // method was requested, anywhere on this server.

    //

 

    String errMsg = lStrings.getString("http.method_not_implemented");

    Object[] errArgs = new Object[1];

    errArgs[0] = method;

    errMsg = MessageFormat.format(errMsg, errArgs);

 

    resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);

}

}

3) 最后,web容器调用destroy()方法来终结Servlet。如果你想在Servlet的生命周期内关闭或者销毁一些文件系统或者网络资源,你可以调用这个方法来实现。destroy() 方法和init()方法一样,在Servlet的生命周期里只能调用一次。

public void destroy() {

//

}

三、使用@WebServlet注解来开发Servlet

如果你不喜欢使用xml配置而喜欢注解的话,没关系,Servlets API同样提供了一些注解接口给你。你可以像下面的例子一样使用 @WebServlet 注解并且不需要在web.xml里为Servlet注册任何信息。容器会自动注册你的Servlet到运行环境,并且像往常一样处理它。

import java.io.IOException;

import java.io.PrintWriter; 

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

@WebServlet(name = "ServletTest", urlPatterns = {"/ServletTest"})

public class ServletTest extends HttpServlet {

    private static final long serialVersionUID = -191523414832411657451L; 

    @Override

    protected void doGet(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException

    {

        //Do some work

    }

    @Override

    protected void doPost(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {

        //Do something

    }

}