Servlet是JavaWeb应用中最核心的组件。
主要任务:
1、动态的生成HTML文档。
2、把请求转发给同一个Web应用中的其他Servlet组件。
3、把请求转发给其他Web应用中的Servlet组件。
4、读取客户端的Cookie,以及向客户端写入Cookie。
5、访问其他服务器资源(如数据库或基于Java的应用程序)
Servlet规范为JavaWeb应用制定的对象模型称为Servlet对象模型。
Servlet是用Java语言编写出来的类,Servlet对象由Servlet容器创建。
Servlet最常用的对象:
1、请求对象(ServletRequest和HttpServletRequest):Servlet从该对象中获取来自客户端的请求信息。
2、响应对象(ServletResponse和HttpServletResponse):Servlet通过该对象来生成相应结果。
3、Servlet配置对象(ServletConfig):当容器初始化一个Servlet对象时,会向Servlet提供一个ServletConfig对象,Servlet通过该对象来获取初始化参数信息和ServletContext对象。
4、Servlet上下午对象(ServletContext):Servlet通过该对象来访问容器为当前Web应用提供的各种资源。
Tomcat的/lib/servlet-api.jar文件为Servlet API的类库文件。
Servlet API主要由两个Java包组成:javax.servlet和javax.servlet.http。
1、javax.servlet包中定义了Servlet的接口及相关的通用接口和类。
2、javax.servlet.http包中定义了与HTTP协议相关的HttpServlet类、HttpServletRequest接口和HttpServletResponse接口。
Servlet接口
所有Servlet类都必须实现这个接口,Servlet接口中定义了5个方法,其中有3个方法都是有Servlet容器来调用,容器会在Servlet的生命周期的不同阶段调用特定的方法。
1、init(ServletConfig config)方法:负责初始化Servlet对象。容器在创建好Servlet对象后,就会调用该方法。
2、service(ServletRequest req,ServletResponse resp)方法:负责响应客户的请求,为客户提供相应的服务。当容器接收到客户要求访问特定的Servlet对象的请求时,就会调用这个方法。
3、destroy()方法:负责释放这个Servlet占用的资源.
Servlet接口还定义了以下两个返回Servlet的相关信息的方法。JavaWeb应用中的程序代码可以访问Servlet的这两个方法,从而获得Servlet的配置信息及其他相关信息。
4、getServletConfig():返回一个ServletConfig对象,在该对象中包含了Servlet的初始化参数信息。
5、getServletInfo():返回一个字符串,在该字符串中包含了Servlet的创建者、版本和版权等信息。
在Servlet API中,GenericServlet抽象类实现了Servlet接口,HttpServlet抽象类是GenericServlet的子类,所有在自己写Servlet类的时候可以继承HttpServlet和GenericServlet都可以。
public class TestServlet extends HttpServlet{
@Override
public String getServletInfo() {
return "作者:XXX";
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("init````");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
String name = req.getParameter("username");
System.out.println("name" + name);
String str = getServletInfo();
System.out.println("str" + str);
}
@Override
public ServletConfig getServletConfig() {
//还没用研究这是干啥的,以后学到了在写
return super.getServletConfig();
}
@SuppressWarnings("unused")
private void destory() {
System.out.println("destory````");
}
}
console输出:
init““
nametome
str作者:XXX
GenericServlet抽象类
GenericServlet抽象类为Servlet接口提供了通用的实现,它与任何网络应用层协议无关。GenericServlet抽象类还实现了ServletConfig接口和Serializable接口。没有实现Servlet接口中的service()方法。service()方法是GenericServlet类中唯一的抽象方法,GenericServlet的具体子类必须实现该方法,从而为特定的客户提供具体的服务。
此外,GenericServlet抽象类实现了ServletConfig接口中的所有方法。因此子类可以直接调用ServletConfig接口中的所有方法。
HttpServlet抽象类
HttpServlet类是GenericServlet类的子类。HttpServlet类为Servlet接口提供了与HTTP协议相关的通用实现,也就是说,HttpServlet对象适合运行在与客户端采用HTTP协议通信的Servlet容器或者Web服务器中。在开发JavaWeb应用时,自定义的Servlet类一般都继承HttpServlet类。
HttpServlet类实现了Servlet接口中的service()方法,该方法实际上是使用了自身的重载方法。该重载的service(Request,Response);方法,首先调用HttpServletRequest的getMethod()方法,从而获得客户端的请求方式,然后在依据该请求方式来调用匹配的服务方法。如果是GET方法,就调用doGET();如果是POST方法,就调用doPOST()方法。
对于HttpServlet的具体子类,一般会针对客户的具体请求来覆盖HttpServlet的doXXX方法。为了是该方法能被Servlet容器访问到,应该把访问权限设为public。
ServletRequest接口
ServletRequest类表示来自客户端的请求。当Servlet容器接收到客户端要求访问特定Servlet的请求时,容器先解析客户端的原始请求数据,把它包装成一个ServletRequest对象。当容器调用service();方法时,就可以把ServletRequest对象作为参数传个这个方法。
ServletRequest接口提供了一系列的用户读取客户端请求数据的方法。
1、getContentLength():返回请求正文的长度。如果请求正文的长度未知,则返回-1.
2、getContentType():获得请求正文的MIME类型。如果请求正文的类型未知,则返回null.
3、getInputStream():返回用于读取请求正文的输入流。
4、getLocalAddr():返回服务器端的IP地址。
5、getLocalName():返回服务器的主机名。
6、getLocalPort():返回服务器端的FTP端口号。
7、getParameter(String name):根据给定的请求参数名,返回来自客户请求中的匹配的请求参数值。
8、getProtocol():返回客户端与服务器端通信所用的协议的名称和版本号。
9、getReader():返回用于读取字符串形式的请求正文的BufferedReader对象。
10、getRemoteAddr():返回客户端的IP地址。
11、getRemoteHost():返回客户端的主机名。
12、getRemotePort():返回客户端的FTP端口号。
此外,在ServletRequest接口中还定义了一组用于在请求范围内存取共享数据的方法。
1、setAttribute(String name, java.lang.Object Object):在请求范围内保存一个属性,参数name表示属性名,参数Object表示属性值。
2、getAttribute(String name):根据name参数给定的属性名,返回请求范围内的匹配的属性值。
3、removeAttribute(String name):从请求范围内删除一个属性。
HttpServletRequest接口
HttpServletRequest接口是ServletRequest接口的子接口。
该接口提供用于读取HTTP请求中的相关信息的方法:
1、getContextPath():返回客户端所请求访问的Web应用的URL入口。返回Web项目的名字。
2、getCookies():返回HTTP请求中的所有Cookie。
3、getHeader(String name):返回HTTP请求头部的特定项。
4、getHeaderNames():返回一个Enumeration对象,它包含了HTTP请求头部的所有项目名。
5、getMethid():返回HTTP请求方式。
6、getRequestURI():返回HTTP请求的头部的第1行中的 URI。
7、getQueryString():返回HTTP请求中的查询字符串,即URL中的“?”后面的内容。
例子:
package servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestServletInfo extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
System.out.println("LocalHost: " + req.getLocalAddr());
System.out.println("LocalName: " + req.getLocalName());
System.out.println("LocalPort: " + req.getLocalPort());
System.out.println("Protocol: " + req.getProtocol());
System.out.println("RemoteAddr: " + req.getRemoteAddr());
System.out.println("RemoteHost: " + req.getRemoteHost());
System.out.println("RomotePort: " + req.getRemotePort());
System.out.println("Method: " + req.getMethod());
System.out.println("URI: " + req.getRequestURI());
System.out.println("ContextPath: " + req.getContextPath());
System.out.println("Cookies: " + req.getCookies());
System.out.println("**HTTP请求头**");
Enumeration eu = req.getHeaderNames();
while(eu.hasMoreElements()){
String headerName = (String)eu.nextElement();
System.out.println(headerName + ":" + req.getHeader(headerName));
}
System.out.println("**Http请求头结束**");
System.out.println("getParameter:" + req.getParameter("username"));
}
}
控制台输出结果:
LocalHost: 0:0:0:0:0:0:0:1
LocalName: 0:0:0:0:0:0:0:1
LocalPort: 8080
Protocol: HTTP/1.1
RemoteAddr: 0:0:0:0:0:0:0:1
RemoteHost: 0:0:0:0:0:0:0:1
RomotePort: 58252
Method: GET
URI: /JavaWeb_001/login
ContextPath: /JavaWeb_001
Cookies: null
HTTP请求头
host:localhost:8080
connection:keep-alive
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
upgrade-insecure-requests:1
user-agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
referer:http://localhost:8080/JavaWeb_001/
accept-encoding:gzip, deflate, sdch
accept-language:zh-CN,zh;q=0.8
Http请求头结束
getParameter:tom
ServletResponse接口
在Servlet接口中的service方法中有一个ServletResponse类型的参数,Servlet通过ServletResponse对象来生成响应结果。Servlet容器接收到客户端要求访问的特定Servlet的请求后,容器会创建一个ServletResponse对象,并把它作为参数传给service方法。
该接口中定义了一系列的与生成结果相关的方法:
1、setCharacterEncoding(String charset):设置响应正文的字符编码,响应正文的默认编码上“ISO-8859-1”。支持中文可以改成“UTF-8”。
2、setContentLength(int len):设置响应正文的长度。
3、setContentType(String type):设置响应正文的MIME类型。
4、getCharacterEncoding():返回响应正文的字符编码。
5、getContentType():返回响应正文的MIME类型。
6、setBufferSize(int size):设置用于存放响应正文数据的缓冲区的大小。
7、getBufferSize():获得用于存放响应正文数据的缓冲区的大小。
8、reset():清空缓冲区内的正文数据,并且清空响应状态代码及响应头。
9、resetBuffer():仅仅清空缓冲区内的正文数据,不清空响应状态代码及响应头。
10、flushBuffer():强制性地把缓冲区内的响应正文数据发送到客户端。
11、isCommitted():返回一个boolean类型的值,如果为true,表示缓冲区的数据已经提交给客户。
12、getOutputStream():返回一个ServletOutputStream对象,Servlet用它来输出二进制的正文数据。
13、getWriter():返回一个PrintWriter对象,Servlet用它来输出字符串形式的正文数据。
为了提高输出数据的效率,ServletOutputStream和printWriter先把数据写到缓冲区内。当缓冲区内的数据被提交给客户后。isCommitted()方法返回true。
以下几种情况下,数据会被发送给客户端:
1、当缓冲区内的数据已经满时,会发送,并且清空缓冲区。
2、Servlet调用ServletResponse对象的flushBuffer()方法。
3、Servlet调用ServletOutputStream或PrintWriter对象的flush()方法或close()方法。
第三种是最常用的。
HttpServletResponse
HttpServletResponse接口是ServletResponse接口的子接口,该接口提供了与HTTP协议相关的一些方法。Servlet可以通过这些方法来设置HTTP响应头或向客户端写Cookie。
1、addHeader(String name,String value):向HTTP响应头中加入一项内容。
2、sendError(int sc):向客户端发送一个代表特定错误的HTTP响应状态代码。
3、sendError(int sc,String msg):向客户端发送一个代表特定错误的HTTP响应状态代码,并且发送具体的错误消息。
4、setHeader(String name,String value):设置HTTP响应头中的一项内容。如果在响应头中已经存在这项内容,那么原来的设置将被覆盖。
5、setStatus(int src):设置HTTP响应的状态码。
6、addCookie(Cookie cookie):向HTTP响应中加入一个Cookie。
在HTTPServletResponse接口中定义了一些代表HTTP响应状态代码的静态常量。
例子
ServletConfig接口
Servlet接口的init(ServletConfig config)方法有一个ServletConfig类型的参数。当Servlet容器初始化一个Servlet对象时,会为这个Servlet对象创建一个ServletConfig对象。在ServletConfig对象中包含了Servlet的初始化参数信息,此外,ServletConfig对象还与Servletcontext对象关联。
在ServletConfig接口中定义了以下方法:
1、getInitParameter(String name):根据给定的初始化参数名,返回匹配的初始化参数值。
2、getInitParameterNames():返回一个Enumeration对象,里面包含了所有的初始化参数名。
3、getServletContext():返回一个ServletContext对象。
4、getServletName():返回Servlet的名字,即web.xml文件中相应<servlet>元素的<servlet-name>子元素的值
,如果没有配置Servlet,则返回Servlet类的名字。