Analysis of Hello2 source code

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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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;     //扩展ServletRequest接口以提供HTTP Servlet的请求信息。
import  javax.servlet.http.HttpServletResponse;     //扩展ServletResponse接口以在发送响应时提供特定于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,     //参数:—req- HttpServletRequest包含客户端对servlet的请求的对象
             HttpServletResponse response)      //参数:resp- HttpServletResponse包含servlet发送给客户端的响应的对象
             throws  ServletException, IOException {     //抛出:java.io.IOException - 如果在servlet处理GET请求时检测到输入或输出错误;ServletException - 如果无法处理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
     }
}

 

详细使用方法(来源于API文档):
protected void doGetHttpServletRequest  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“错误请求”消息。

 

参数:
reqHttpServletRequest包含客户端对servlet的请求的对象
respHttpServletResponse包含servlet发送给客户端的响应的对象
抛出:
java.io.IOException - 如果在servlet处理GET请求时检测到输入或输出错误
ServletException - 如果无法处理GET请求

 

2.ResponseServlet.java(响应页面)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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." ;
 
     }
}

转载于:https://www.cnblogs.com/ren9ie/p/10962528.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值