Servlet学习笔记

原文链接: howtodoinjava 翻译: ImportNew.com 进林
译文链接: http://www.importnew.com/14621.html

  Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求。尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求。 Servlet必须部署在Java servlet容器才能使用。虽然很多开发者都使用Java Server Pages(JSP)和Java Server Faces(JSF)等Servlet框架,但是这些技术都要在幕后通过Servlet容器把页面编译为Java Servlet。

1.编写一个Servlet

public class MyFirstServlet extends HttpServlet{
    private static final long serialVersionUID = -8508901467259279609L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>My First Servlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h2>Servlet MyFirstServlet at " + request.getContextPath() + "</h2>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
    }

    @Override
    public String getServletInfo() {
        return "My First Servlet";
    }

}

  上面的Servlet做了一些重要的事情,你可能想了解的。

  • 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的内容就是你需要知道的内容。

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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  
  <welcome-file-list>
     <welcome-file>/MyFirstServlet</welcome-file>
  </welcome-file-list>
  
  <servlet>
     <servlet-name>MyFirstServlet</servlet-name>
     <servlet-class>com.servletstudy.MyFirstServlet</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>MyFirstServlet</servlet-name>
     <url-pattern>/MyFirstServlet</url-pattern>
  </servlet-mapping>
</web-app>

2.Servlet生命周期

  在你的应用加载并使用一个Servlet时,从初始化到销毁这个Servlet期间会发生一系列的事件。这些事件叫做Servlet的生命周期事件(或方法)。Servlet生命周期的三个核心方法分别是 init() , service() 和 destroy()。每个Servlet都会实现这些方法,并且在特定的运行时间调用它们。

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

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

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

  在大多数情况下,你通常不需要在你的Servlet里重写这些方法。

3.编写动态的Servlet响应内容

  Java Servlets如此有用的原因之一是Servlet能动态显示网页内容。这些内容可以从服务器本身、另外一个网站、或者许多其他网络可以访问的资源里获取。Servlet不是静态网页,它们是动态的。可以说这是它们最大的优势。

@WebServlet(name = "CalendarServlet", urlPatterns = {"/CalendarServlet"})    //使用 @WebServlet注解不需要在web.xml里为Servlet注册任何信息。容器会自动注册你的Servlet到运行环境,并且像往常一样处理它。
public class CalendarServlet extends HttpServlet {
 
    private static final long serialVersionUID = -1915463532411657451L;
 
    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException
    {
 
        Map<String,String> data = getData();
 
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            // Write some content
            out.println("<html>");
            out.println("<head>");
            out.println("<title>CalendarServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h2>Hello " + data.get("username") + ", " + data.get("message") + "</h2>");
            out.println("<h2>The time right now is : " + new Date() + "</h2>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
 
    //This method will access some external system as database to get user name, and his personalized message
    private Map<String, String> getData()
    {
        Map<String, String> data = new HashMap<String, String>();
        data.put("username", "Guest");
        data.put("message",  "Welcome to my world !!");
        return data;
    }
}

 4.处理Servlet请求和响应

  为了获取请求参数,需要调用 HttpServletRequest 对象的 getParameter() 方法,并且传递你要获取的输入参数的id给该方法。request和response处理的基本使用可以是这样的:

@Override
protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException
{
 
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
 
    String username = request.getParameter("username");
    String password = request.getParameter("password");
 
    boolean success = validateUser(username, password);
 
    try {
        // Write some content
        out.println("<html>");
        out.println("<head>");
        out.println("<title>LoginServlet</title>");
        out.println("</head>");
        out.println("<body>");
 
        if(success) {
            out.println("<h2>Welcome Friend</h2>");
        }else{
            out.println("<h2>Validate your self again.</h2>");
        }
 
        out.println("</body>");
        out.println("</html>");
    } finally {
        out.close();
    }
}
posted @ 2016-12-06 23:55  语陌1988  阅读(145)  评论(0编辑  收藏  举报