javax.servlet.Servlet 接口
1所有的servlet类都必须实现servlet接口
2.servlet接口中定义了5个方法。其中有3个方法由servlet容器在servlet生命周期的不同阶段调用,另外两个方法可以在在代码中调用。
servlet接口中的5个方法
方法名 | 作用 | 调用时间 |
init(ServletConfig config) | 初始化servlet | 容器创建好servlet对象后调用 |
service(ServletRequest request,ServletResponse response) | 响应客户端请求 | 容器收到servlet请求时调用 |
destroy() | 释放servlet对象占用的资源 | 当servlet对象结束生命周期时调用 |
getServletConfig() | 返回一个servletConfig对象。这个对象中包含servlet的初始化参数信息 | |
getServletInfo() | 返回一个字符转,该字符串中包括了servlet的创建者、版本和版权等信息。 |
servlet接口有两个实现类,分别是HttpServlet和GenericServlet。HttpServlet是GenericServlet的子类。
GenericServlet抽象类
(1)GenericServlet类实现了Servlet接口和ServletConfig接口。
(2)GenericServlet类实现了Servlet中的init(ServletConfig config)方法。这个实现使GenericServlet对象和ServletConfig对象关联。
(3)GenericServlet类除了实现Servlet中的init(ServletConfig config)方法外。还定义了不带参数的init()方法。如果GnericServlet类的子类想覆盖GnericServlet的初始化行为,有两种方法:
(3.1)覆盖父类不带参数的init()方法
public void inint(){
//子类自己的初始化行为
}
(3.2)覆盖父类带参数的init(ServletConfig config)方法。如果想当前servlet对象和ServletConfig对象关联,要在该覆盖方法中调用super.init(config)
public void init(ServletConfig config){
super.init(config);
//子类自己的初始化行为
}
HttpServlet抽象类
(1)HttpServlet类为servlet接口提供了与HTTP协议相关的通用实现。在java web应用中,自定义的servlet类一般都扩展HttpServlet类。
(2)HttpServlet针对各种请求方式(GET/POST/PUT/DELETE)都提供了相应的服务方法。
(3)HttpServlet实现了Servlet接口的service方法,其实service方法中调用的就是(2)。先通过req.getMethod()判断是哪种请求,再调用相应的实现。
(4)HttpServlet的源码中对各种请求的实现都是返回一个错误(400或405)。所以需要HttpServlet的子类根绝特定请求覆盖父类特定的方法。
(4.1)方法权限应该设置为public.使servlet容器能被访问到
(4.2)如果客户端按照doGet或者doPost方法请求servlet,并且在这两种方法下servlet提供相同的服务,那么可以在servlet中从新实现doGet方法;并且让doPost调用doGet.
public class HelloServlet extends HttpServlet{
public void doPost(HttpServletRequest req,HttpServletResponse resp)throws Exception{
doGet(req,resp);
}
public void doGet(HttpServletRequest req,HttpServletResponse resp)throws Exception{
//提供具体的实现代码
}
}
ServletRequst & HttpServletRequst
HttpServletRequest接口是ServletRequest的子接口。
当servlet容器接受到客户端要求访问特定的servlet时,容器先解析客户端的原始请求数据,把他包装成一个servletRequest对象,当容器调用servlet的service方法时,就把servletRequest当做参数传递进去。
servletRequest用于读取客户端请求数据的方法
方法名 | 作用 |
getContentLength() | 返回请求正文的长度,如果长度未知,返回-1. |
getContentType() | 获得请求正文的MIME类型。如果正文类型未知,返回Null |
getInputStream() | 返回用于读取请求正文的输入流 |
getLocalAddr() | 返回服务器端的IP地址 |
getLocalName() | 返回服务器端的主机名 |
getLocalPort() | 返回服务器端的FTP端口号 |
getParameter(String name) | 根据参数名返回参数值 |
getProtocol() | 返回客户端和服务器端通信所用的协议名称和版本号 |
getReader() | 返回用于读取字符串形式的请求正文的BufferReader对象 |
getRemoteAddr() | 返回客户端IP地址 |
getRemoteHost() | 返回客户端主机名 |
getRemotePort() | 返回客户端的FTP端口号 |
setAttribute(String naem,Object obj) | 在请求范围内保存属性 |
getAttribute(String name) | 根据属性名返回请求范围内的属性值 |
removeAttribute(String name) | 删除请求范围内的一个属性 |
HttpServletRequest用于读取HTTP请求数据的方法
方法名 | 作用 |
getContextPath() | 返回客户端请求访问的web应用的URL入口。eg:http://loahost:8080/test/info |
getHeader(String name) | 返回http请求头部的特定项。 |
getCookies() | 返回http请求中所有的Cookies |
getHeaderNames() | 返回http请求头部的所有项 |
getMethod() | 返回Http请求方式 |
getRequestURI() | 返回http请求的头部的第一行中的URL eg:http://loahost:8080/test/info |
getQueryString() | 返回Http请求中的查询字符串,即URL中“?”后面的内容 |
servletResponse & httpServletResponse
servlet通过servletResponse 对象来生成响应结果。
httpServletResponse接口是servletResponse的子接口。
servletResponse接口中与生成响应结果相关的方法
方法名 | 作用 |
setCharacterEnconding(String charset) | 设置响应正文的字符编码,默认编码是ISO-8859-1 |
setContentLength(int len) | 设置响应正文的长度 |
setContentType(String type) | 设置响应正文的MIME类型 |
getCharacterEncoding() | 返回响应正文的字符编码 |
getContentType() | 返回响应正文的MIME类型 |
setBufferSize(int len) | 设置用于存放响应正文的缓冲区大小 |
getBufferSIze() | 返回用于存放响应正文的缓冲区大小 |
reset() | 清空缓冲区的正文数据。包括清空响应状态吗和I响应头 |
resetBuffer() | 只是清空缓冲区内的正文数据,不清空响应状态码和响应头 |
flushBuffer() | 强制性的把缓冲区内的响应正文数据发送到客户端 |
isCommitted() | 返回值是Boolean类型。如果是true.表示缓冲区内的数据已经发送到客户端 |
getOutputStream() | 返回一个ServletOutputStream对象。用于输出二进制形式的响应正文 |
getWriter() | 返回一个PrintWriter对象.用来输出字符串形式的响应正文 |
注:ServletResponse中响应正文的默认MIME类型是text/plain,即纯文本类型。
HttpServletResponse中响应正文的默认MIME类型是text/html。即HTML文档类型。
为了提高输出效率,ServletOutputSteam和PrintWriter会把响应数据先写到缓冲区里,当缓冲区内的数据被提交给客户后,servlet的isCommitted返回true.
缓冲区的数据提交给客户的3种情况(即数据被发送到客户端):
a:缓冲区数据满了。输出流(ServletOutputStream和PrintWriter)自动提交,并清空缓冲区。
b:servlet调用ServletResponse的flushBuffer()。
c:Servlet调用ServletOutputStream或PrintWriter的flush()或close()方法。
要在数据提交缓冲区前设置响应正文的字符编码,长度,MIME类型等,这样的设置才有效。
HttpServletResponse相关方法
方法名 | 作用 |
addHeader(String name,String value) | 向HTTP响应头中加入一项内容 |
sendError(int sc) | 向客户端发送一个代表特定错误的状态码 |
sendError(int sc,String msg) | 向客户端发送一个代表特定错误的状态码并且发送具体的错误信息 |
setHeader(String name,String value) | 向HTTP响应头中加入一项内容.如果已有这项内容,则原先设置的内容被覆盖。 |
setStatus(int sc) | 设置HTTP响应状态码 |
addcookie(Cookie cookie) | 向HTTP响应中加入一个cookie |
所以设置HTTP响应正文的MIME类型和字符编码有以下3种方式:
a:response.setContentType("text/html;charset=GB2312");
b:response.setContenType("text/html");
response.setCharacterEncoding("GB2312");
c:response.setHeader("contentType","text/html;charset=GB2312");
ServletConfig接口
ServletConfig对象中包含了servlet初始化参数信息。在web.xml中可以通过配置<init-param>元素来配置servlet初始化参数。
ServletConfig对象还与当前Servlet对象相关联。见GenericServlet接口
方法名 | 作用 |
getInitParameter(String name) | 根据初始化参数名返回 初始化参数值 |
gtInitParameterNames() | 返回一个Enumeration对象(列举对象),包含了所有初始化参数名 |
getServletName() | 返回servlet名字,若web.xml中没有配置,则返回servlet类名 |
getServletContext() | 返回ServletContext对象 |
ServletContext接口
ServletContext是Servlet与Servlet容器之间直接通信的接口。Servlet容器在启动一个web应用的时候,会为他创建一个ServletContext对象。每个web应用都有唯一的ServletContext对象。同一个web应用的所有servlet共用一个ServletContext对象。
ServletContext对象相当于一个web应用的总管家,servlet对象可以通过这个总管家来访问容器中的各种资源。
方法名 | 作用 |
用于在web应用范围内存取共享数据的方法 | |
setAttribute(String name,Object obj) | 把一个java对象与一个属性名绑定。并存到ServletContext中。 |
getAttribute(String name) | 在servletContext中,通过属性名找到匹配的值 |
getAttributeNames() | 返回一个Enumeration对象.这个对象中包含了所有存放在servletContext中属性名 |
removeAttribute(String name) | 根据指定的属性名,从ServletContext中删除匹配的属性 |
访问当前web应用的资源 | |
getContextPath() | 获得当前web应用的URL入口 |
getInitPartameter(String name) | 根据参数名,返回web应用范围内的初始化参数值。web应用范围内的初始化参数值可以在web.xml中,<web-app>根元素下直接定义<context-param> |
getInitParameterNames() | 返回web应用范围内所有的参数名 |
getServletContextName() | 返回web应用的名字。即web.xml中<display-name>元素的值 |
getRequestDispatcher(String path) | 返回一个用于向其他web组件转发请求的requestDispatcher对象 |
访问servlet容器中其他的web应用 | |
getContext(String path) | 根据指定的URL返回当前servlet容器中其他web应用的ServletContext对象。 |
访问Servlet容器的相关信息 | |
getMajorVersion() | 返回servlet容器支持的java servlet API的主版本号 |
getMinorVersion() | 返回servlet容器支持的java servlet API的次版本号 |
getServletInfo() | 返回servlet容器的名字和版本 |
访问服务器端的文件系统资源 | |
getRealPath(String path) | 根据虚拟路径返回真实路径 |
getResource(String path) | 返回一个映射到参数指定路径的URL |
getResourceAsStream(String path) | 返回一个用于读取参数指定文件的输入流 |
getMimeType(String file) | 返回参数指定文件的MIME类型 |
输出日志 | |
log(String msg) | 向servlet的文件日志中写日志 |
log(String msg,java.lang.Throwable throwabe) | 向servlet的文件日志中写错误日志,以及异常的堆栈信息。 |
注:ServletConfig接口中定义了getServletContext()方法。HttpServlet类继承了GenericServlet类。而GenericServlet类实现了ServletConfig接口。因此在HttpServlet类或者GenericServlet及其子类中都可以调用getServletContext()方法获得当前web应用的ServletContext对象。