hello2详解

1.GreetingServlet.java(显示问候页面表单)html

此servlet重写该doGet方法,实现GETHTTP方法。servlet显示一个简单的HTML问候表单,其提交按钮就像hello1指定其操做的响应页面同样。如下摘录以@WebServlet注释开头,注释指定相对于上下文根的URL模式:java

 

package javaeetutorial.hello2;

import java.io.IOException;      //IOException表示发生某种I/O异常的信号。此类是由失败或中断的I/O操做产生的通常异常类。
import java.io.PrintWriter;      //io经常使用类,包装流PrintWriter除了能够包装字节流OutputStream以外,还能包装字符流Writer。
import javax.servlet.RequestDispatcher;    //定义一个对象,该对象接收来自客户端的请求,并将它们发送到服务器上的任何资源(例如servlet,HTML文件或JSP文件)。
import javax.servlet.ServletException;    //定义servlet在遇到困难时能够抛出的通常异常。
import javax.servlet.annotation.WebServlet;    //web服务中的,在Glassfish下lib中的包。
import javax.servlet.http.HttpServlet;     //提供要进行子类化的抽象类,以建立适用于Web站点的HTTP Servlet。
import javax.servlet.http.HttpServletRequest;    //扩展接口以提供HTTP Servlet的请求信息。
import javax.servlet.http.HttpServletResponse;    //扩展接口以在发送响应时提供特定于HTTP的功能。

/**
 * This is a simple example of an HTTP Servlet. It responds to the GET method of
 * the HTTP protocol.
 */
@WebServlet("/greeting")    //设置标注@webserverlet,容器会自动读取里面的信息。此标注告诉容器,若是请求的UEL是“/greeting”,则由GreetingServelet的实例提供服务。
public class GreetingServlet extends HttpServlet {    //建立一个公有类GreetingServlet继承父类HttpServlet

    @Override          //覆盖标注,意思是下面覆盖HttpServlet中的doGet方法
    public void doGet(HttpServletRequest request,    //参数:—包含客户端对servlet的请求的对象
            HttpServletResponse response)     //参数:包含servlet发送给客户端的响应的对象
            throws ServletException, IOException {    //抛出: - 若是在servlet处理GET请求时检测到输入或输出错误; - 若是没法处理GET请求

        response.setContentType("text/html");    //发送给客户端的文章类型
        response.setBufferSize(8192);    //发送给客户端的响应对象的缓冲大小是8192
        try (PrintWriter out = response.getWriter()) {    //获取PrintWriter流,用来在客户端输出
            out.println("<html lang=\"en\">"      //如下是html标记语言用来显示页面
                    + "<head><title>Servlet Hello</title></head>");
            
            // then write the data of the response
            out.println("<body  bgcolor=\"#ffffff\">"
                    + "<img src=\"resources/images/duke.waving.gif\" "
                    + "alt=\"Duke waving his hand\">"
                    + "<form method=\"get\">"
                    + "<h2>Hello, my name is Duke. What's yours?</h2>"
                    + "<input title=\"My name is: \" type=\"text\" "
                    + "name=\"username\" size=\"25\"/>"
                    + "<p></p>"
                    + "<input type=\"submit\" value=\"Submit\"/>"
                    + "<input type=\"reset\" value=\"Reset\"/>"
                    + "</form>");
            
            String username = request.getParameter("username");    //定义一个字符串username并对它赋从request中拿出名字叫userName的值
            if (username != null && username.length() > 0) {    //若是username不为空而且长度大于0
                RequestDispatcher dispatcher =
                        getServletContext().getRequestDispatcher("/response");    //获取jsp上下文里边存储了各变量的信息(值),把一个命令发送到浏览器,让浏览器对指定的URL提出请求(此处的URL只能使用绝对路径)
                
                if (dispatcher != null) {
                    dispatcher.include(request, response);      //若是接收到的客户端的请求不为空时,记录保留request和response,之后不能再修改response里表示状态的信息
                }
            }
            out.println("</body></html>");
        }
    }

    @Override    //覆盖
    public String getServletInfo() {    //getServletInfo()方法是一个可选的方法,它提供有关servlet的信息,如做者、版本、版权
        return "The Hello servlet says hello.";    //返回说明这个servelet的信息是says hello
    }
}
ServletRequestServletResponsereqHttpServletRequestrespHttpServletResponsejava.io.IOExceptionServletException

 

详细使用方法(来源于API文档):
protected void
doGetHttpServletRequest  req, HttpServletResponse  resp) 抛出ServletException java.io.IOException
由服务器调用(经过 service 方法)以容许servlet处理GET请求。

重写此方法以支持GET请求也会自动支持HTTP HEAD请求。HEAD请求是一个GET请求,它在响应中不返回任何主体,只返回请求头字段。web

覆盖此方法时,请读取请求数据,编写响应头,获取响应的编写器或输出流对象,最后编写响应数据。最好包含内容类型和编码。使用PrintWriter对象返回响应时,请在访问PrintWriter对象以前设置内容类型 apache

servlet容器必须在提交响应以前写入标头,由于在HTTP中,标头必须在响应主体以前发送。api

在可能的状况下,设置Content-Length标头(使用 ServletResponse.setContentLength(int)方法),以容许servlet容器使用持久链接将其响应返回给客户端,从而提升性能。若是整个响应适合响应缓冲区,则自动设置内容长度。浏览器

使用HTTP 1.1分块编码(这意味着响应具备Transfer-Encoding标头)时,请不要设置Content-Length标头。tomcat

GET方法应该是安全的,即没有任何反作用,用户对此负责。例如,大多数表单查询没有反作用。若是客户端请求旨在更改存储的数据,则该请求应使用其余一些HTTP方法。安全

GET方法也应该是幂等的,这意味着它能够安全地重复。有时使方法安全也使其成为幂等的。例如,重复查询既安全又幂等,但在线购买产品或修改数据既不安全也不是幂等。服务器

若是请求格式不正确,则doGet 返回HTTP“错误请求”消息。jsp

 

参数:
req HttpServletRequest 包含客户端对servlet的请求的对象
resp HttpServletResponse 包含servlet发送给客户端的响应的对象
抛出:
java.io.IOException  - 若是在servlet处理GET请求时检测到输入或输出错误
ServletException  - 若是没法处理GET请求

 

2.ResponseServlet.java(响应页面)

此servlet也覆盖该doGet方法,仅显示响应。如下摘录以@WebServlet 注释开头,注释指定相对于上下文根的URL模式:

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;

/**
 * This is a simple example of an HTTP Servlet.  It responds to the GET
 * method of the HTTP protocol.
 */
@WebServlet("/response")
public class ResponseServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        try (PrintWriter out = response.getWriter()) {
            String username = request.getParameter("username");    //同上
            if (username != null && username.length() > 0) {    //若是username不为空且长度大于0
                out.println("<h2>Hello, " + username + "!</h2>");    //打印Hello username
            }
        }
    }

    @Override
    public String getServletInfo() {
        return "The Response servlet says hello.";

    }
}
相关文章
相关标签/搜索