目录
3.2 javax.servlet.GenericServlet抽象类(协议无关版本)
3.3 javax.servlet.http.HttpServlet抽象类(HTTP版本)
3.4 javax.servlet.ServletRequest类(协议无关版本)
3.5 javax.servlet.http.HttpServletRequest接口(HTTP版本)
3.6 javax.servlet.ServletResponse接口(协议无关版本)
3.7 javax.servlet.http.HttpServletResponse接口(HTTP版本)
3.8 javax.servlet.ServletContext接口
3.9 javax.servlet.http.HttpSession接口
4.1 加载和实例化----------->Servlet容器创建Servlet的实例
4.2 初始化----------->该容器调用init()方法,对于每个Servlet实例,Servlet容器只调用一次其方init()方法
4.3 服务----------->如果请求Servlet,则容器调用servlet()方法
4.4 销毁----------->销毁实例之前调用destroy()方法
1.什么是Servlet
Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet是一个符合特定规范的Java程序,是一个基于Java技术的Web组件,主要用于生成动态的内容。
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
2.Servlet的工作原理
- 客户端向服务器端发送请求
- Web服务器将请求发送给Servlet容器
- Servlet容器产生一个Servlet实例
- Servlet构建一个响应并将其传给Web服务器
- Web服务器将响应结果返回客户端
2.1什么是Servlet容器
Servlet容器也被称为Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,管理和运行Servlet/JSP。
3. Servlet API 简介
3.1 javax.servlet.Servlet接口
servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由servlet引擎识别和管理的方法集。
Servlet接口的基本目标是提供生命期方法init()、service()和destroy()方法。
Servlet接口的常用方法
方法名称 | 功能描述 |
void init(ServletConfig config) | 由Servlet容器所调用,用于在处理客户请求前完成Servlet对象的初始化工作 |
void service(ServletRequest request, ServletResponse response) | 由Servlet容器所调用,用于处理客户端请求 |
void destory() | 由Servlet容器所调用,用于释放Servlet对象所使用的资源 |
ServletConfig getServletConfig() | 返回传递到servlet的init()方法的ServletConfig对象 ,该对象包含此Servlet的初始化和启动参数 |
String getServletInfo() | 返回描述servlet的一个字符串 |
3.2 javax.servlet.GenericServlet抽象类(协议无关版本)
GenericServlet是一种与协议无关的servlet,是一种跟本不对请求提供服务的servlet,而是简单地从init()方法启动后台线程并在destory()中杀死。它可以用于模拟操作系统的端口监控进程。
servlet API提供了Servlet接口的直接实现,称为GenericServlet。此类提供除了service()方法外所有接口中方法的缺省实现。这意味着通过简单地扩展GenericServlte可以编写一个基本的servlet。
除了Servlet接口外,GenericServlet也实现了ServletConfig接口,处理初始化参数和servlet上下文,提供对授权传递到init()方法中的ServletConfig对象的方法。
GenericServlet抽象类的常用方法
方法名称 | 功能描述 |
public void init(ServletConfig config) | 是对Servlet接口中init(ServletConfig config)方法的实现,将ServletConfigConfig实例保存以备用 |
public void init() | 用于在子类重写,以实现用户制定的初始化工作 |
public String getInitParameter(String name) | 通过调用ServletConfig接口的getInitParameter(String name)方法获取设置的初始化数值,是为简化从ServletConfig对象中获取初始化参数而定义的方法 |
public ServletContext getServletContext() | 通过调用ServletConfig接口的getServletContext()方法返回getServletContext对象,是为简化从ServletConfig对象中获取getServletContext对象而定义的方法 |
3.3 javax.servlet.http.HttpServlet抽象类(HTTP版本)
虽然servlet API允许扩展到其它协议,但最终所有的servlet均在Web环境下实施操作,只有几种servlet直接扩展了GenericServlet。对servlet更一般的是扩展其HTTP子类HttpServlet。
HttpServlet 类通过调用指定到HTTP请求方法的方法实现service(),亦即对DELETE、HEAD、GET、OPTIONS、POST、PUT和 TRACE,分别调用doDelete()、doHead()、doGet()、doOptions()、doPost()、doPut()和 doTrace()方法,将请求和响应对象置入其HTTP指定子类。
HttpServlet抽象类的常用方法
方法名称 | 功能描述 |
public void service(Request request,Response response) | 对GenericServlet类中service()方法的实现,将请求分发给protected类型service()方法 |
public void service(HttpServletRequest request,HttpServletResponse response) | 针对HTTP的service()方法,接收标准的HTTP请求,并将它们分发给HttpServlet类中定义的一系列doXxx()方法 |
protected void doXxx(HttpServletRequest req,HttpServletResponse resp) | 针对HTTP的不同请求方法而定义的一系列处理方法,如doGet(),doPost()等 |
3.4 javax.servlet.ServletRequest类(协议无关版本)
ServletRequest接口封装了客户端请求的细节。它与协议无关,并有一个指定HTTP的子接口。
ServletRequest主要处理:
1.找到客户端的主机名和IP地址
2.检索请求参数
3.取得和设置属性
4.取得输入和输出流
ServletRequest类中的方法
方法名称 | 功能描述 |
Object getAttribute(String name) | 返回具有指定名字的请求属性,如果不存在则返回null。属性可由servlet引擎设置或使用setAttribute()显式加入。 |
Enumeration getAttributeName() | 返回请求中所有属性名的枚举。如果不存在属性,则返回一个空的枚举。 |
String getCharacteEncoding() | 返回请求所用的字符编码。 |
Int getContentLength() | 指定输入流的长度,如果未知则返回-1。 |
ServletInputStream getInputStream()throws IOException | 返回与请求相关的(二进制)输入流。可以调用getInputStream()或getReader()方法之一。 |
String getParameter(String name) | 返回指定输入参数,如果不存在,返回null。 |
Enumeration getParameterName() | 返回请求中所有参数名的一个可能为空的枚举。 |
String[] getParameterValues(String name) | 返回指定输入参数名的取值数组,如果取值不存在则返回null。它在参数具有多个取值的情况下十分有用。 |
String get Protocol() | 返回请求使用协议的名称和版本。 |
String getScheme() | 返回请求URI的子串,但不包含第一个冒号前的内容。 |
String getServerName() | 返回处理请求的服务器的主机名。 |
String getServerPort() | 返回接收主机正在侦听的端口号。 |
BufferedReader getReader()throws IOException | 返回与请求相关输入数据的一个字符解读器。此方法与getInputStream()只可分别调用,不能同时使用。 |
String getRemoteAddr() | 返回客户端主机的数字型IP地址。 |
String getRemoteHost() | 如果知道,返回客户端主机名。 |
void setAttribute(String name,Object obj) | 以指定名称保存请求中指定对象的引用。 |
void removeAttribute(String name) | 从请求中删除指定属性 |
Locale getLocale() | 如果已知,返回客户端的第一现场或者为null。 |
Enumeration getLocales() | 如果已知,返回客户端的第一现场的一个枚举,否则返回服务器第一现场。 |
boolean isSecure() | 如果请求使用了如HTTPS安全隧道,返回true |
RequestDispatcher getRequestDispatcher(String name) | 返回指定源名称的RequsetDispatcher对象。 |
3.5 javax.servlet.http.HttpServletRequest接口(HTTP版本)
HttpServletRequest类主要处理:
1.读取和写入HTTP头标
2.取得和设置cookies
3.取得路径信息
4.标识HTTP会话
HttpServletRequest接口中的方法
方法名称 | 功能描述 |
String getAuthType() | 如果servlet由一个鉴定方案所保护,如HTTP基本鉴定,则返回方案名称。 |
String getContextPath() | 返回指定servlet上下文(web应用)的URL的前缀。 |
Cookie[] getCookies() | 返回与请求相关cookie的一个数组。 |
Long getDateHeader(String name) | 将输出转换成适合构建Date对象的long类型取值的getHeader()的简化版。 |
String getHeader(String name) | 返回指定的HTTP头标指。如果其由请求给出,则名字应为大小写不敏感。 |
Enumeration getHeaderNames() | 返回请求给出的所有HTTP头标名称的权举值。 |
Enumeration getHeaders(String name) | 返回请求给出的指定类型的所有HTTP头标的名称的枚举值,它对具有多取值的头标非常有用。 |
int getIntHeader(String name) | 将输出转换为int取值的getHeader()的简化版。 |
String getMethod() | 返回HTTP请求方法(例如GET、POST等等) |
String getPathInfo() | 返回在URL中指定的任意附加路径信息。 |
String getPathTranslated() | 返回在URL中指定的任意附加路径信息,被子转换成一个实际路径。 |
String getQueryString() | 返回查询字符串,即URL中?后面的部份。 |
String getRemoteUser() | 如果用户通过鉴定,返回远程用户名,否则为null。 |
String getRequestedSessionId() | 返回客户端的会话ID |
String getRequestURI() | 返回URL中一部分,从“/”开始,包括上下文,但不包括任意查询字符串。 |
String getServletPath() | 返回请求URI上下文后的子串 |
HttpSession getSession() | 调用getSession(true)的简化版。 |
HttpSession getSession(boolean create) | 返回当前HTTP会话,如果不存在,则创建一个新的会话,create参数为true。 |
Principal getPrincipal() | 如果用户通过鉴定,返回代表当前用户的java.security.Principal对象,否则为null。 |
boolean isRequestedSessionIdFromCookie() | 如果请求的会话ID由一个Cookie对象提供,则返回true,否则为false。 |
boolean isRequestedSessionIdFromURL() | 如果请求的会话ID在请求URL中解码,返回true,否则为false |
boolean isRequestedSessionIdValid() | 如果客户端返回的会话ID仍然有效,则返回true。 |
Boolean isUserInRole(String role) | 如果当前已通过鉴定用户与指定角色相关,则返回true,如果不是或用户未通过鉴定,则返回false。 |
3.6 javax.servlet.ServletResponse接口(协议无关版本)
ServletResponse对象将一个servlet生成的结果传到发出请求的客户端。ServletResponse操作主要是作为输出流及其内容类型和长度的包容器,它由servlet引擎创建.
ServletResponse接口中的方法
方法名称 | 功能描述 |
void flushBuffer()throws IOException | 发送缓存到客户端的输出内容。因为HTTP需要头标在内容前被发送,调用此方法发送状态行和响应头标,以确认请求。 |
int getBufferSize() | 返回响应使用的缓存大小。如果缓存无效则返加0。 |
String getCharacterEncoding() | 返回响应使用字符解码的名字。除非显式设置,否则为ISO-8859-1 |
Locale getLocale() | 返回响应使用的现场。除非用setLocale()修改,否则缺省为服务器现场。 |
OutputStream getOutputStream()throws IOException | 返回用于将返回的二进制输出写入客户端的流,此方法和getWrite()方法二者只能调用其一。 |
Writer getWriter()throws IOException | 返回用于将返回的文本输出写入客户端的一个字符写入器,此方法和getOutputStream()二者只能调用其一。 |
boolean isCommitted() | 如果状态和响应头标已经被发回客户端,则返回true,在响应被确认后发送响应头标毫无作用。 |
void reset() | 清除输出缓存及任何响应头标。如果响应已得到确认,则引发事件IllegalStateException。 |
void setBufferSize(int nBytes) | 设置响应的最小缓存大小。实际缓存大小可以更大,可以通过调用getBufferSize()得到。如果输出已被写入,则产生IllegalStateException。 |
void setContentLength(int length) | 设置内容体的长度。 |
void setContentType(String type) | 设置内容类型。在HTTP servlet中即设置Content-Type头标。 |
void setLocale(Locale locale) | 设置响应使用的现场。在HTTP servlet中,将对Content-Type头标取值产生影响。 |
3.7 javax.servlet.http.HttpServletResponse接口(HTTP版本)
HttpServletResponse加入表示状态码、状态信息和响应头标的方法,它还负责对URL中写入一Web页面的HTTP会话ID进行解码。
HttpServletResponse接口中的方法
方法名称 | 功能描述 |
void addCookie(Cookie cookie) | 将一个Set-Cookie头标加入到响应。 |
void addDateHeader(String name,long date) | 使用指定日期值加入带有指定名字(或代换所有此名字头标)的响应头标的方法。 |
void setHeader(String name,String value) | 设置具有指定名字和取值的一个响应头标。 |
void addIntHeader(String name,int value) | 使用指定整型值加入带有指定名字的响应头标(或代换此名字的所有头标)。 |
boolean containsHeader(String name) | 如果响应已包含此名字的头标,则返回true。 |
String encodeRedirectURL(String url) | 如果客户端不知道接受cookid,则向URL加入会话ID。第一种形式只对在sendRedirect()中使用的URL进行调用。其他被编码的 URLs应被传递到encodeURL() |
String encodeURL(String url) void sendError(int status) | 设置响应状态码为指定值(可选的状态信息)。HttpServleetResponse定义了一个完整的整数常量集合表示有效状态值。 |
void sendError(int status,String msg) void setStatus(int status) | 设置响应状态码为指定指。只应用于不产生错误的响应,而错误响应使用sendError()。 |
3.8 javax.servlet.ServletContext接口
一个servlet上下文是servlet引擎提供用来服务于Web应用的接口。Servlet上下文具有名字(它属于Web应用的名字)唯一映射到文件系统的一个目录。
一个servlet可以通过ServletConfig对象的getServletContext()方法得到servlet上下文的引用,如果servlet直接或间接调用子类GenericServlet,则可以使用getServletContext()方法。
Web应用中servlet可以使用servlet上下文得到:
1.在调用期间保存和检索属性的功能,并与其他servlet共享这些属性。
2.读取Web应用中文件内容和其他静态资源的功能。
3.互相发送请求的方式。
4.记录错误和信息化消息的功能。
ServletContext接口中的方法
方法名称 | 方法描述 |
Object getAttribute(String name) | 返回servlet上下文中具有指定名字的对象,或使用已指定名捆绑一个对象。从Web应用的标准观点看,这样的对象是全局对象,因为它们可以被同一 servlet在另一时刻访问。或上下文中任意其他servlet访问。 |
void setAttribute(String name,Object obj) | 设置servlet上下文中具有指定名字的对象。 |
Enumeration getAttributeNames() | 返回保存在servlet上下文中所有属性名字的枚举。 |
ServletContext getContext(String uripath) | 返回映射到另一URL的servlet上下文。在同一服务器中URL必须是以“/”开头的绝对路径。 |
String getInitParameter(String name) | 返回指定上下文范围的初始化参数值。此方法与ServletConfig方法名称不一样,后者只应用于已编码的指定servlet。此方法应用于上下文中所有的参数。 |
Enumeration getInitParameterNames() | 返回(可能为空)指定上下文范围的初始化参数值名字的枚举值。 |
int getMajorVersion() int getMinorVersion() | 返回此上下文中支持servlet API级别的最大和最小版本号。 |
String getMimeType(String fileName) | 返回指定文件名的MIME类型。典型情况是基于文件扩展名,而不是文件本身的内容(它可以不必存在)。如果MIME类型未知,可以返回null。 |
RequestDispatcher getNameDispatcher(String name) RequestDispatcher getNameDispatcher(String path) | 回具有指定名字或路径的servlet或JSP的RequestDispatcher。如果不能创建RequestDispatch,返回null。如果指定路径,必须心“/”开头,并且是相对于servlet上下文的顶部。 |
String getRealPath(String path) | 给定一个URI,返回文件系统中URI对应的绝对路径。如果不能进行映射,返回null。 |
URL getResource(String path) InputStream getResourceAsStream(String path) | 返回相对于servlet上下文或读取URL的输入流的指定绝对路径相对应的URL,如果资源不存在则返回null。 |
String getServerInfo() | 返回servlet引擎的名称和版本号。 |
void log(String message) void log(String message,Throwable t) | 将一个消息写入servlet注册,如果给出Throwable参数,则包含栈轨迹。 |
void removeAttribute(String name) | 从servlet上下文中删除指定属性。 |
3.9 javax.servlet.http.HttpSession接口
HttpSession类似于哈希表的接口,它提供了setAttribute ()和getAttribute()方法存储和检索对象。HttpSession提供了一个会话ID关键字,一个参与会话行为的客户端在同一会话的请求中存储和返回它。servlet引擎查找适当的会话对象,并使之对当前请求可用。
HttpSession接口中的方法
方法名称 | 方法描述 |
Object getAttribute(String name) void setAttribute(String name,Object value) void removeAttribute(String name) | 将会话中一个对象保存为指定名字,获取,返回或删除前面保存的此名称对象。 |
Enumeration getAttributeName() | 返回捆绑到当前会话的所有属性名的枚举值。 |
long getCreationTime() long getLastAccessedTime() | 返回表示会话创建和最后访问日期和时间的一个长整型,该整型形式为java.util.Date()构造器中使用的形式。 |
String getId() | 返回会话ID,servlet引擎设置的一个唯一关键字。 |
ing getMaxInactiveInterval() void setMasInactiveInterval(int seconds) | 如果没有与客户端发生交互,设置和返回会话存活的最大秒数。 |
void invalidate() | 使得会话被终止,释放其中任意对象。 |
boolean isNew() | 如果客户端仍未加入到会话,返回true。当会话首次被创建,会话ID被传入客户端,但客户端仍未进行包含此会话ID的第二次请示时,返回true。 |
4. Servlet生命周期简介
4.1 加载和实例化----------->Servlet容器创建Servlet的实例
当客户端向某个Servlet发送一个请求时(也可以配置为当Servlet容器启动时),Servlet容器会查找内存中是否存在该Servlet的实例,如果不存在,就创建一个实例;如果存在,就直接从内存中取出该实例响应请求。
4.2 初始化----------->该容器调用init()方法,对于每个Servlet实例,Servlet容器只调用一次其方init()方法
Servlet容器在完成Servlet实例化后,会调用该Servlet的init()方法进行初始化,初始化的目的是让Servlet在处理客户端请求前完成一些准备工作,如设置必要的参数丶建立JDBC连接,或是建立对其他资源的引用等。完成初始化后,Servlet就处于就绪状态,可以响应请求。
4.3 服务----------->如果请求Servlet,则容器调用servlet()方法
Servlet容器会调用Servlet的servlet()方法处理客户端的请求,HttpServlet的servlet()方法则会根据不同的请求方法(GET丶POST等)将请求分发到doGet()丶doPost()等方法进行处理。Servlet实例通过(Http)ServletRequest对象获得客户端的请求数据,通过调用(Http)ServletResponse对象的方法设置响应信息。
4.4 销毁----------->销毁实例之前调用destroy()方法
Servlet容器既负责创建Servlet实例,又负责销毁Servlet实例。Servlet容器判断一个Servlet实例应当被释放时(如容器关闭或需要回收资源时),就会调用其destroy()方法,该方法负责释放Servlet实例所使用的资源,而非直接回收Servlet实例。
5.Servlet的使用
5.1 创建Servlet
继承Httpservlet类,重写doGet()方法和doPost()方法。注意要继承此类需要先导入Tomcat架包或servlet-api架包。
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Do_servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
5.2 配置Servlet
通过注解配置Servlet
语法:@WebServlet(urlPatterns={"/映射地址"},asyncSupporten=true|false,loadOnStartup=-1,name="Servlet名称",displayName="显示名称",initParams={@WebInitParam(name="键",value="值")})
@WebServlet常用属性
属性 | 类型 | 是否必须 | 说明 |
name | String | 否 | 指定Servlet名称。如果没有显示指定,则该属性取值为类的全限定名 |
urlPatterns | String[] | 否 | 指定一组Servlet的URL匹配模式 |
value | String[] | 否 | 该属性等价于urlPatterns属性,两种不能同时使用。如果同时使用,则忽略value属性的取值 |
asyncSupporten | boolean | 否 | 声明Servlet是否支持异步操作模式 |
loadOnStartup | int | 否 | 指定Servlet的加载顺序 |
displayName | String | 否 | 指定Servlet的显示名称 |
initParams | WebInitParam[] | 否 | 指定一组Servlet的初始化参数 |
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Do_servlet")
public class Do_servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
}
}
5.3 调用Servlet
$(function () {
/*加载时调用*/
$.getJSON("Do_servlet","",function (data) {
alert(data)
})
})
<form action="Do_servlet" method="post">
<div class="inputBox">
<input type="text" placeholder="姓名" name="uname" required="required">
</div>
<div class="inputBox">
<input type="password" placeholder="密码" name="upwd" required="required">
</div>
<div class="inputBox">
<input type="submit" value="登录">
</div>
<p class="forget">忘记密码?<a href="#">
点击这里
</a></p>
<p class="forget">没有账户?<a href="#">
注册
</a></p>
</form>
6.本章总结
- Servlet是一个Java程序,它运行在服务器端,用于接收和处理用户请求,并做出响应。
- Servlet API包含两个包,javax.servlet中包含的类和接口是通用的不依赖协议的Servlet API,javax.servlet.http中的类和接口是用于支持HTTP的Servlet API。
- Servlet的生命周期包括四个阶段:加载和实例化丶初始化丶服务丶销毁。
- 通过配置Servlet,容器可以根据配置的URL映射查找Servlet,并调用该Servlet处理用户的请求。
- 配置Servlet的方法有配置web.xml或使用@WebServlet注解两种方式。