Servlet基础(一) Servlet基础和关键的API介绍
Servlet简介
Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。
Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。
Servlet可完成如下功能:
创建并返回基于客户请求的动态HTML页面。
创建可以嵌入到现有HTML页面中的部分HTML页面(HTML片段)。
与其他服务器资源(如数据库或基于Java的应用程序)进行通信。
Servlet API
Servlet的框架是由两个Java包组成:
1.javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。
2.javax.servlet.http包:定义了采用HTTP协议通信的HttpServlet类。
javax.servlet.Servlet
Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。
在Servlet接口中定义了五个方法,其中有三个方法代表了Servlet的生命周期:
init方法:负责初始化Servlet对象。
service方法:负责响应客户的请求。
destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。
HttpServlet
每一个Servlet都必须要实现Servlet接口。
GenericServlet是个通用的、不特定于任何协议的Servlet,它实现了Servlet接口。
HttpServlet继承于GenericServlet,因此我们定义的Servlet只需要继承HttpServlet即可。
Servlet接口中定义了一个service方法,HttpServlet对该方法进行了实现。
HttpServlet对service方法的实现方式:
第一步,进行一个分发。
将ServletRequest与ServletResponse转换为HttpServletRequest与HttpServletResponse,
转换完毕后,会调用HttpServlet中自己的service方法,源码如下:
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException { HttpServletRequest request;
HttpServletResponse response; try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
第二步,从上个service方法中接收标准的HTTP请求,然后将它们继续分发到相应的doXXX方法中:
源码:
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
} catch (IllegalArgumentException iae) {
// Invalid date header - proceed as if none was set
ifModifiedSince = -1;
}
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
} } else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp); } else if (method.equals(METHOD_POST)) {
doPost(req, resp); } else if (method.equals(METHOD_PUT)) {
doPut(req, resp); } else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp); } else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
// String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
第二个service方法
在HttpServlet的第二个service方法中,首先从HttpServletRequest对象中获取HTTP请求方式的信息,然后再根据请求的方法名调用相应的方法doXXX方法。
比如,如果请求方式为GET,那么调用doGet方法;如果请求方式为POST,那么调用doPost方法。
如果你的Servlet类扩展了HttpServlet类,你通常不必实现service方法。
需要注意的是在HttpServlet类中所提供的doGet、doPost等方法都是直接返回错误信息,所以我们需要在自己定义的Servlet类中override这些方法。
ServletRequest接口
ServletRequest接口中封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议,以及发出客户请求的远程主机信息等。
ServletRequest接口还为Servlet提供了直接以二进制方式读取客户请求数据流的ServletInputStream。
ServletRequest的子类可以为Servlet提供更多的和特定协议相关的数据。
例如,HttpServletRequest提供了读取HTTP Head信息的方法。
ServletResponse接口
ServletResponse接口为Servlet提供了返回响应结果的方法。
它允许Servlet设置返回数据的长度和MIME类型,并且提供输出流ServletOutputStream。
ServletResponse子类可以提供更多和特定协议相关的方法。
例如,HttpServletResponse提供设定HTTP Head信息的方法。
创建自己的HttpServlet类的步骤
1.扩展HttpServlet抽象类。
2.覆盖HttpServlet的部分方法,如覆盖doGet()或doPost()方法。
3.获取HTTP请求信息,例如通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串。
无论是表单数据还是URL上的查询字符串,在HttpServletRequest对象中都以参数名/参数值的形式存放,你可以通过getParameter()方法检索参数信息。
4.生成HTTP响应结果。
通过HttpServletResponse对象可以生成响应结果。
HttpServletResponse对象有一个getWritter()方法,该方法返回一个PrintWriter对象。
用PrintWritter的print()或println()方法可以向客户端发送字符串数据流。
比如下面这个简单的Servlet:
public class HelloWorldServlet extends HttpServlet
{
@SuppressWarnings("deprecation")
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{ resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<html><head><title>Hello World Sample</title></head>");
out.println("<body><h1>Hello World Title<h1><h2>" +new Date().toLocaleString() + "</h2></body></html>");
out.flush(); } }
ServletContext和Web应用关系
当Servlet容器启动Web应用时,为每个Web应用创建唯一的ServletContext对象。
你可以把ServletContext看成是一个Web应用的服务器端组件的共享内存。
在ServletContext中可以存放共享数据,它提供了读取或设置共享数据的方法:
setAttribute(java.lang.String name, java.lang.Object object)把一个对象和一个属性名绑定,将这个对象存储在ServletContext中。
getAttribute(java.lang.String name)根据给定的属性名返回所绑定的对象。
参考资料
圣思园张龙老师Java Web视频教程。
参考文档:
1.javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/package-summary.html
2.javax.servlet.http包:定义了采用HTTP协议通信的HttpServlet类。
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/package-summary.html
API的源码可以去Tomcat官网下载:
http://tomcat.apache.org/download-70.cgi
Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解的更多相关文章
-
ESA2GJK1DH1K基础篇: STM32+GPRS(AT指令版)实现MQTT源码讲解(支持Air202,SIM800)
前言 注: 本程序发送心跳包,发送温湿度,返回控制数据这三个发送是单独的,有可能凑到一起发. 由于本身程序就是复杂性的程序,所以这节程序没有使用中断发送,没有使用环形队列发送,为了避免多条消息可能凑到 ...
-
ESA2GJK1DH1K基础篇: STM32+Wi-Fi(AT指令版)实现MQTT源码讲解
前言 注: 本程序发送心跳包,发送温湿度,返回控制数据这三个发送是单独的,有可能凑到一起发. 由于本身程序就是复杂性的程序,所以这节程序没有使用中断发送,没有使用环形队列发送,为了避免多条消息可能凑到 ...
-
Java第三阶段学习(十一、Servlet基础、servlet中的方法、servlet的配置、ServletContext对象)
一.Servlet简介 1.什么是servlet: sun公司提供的一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过java的API动态的向 ...
-
吐槽贴:百度地图 api 封装 的实用功能 [源码下载]
ZMap 类 功能介绍 ZMap 是学习百度地图 api 接口,开发基本功能后整的一个脚本类,本类方法功能大多使用 prototype 原型 实现: 包含的功能有:轨迹回放,圈画区域可编辑,判断几个坐 ...
-
从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)
前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一 ...
-
Java Web开发框架Spring+Hibernate整合效果介绍(附源码)
最近花了一些时间整合了一个SpringMVC+springAOP+spring security+Hibernate的一套框架,之前只专注于.NET的软件架构设计,并没有接触过Java EE,好在有经 ...
-
OpenBLAS简介及在Windows7 VS2013上源码的编译过程
OpenBLAS(Open Basic Linear Algebra Subprograms)是开源的基本线性代数子程序库,是一个优化的高性能多核BLAS库,主要包括矩阵与矩阵.矩阵与向量.向量与向量 ...
-
Java API学习(一) ArrayList源码学习
ArrayList在平常用的还挺多的,用起来十分舒服,顺手.这里来学习一下它的源码. 类定义 下面是类的定义: public class ArrayList<E> extends Abst ...
-
nRF5 SDK for Mesh(一) 介绍和下载源码
一: 官网介绍地址:http://www.nordicsemi.com/Products/Bluetooth-low-energy/nRF5-SDK-for-Mesh Nordic offers a ...
随机推荐
-
Android源码——应用程序的消息处理机制
Android应用程序在启动每个线程时,都会创建一个消息队列.线程的生命周期分为创建消息队列和进入消息循环两个阶段. 消息循环分为:发送消息和处理消息. Android系统主要通过MessageQue ...
-
Nodejs在centos下的安装
新学了nodejs,发现在centos下面安装的时候,与windows有一些不同的地方,以前习惯在安装不上的时候,去百度出来,解决了以后,当时都记住如何解决的了,但是过了一段时间以后,就全都忘记光了, ...
-
purge mysql自带命令清除binlog
#!/bin/bash DATAUSER=root DATAPASS=shiyiwen DAY=$1 if [ ! $# == 1 ];then echo -e "\033[32m USAG ...
-
C# conn.open() 外部表不是预期的格式( 读取EXCEL文件出错)
环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...
-
CCNA实验(7) -- NAT
1.静态NAT2.动态NAT3.复用内部全局地址的NAT(PAT) enableconf tno ip do loenable pass ciscoline con 0logg syncexec-t ...
-
tensorflow 1.0 学习:卷积层
在tf1.0中,对卷积层重新进行了封装,比原来版本的卷积层有了很大的简化. 一.旧版本(1.0以下)的卷积函数:tf.nn.conv2d conv2d( input, filter, strides, ...
-
deug的使用经验
最基本的操作是: 1, 首先在一个java文件中设断点,然后运行,当程序走到断点处就会转到debug视图下, 2, F5键与F6键均为单步调试,F5是step into,也就是进入本行代码中执行,F6 ...
-
[Laravel] 06 - Project: from Usercase to View
故事背景 一.项目预览 From: https://www.imooc.com/video/12518 二.知识点 通过项目复习之前的重难点,在此列出并解决. /* implement */ 项目开始 ...
-
关于opencv中的颜色模型转换之CV_BGR2HSV
1.opencv函数cvCvtColor(rgb_im,hsv_im,CV_BGR2HSV)中使用的RGB颜色空间转到HSV算法: max=max(R,G,B) min=min(R,G,B) if R ...
-
js中apply(thisArg, [argsArray])的参数与ArrayLike的关系
你是否写过或见到过这样的代码 xx.apply(this,slice.call(arguments)) //slice.call转为数组是否多余 mdn地址 msdn地址 一.微软和mdn对参数的介绍 ...