hello2详解
1.GreetingServlet.java(显示问候页面表单)
此servlet重写该doGet
方法,实现GET
HTTP方法。servlet显示一个简单的HTML问候表单,其提交按钮就像hello1
指定其操作的响应页面一样。以下摘录以@WebServlet
注释开头,注释指定相对于上下文根的URL模式:
1 package javaeetutorial.hello2; 2 3 import java.io.IOException; //IOException表示发生某种I/O异常的信号。此类是由失败或中断的I/O操作产生的一般异常类。 4 import java.io.PrintWriter; //io常用类,包装流PrintWriter除了可以包装字节流OutputStream之外,还能包装字符流Writer。 5 import javax.servlet.RequestDispatcher; //定义一个对象,该对象接收来自客户端的请求,并将它们发送到服务器上的任何资源(例如servlet,HTML文件或JSP文件)。 6 import javax.servlet.ServletException; //定义servlet在遇到困难时可以抛出的一般异常。 7 import javax.servlet.annotation.WebServlet; //web服务中的,在Glassfish下lib中的包。 8 import javax.servlet.http.HttpServlet; //提供要进行子类化的抽象类,以创建适用于Web站点的HTTP Servlet。 9 import javax.servlet.http.HttpServletRequest; //扩展ServletRequest接口以提供HTTP Servlet的请求信息。 10 import javax.servlet.http.HttpServletResponse; //扩展ServletResponse接口以在发送响应时提供特定于HTTP的功能。 11 12 /** 13 * This is a simple example of an HTTP Servlet. It responds to the GET method of 14 * the HTTP protocol. 15 */ 16 @WebServlet("/greeting") //设置标注@webserverlet,容器会自动读取里面的信息。此标注告诉容器,如果请求的UEL是“/greeting”,则由GreetingServelet的实例提供服务。 17 public class GreetingServlet extends HttpServlet { //创建一个公有类GreetingServlet继承父类HttpServlet 18 19 @Override //覆盖标注,意思是下面覆盖HttpServlet中的doGet方法 20 public void doGet(HttpServletRequest request, //参数:—req- HttpServletRequest包含客户端对servlet的请求的对象 21 HttpServletResponse response) //参数:resp- HttpServletResponse包含servlet发送给客户端的响应的对象 22 throws ServletException, IOException { //抛出:java.io.IOException - 如果在servlet处理GET请求时检测到输入或输出错误;ServletException - 如果无法处理GET请求 23 24 response.setContentType("text/html"); //发送给客户端的文章类型 25 response.setBufferSize(8192); //发送给客户端的响应对象的缓冲大小是8192 26 try (PrintWriter out = response.getWriter()) { //获取PrintWriter流,用来在客户端输出 27 out.println("<html lang=\"en\">" //以下是html标记语言用来显示页面 28 + "<head><title>Servlet Hello</title></head>"); 29 30 // then write the data of the response 31 out.println("<body bgcolor=\"#ffffff\">" 32 + "<img src=\"resources/images/duke.waving.gif\" " 33 + "alt=\"Duke waving his hand\">" 34 + "<form method=\"get\">" 35 + "<h2>Hello, my name is Duke. What's yours?</h2>" 36 + "<input title=\"My name is: \" type=\"text\" " 37 + "name=\"username\" size=\"25\"/>" 38 + "<p></p>" 39 + "<input type=\"submit\" value=\"Submit\"/>" 40 + "<input type=\"reset\" value=\"Reset\"/>" 41 + "</form>"); 42 43 String username = request.getParameter("username"); //定义一个字符串username并对它赋从request中拿出名字叫userName的值 44 if (username != null && username.length() > 0) { //如果username不为空并且长度大于0 45 RequestDispatcher dispatcher = 46 getServletContext().getRequestDispatcher("/response"); //获取jsp上下文里边存储了各变量的信息(值),把一个命令发送到浏览器,让浏览器对指定的URL提出请求(此处的URL只能使用绝对路径) 47 48 if (dispatcher != null) { 49 dispatcher.include(request, response); //如果接收到的客户端的请求不为空时,记录保留request和response,以后不能再修改response里表示状态的信息 50 } 51 } 52 out.println("</body></html>"); 53 } 54 } 55 56 @Override //覆盖 57 public String getServletInfo() { //getServletInfo()方法是一个可选的方法,它提供有关servlet的信息,如作者、版本、版权 58 return "The Hello servlet says hello."; //返回说明这个servelet的信息是says hello 59 } 60 }
详细使用方法(来源于API文档):
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 抛出ServletException, java.io.IOException
- 由服务器调用(通过
service
方法)以允许servlet处理GET请求。重写此方法以支持GET请求也会自动支持HTTP HEAD请求。HEAD请求是一个GET请求,它在响应中不返回任何主体,只返回请求头字段。
覆盖此方法时,请读取请求数据,编写响应头,获取响应的编写器或输出流对象,最后编写响应数据。最好包含内容类型和编码。使用
PrintWriter
对象返回响应时,请在访问PrintWriter
对象之前设置内容类型 。servlet容器必须在提交响应之前写入标头,因为在HTTP中,标头必须在响应主体之前发送。
在可能的情况下,设置Content-Length标头(使用
ServletResponse.setContentLength(int)
方法),以允许servlet容器使用持久连接将其响应返回给客户端,从而提高性能。如果整个响应适合响应缓冲区,则自动设置内容长度。使用HTTP 1.1分块编码(这意味着响应具有Transfer-Encoding标头)时,请不要设置Content-Length标头。
GET方法应该是安全的,即没有任何副作用,用户对此负责。例如,大多数表单查询没有副作用。如果客户端请求旨在更改存储的数据,则该请求应使用其他一些HTTP方法。
GET方法也应该是幂等的,这意味着它可以安全地重复。有时使方法安全也使其成为幂等的。例如,重复查询既安全又幂等,但在线购买产品或修改数据既不安全也不是幂等。
如果请求格式不正确,则
doGet
返回HTTP“错误请求”消息。 - 参数:
-
req
-HttpServletRequest
包含客户端对servlet的请求的对象 -
resp
-HttpServletResponse
包含servlet发送给客户端的响应的对象 - 抛出:
-
java.io.IOException
- 如果在servlet处理GET请求时检测到输入或输出错误 -
ServletException
- 如果无法处理GET请求
2.ResponseServlet.java(响应页面)
此servlet也覆盖该doGet
方法,仅显示响应。以下摘录以@WebServlet
注释开头,注释指定相对于上下文根的URL模式:
1 import java.io.IOException; 2 import java.io.PrintWriter; 3 import javax.servlet.ServletException; 4 import javax.servlet.annotation.WebServlet; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 /** 10 * This is a simple example of an HTTP Servlet. It responds to the GET 11 * method of the HTTP protocol. 12 */ 13 @WebServlet("/response") 14 public class ResponseServlet extends HttpServlet { 15 16 @Override 17 public void doGet(HttpServletRequest request, 18 HttpServletResponse response) 19 throws ServletException, IOException { 20 try (PrintWriter out = response.getWriter()) { 21 String username = request.getParameter("username"); //同上 22 if (username != null && username.length() > 0) { //如果username不为空且长度大于0 23 out.println("<h2>Hello, " + username + "!</h2>"); //打印Hello username 24 } 25 } 26 } 27 28 @Override 29 public String getServletInfo() { 30 return "The Response servlet says hello."; 31 32 } 33 }