在servlet体系中,除了用于实现servlet接口、GenericServlet类和HttpServlet类外,还有一些辅助servlet获取相关资源的重要接口,,了解这些接口并熟练运用这些接口的常用方法是使用servlet进行web开发的基础
主要有一下四个接口:
- ServletConfig接口:用于获取servlet初始化参数和servletContext对象;
- ServletContext接口:代表当前servlet运行环境,servlet可以通过servletContext对象来访问Servlet容器的各种资源;
- HttpServletRequest接口:用于封装Http请求信息;
- HttpServletResponse接口:用于封装Http响应信息;
- ServletConfig接口
接口定义为:public abstract interface javax.servlet.ServletConfig;
容器在初始化一个servlet时,将为该servlet创建一个唯一的的servletConfig对象,并将这个对象通过init(ServletConfig config)方法来传递并保存在此Servlet对象中。
ServletConfig的主要方法有:
方 法 |
描 述 |
getInitParameter(String param) |
根据参数的名称返回初始对应的参数值,若无返回null |
getInitParameterNames() |
返回一个Enumeration对象,包含初始化参数的名称 |
getServletContext() |
返回ServletContext对象 |
getServletName() |
返回servlet的名字,即@WebServet的name属性值,如果没有配置这个属性值,则返回servlet类的权限定名 |
ServletConfig接口主要访问两项内容;一是Servlet初始化信息,这个需要在Servlet配置的文件中获取;另一个是ServletContext对象,主要为servlet提供容器信息。
在实际的开发中,我们时常遇到某些信息不断变化,比如账户和密码,若有变化servlet将会重新编译,这将大大降低了运行速度。所以将这些信息编码到配置文件中,可以解决这一问题。
Web.xml配置文件中的代码
<init-param>
<param-name>url</param-name>
<param-value>123456</param-value>
</init-param>
Servlet中的代码
String s = config.getInitParameter(“url”); //s=”123456”
2.ServletContext接口
ServletContext也称作servlet的上下文。一个web应用启动过后,servlet容器会创建唯一一个ServletContext对象,在应用中的任何servlet都可以共享这个ServletContext,这个对象有两种方法可以获取:1.通过init方法中的servletconfig接口getservletContext方法来获取。2.通过GenericServlet抽象类的getservletContext方法获取。
ServletContext方法:
- 获取应用范围的初始化参数
- 存取应用范围域属性的方法
- 存取当前web信息
- 获取当前容器信息的输出日志
- 获取服务器文件资源
以下进行介绍
1).获取应用的初始化参数
在web.xml中使用<context-name>、<context-value>标签配置信息。容器在加载时会读取这些信息并且会存入ServletContext对象中。ServletContext接口会提供这些初始化参数的获取方法:
方法 |
描述 |
getInitParameter(String name) |
返回name的参数值。即返回<context-name>对应的<context-value>值 |
getInitParameterNames |
返回包含所有初始化名称的的Enumeration |
2).存取应用域属性
ServletContext可以理解为一个容器中共享的空间,可以储存具有应用级别作用域的数据,web应用中的各个组件都可以共享这些数据,这些数据可以以key/value的形式来储存到servletcontext中,并以key作为属性名来访问。
方法 |
描述 |
setAttribute(String name,Object o) |
把一个对象和属性名储存到servletconfig中,参数name指定为属性名,参数object表示共享的数据 |
getAttribute(String name) |
根据name获取数据 |
getAttributeNames() |
返回一个Enumeration对象,该对象包含了所有存放在servletContext中的属性名 |
removeAttribute(String name) |
根据name删除属性 |
3).获取应用信息
ServletContext还可以获取当前web应用中的根路径、应用的名称、应用的组件、应用组件间的转发以及容器下其他web应用的ServletContext对象等
方法 |
描述 |
getContextPath() |
Web应用的根路径 |
getServletContextName() |
返回web应用名称<web-app>中的<display-name>元素的值 |
getRequestDispatcher(String path) |
返回一个用于向其他web组件转发请求的RequestDispatcher对象 |
GetContext(String uripath) |
根据参数指定url返回当前servlet容器中其他web应用的servletcontext对象,url必须以“/”开头 |
4).获取容器信息
方法 |
描述 |
getServlerInfo() |
web容器的名字和版本 |
getMajorVersion() |
Web容器支持的servlet API主版本号 |
getMinorVersion() |
Web容器支持的servlet API次版本号 |
log(String msg) |
用于记录一般日志 |
log(String msg,Throwable throw) |
记录异常的堆栈日志 |
5).获取服务器文件资源
使用ServletContext接口还可以访问web应用中静态文件,例如HTML、GIF和Properties文件等,同时还可以获取文件资源的MIME类型以及其在服务器中的真实存放路径。
方法 |
描述 |
getResourcceAsStream(String path) |
返回一个读取参数指定的文件输入流,参数路径以“/”开头 |
getResource(String path) |
返回一个由path指定的资源路径对应的URL对象,参数以”/”开头 |
getRealPath(String path) |
根据虚拟路径返回真实路径 |
getMimeType(String file) |
根据参数指定的文件的MIME类型 |
3.HttpServletRequest接口
ServletRequest接口用于封装请求信息,该对象在用户每次请求servlet时创建并传入servlet的service()方法。HttpServletRequest继承于servletRequest,专门用于HTTP协议的子接口。在Httpservlet类中的service()方法中,传入的servletRequest将会被强制转化为HttpservletRequest对象来进行HTTP请求信息的处理。
HttpServletRequest接口有以下方法:
- 获取请求报文信息
- 获取网络连接信息
- 存取请求域属性的方法
1).获取请求行信息
一个请求行一般由请求方法(POST、GET)、请求URL、请求协议及版本组成。
方法 |
描述 |
getMethod() |
获取请求的方法POST、GET、PUT |
getRequestURI() |
获取请求行的资源 |
getProrocol() |
获取使用协议和版本号 |
getQueryString() |
获取请求URL查询字符,对get有效 |
getServletPath() |
获取servlet所映射的路径 |
getContextPath() |
获取资源所属的web应用的路径 |
2).获取请求头信息
方法 |
描述 |
getIntHeader(String name) |
获取整数类型参数名为name的http头 |
getDateHeader(String name) |
获取long类型名为neme的http头 |
getContentLength() |
获取请求内容的长度 |
getContentType() |
获取请求的文档类型和编码 |
getLocale() |
获取用户浏览器设置的local信息 |
getCookies() |
获取一个cookie数组。所有的cookies |
3).获取请求正文
请求正文内容为POST请求参数名称和值所组成的一个字符串,而对于GET请求,请求参数附属在请求行中,没有正文。POST请求一般通过<form>表单来提交数据请求,<form>表单元素中有一个enctype属性用于指定浏览器使用哪种编码方式将表单中的数据传达给web服务器,enctype默认为application/x-www-form-urlencoded,名称和值用“=”连接,各个参数用“&”连接。使用这种编码方式可用以下方法:
方法 |
描述 |
String getParameter(String name) |
返回name指定的参数值 |
Enumeration getParameterNames() |
返回所有用户的参数名 |
String[] getParameterValues(String name) |
name指定的一组值 |
Map getParameterMap() |
返回一个请求参数的Map对象,Map中的键为参数的名称,值为参数对应的参数值 |
Enctype有另外一个属性 那就是multipart/form-data,并且此属性只适合于POST请求方式。他是在上传文件的时候才会用到
4).请求参数的中文问题
出现乱码的原因是浏览器采用的编码方式以及服务器对不同类型的请求(GET、post)的解码方式有关。所以对于POST请求,服务器端servlet在调用HttpServletRequest对象时使用getParameter()方法前要调用setCharacterEnocding(charset)的方法设定编码方式。
Reques.setCharacterEncoding(charset)
原因解剖:采用form表单的post请求,浏览器会按照显示页面所采用的字符集对中文数据编码。然后发到服务器,servlet调用HttpServletRequest对象的getParameter()方法来获取参数,而在没有设置编码的情况下默认为unll。这时会以ISO-8859-1字符集来编码,这个字符集不包含中文,所以产生的乱码。
而对于GET请求不能使用setCharacterEncoding(charset)。需要在jsp页面中进行编码<%@page language = “java” charset = “utf-8” pageEncoding = “utf-8”>
5).获取网络连接
方法 |
描述 |
getRemoteAddr() |
获取用户ip |
getRemoteHost() |
获取用户主机名 |
getRemotePort() |
获取端口号 |
getLocalAddr |
获取web服务器的ip地址 |
getLocalName() |
获取web服务器的主机名 |
getLocalPort() |
获取web服务器的端口号 |
getServerName() |
获取网站域名 |
getServerPort() |
获取URL请求的端口号 |
getScheme() |
获取请求使用的协议, |
getRequestURL() |
获取URL |
6).存取请求域的信息
储存在HttpServletRequest对象中的对象称之为请求域属性,属于同一个请求的多处理组件之间可以通过请求域来共享这些信息。
方法 |
描述 |
setAtrribute(String name,Object value) |
设定name属性值为value,保存在request范围内。 |
getAttribute(String ame) |
从request范围中获取name的值 |
removeAttribute(String name) |
从request范围内移除name属性值 |
EnumerationgetAttributeNames() |
获取所有request范围的属性 |
4.HttpServletResponse接口
HttpServletResponse继承自ServletResponse,封装了Http响应信息,用于Http子接口,在HttpServlet类的service()方法中,传入ServletResponse对象强制转化为HttpServletResponse对象来处理HTTP请求。该接口主要提供了具有如下功能类型的方法:
- 设置响应状态的方法
- 构建响应头的方法
- 创建响应正文的方法
1).设置响应状态
Http响应报文的响应行由报文协议和版本以及状态码构成。
常见的状态码:
200:表示请求成果
302:表示页面暂时转移到其他URL
404:表示请求的资源不存在
500:服务器内部出现错误
方法 |
藐视 |
setStatus(int sc) |
以指定的状态码将响应返回给客户端 |
setError(int sc) |
使用指定的状态码向客户端返回一个错误的响应 |
sendError(ing sc,String msg) |
使用指定的状态码,和描述返回给客户端 |
SendRedirect(String location) |
请求重定向,会设定响应Location报头 |
2).设置响应信息头
方法 |
描述 |
setContentType(String mime) |
设定Content-Type |
setContentLength(int length) |
设置Content-Length消息头 |
addHeader(String name,String value) |
新增String类型的值到名为name头部 |
addIntHeader(Stirng name,int value) |
新增int类型的值到name的头部 |
AddDataHeader(String name,long date |
增long类型的值到name头部 |
addCookie(Cookie c) |
为Set-Cookie消息头增一个值 |
3).创建响应正文
HttpServletResponse接口获取输出流对象的方法:
方法 |
描述 |
getOutputStream() |
返回字节输出流对象ServletOutputStream |
getWriter() |
返回字符输出流对象PrintWriter |
4).响应输出中文问题
1.response.setCharacterEncoding(“UTF-8”);用于PrintWriter输出流
2.response.setContentType(“text/html,charset=utf-8”);可以用于PrintWriter输出流也可以用于浏览器编码方式
3.Respomse.setLocale(new java.util.Locale(“ZH”,”CN”));优先级最低,用于PrintWriter输出流
5.总结
- 容器在初始化的过程中会创建一个ServletConfig对象,并通过servlet的init方法传递保存在servlet中。
- ServletConfig接口中的方法,可以获取配置文件配置的初始化参数,也可以获取servletContext对象。
- Web应用启动后会创建唯一的一个ServletContext对象,在该应用的其他servlet可以共享这个对象
- ServletContext对象用的应用域属性用<content-param>指定,而ServletConfig靠<init-param>指定
- HttpServletRequest对象通过getParameter()来获取参数