hello2详解
1.GreetingServlet.java(显示问候页面表单)
此servlet重写该doGet方法,实现GETHTTP方法。servlet显示一个简单的HTML问候表单,其提交按钮就像hello1指定其操作的响应页面一样。以下摘录以@WebServlet注释开头,注释指定相对于上下文根的URL模式:
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 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模式:
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."; }
}
hello2详解的更多相关文章
- Linux 之 编译器 gcc/g++参数详解
2016年12月9日16:48:53 ----------------------------- 内容目录: [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++ ...
- pscp使用详解 Windows与Linux文件互传工具
pscp使用详解 Windows与Linux文件互传工具 pscp使用方法详解:pscp是putty安装包所带的远程文件传输工具,是一款十分常见windows与linux系统之间文件互传的工具,使用方 ...
- gcc命令行详解
介绍] ----------------------------------------- 常见用法: GCC 选项 GCC 有超过100个的编译选项可用. 这些选项中的许多你可能永远都不会用到, 但 ...
- [转]GCC参数详解
[介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成 ...
- scons用户指南翻译(附gcc/g++参数详解)
scons用户指南 翻译 http://blog.csdn.net/andyelvis/article/category/948141 官网文档 http://www.scons.org/docume ...
- 使用Java操作文本文件的方法详解
使用Java操作文本文件的方法详解 摘要: 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而 ...
- Java面试题04-final关键字详解
Java面试题04-final关键字详解 本篇博客将会讨论java中final关键字的含义,以及final用在什么地方,感觉看书总会有一些模糊,而且解释的不是很清楚,在此做个总结,以备准备面试的时候查 ...
- Android Gradle 自定义Task 详解
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 一:Gradle 是什么 Gradle是一 ...
- Spring之旅第三篇-Spring配置详解
上一篇学习了IOC的概念并初步分析了实现原理,这篇主要学习Spring的配置,话不多说,让我们开始! 一.Bean元素配置 1.1 基本配置 看一个最基本的bean配置 <bean name=& ...
随机推荐
- HDP 中 yarn 和 MR2 的配置
以下说明均以集群中 slave 结点的配置为 48G内存,12块硬盘,12核(core) CPU 为例. 在 Yarn 中,一个 Container 是一个基础的包含内存和CPU 的单元.为了较好的平 ...
- 【转】c# delegate
源地址:https://www.cnblogs.com/lcawen/p/6645358.html
- Java的引用和C++的指针de区别
Java的引用和C++的指针都是指向一块内存地址的,通过引用或指针来完成对内存数据的操作,就好像风筝的线轴一样,通过线轴总是能够找到风筝,但是它们在实现,原理作用等方面却有区别. (1)类型:引用其值 ...
- 数组常用的API——splice()截取
他的几个作用:截取 删除 增加 替换. 当传递一个参数的时候 : 截取开始的位置,参数代表下标,默人会截取到结束的位置. 当传递两个参数的时候: 第一个参数是删除的下标: 第二个参数代表删除几个 ...
- Linux系统管理之硬盘管理
硬盘是计算的重要组成部件之一,硬盘为操作系统提供持久话存储的功能,在Linux硬盘设备的性能和好坏可能关系到生成线的安全和用户体验等等.熟练的掌握硬盘管理相关的信息能让我们处理起这些问题来得心应手. ...
- Eclipse的一下设置
一.设置自动补全 1.打开 Eclipse -> Window(窗口) -> Perferences(首选项) 2.点开java->Editor(编辑器)->Content A ...
- css3之animation制作闪烁文字效果 转
原文 http://www.w3cfuns.com/notes/13835/596cd96f59a09431a2343a9726c295d5.html <!DOCTYPE html>< ...
- 自旋锁Spin lock与互斥锁Mutex的区别
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API.线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用 ...
- Services版本tomcat 内存和perm 设置
当在tomcat的webapps文件夹中部署需要大量资源的war包时,启动tomcat,war包将不能被成功部署. tomcat安装有services版安装和开发版安装. 本经验将介绍如何设置两种版本 ...
- HDU - 4686 函数积的前缀和
题意:求\(\sum_{i=0}^{n-1}a_ib_i\) 其中,\(a_i=A_xa_{i-1}+A_y,b_i=B_xb_{i-1}+B_y\) 构造矩阵分别维护\(a_ib_i,a_i,b_i ...