1. request
1.1 request概述
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。
request功能
- 封装了请求头数据
- 封装了请求正文数据,如果是GET请求,那么就没有正文
- request是一个域对象,可以把它当成Map来添加获取数据
- request提供了请求转发和请求包含功能
1.2 request域方法
request是域对象!在JavaWeb中一共四个域对象,其中ServletContext就是域对象,它在整个应用中只创建一个ServletContext对象。request其中一个,request可以在一个请求中共享数据
一个请求会创建一个request对象,如果在一个请求中经历了多个Servlet,那么多个Servlet就可以使用request来共享数据
request的域方法
-
void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性
例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX
请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同 -
Object getAttribute(String name):用来获取request中的数据,当前在获取之前需要先去存储才行
例如:String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性 -
void removeAttribute(String name):用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做
-
Enumeration getAttributeNames():获取所有域属性的名称
1.3 request获取请求头数据
request与请求头相关的方法有:
- String getHeader(String name):获取指定名称的请求头
- Enumeration getHeaderNames():获取所有请求头名称
- int getIntHeader(String name):获取值为int类型的请求头
1.4 request获取请求相关的其它方法
request中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法:
-
int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1
-
String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null
如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码 -
String getMethod():返回请求方法,例如:GET
-
Locale getLocale():返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用
-
String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码
-
void setCharacterEncoding(String code):设置请求编码,只对请求体有效!
注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效! -
String getContextPath():返回上下文路径
例如:/hello -
String getQueryString():返回请求URL中的参数
例如:name=zhangSan -
String getRequestURI():返回请求URI路径
例如:/hello/oneServlet -
StringBuffer getRequestURL():返回请求URL路径
例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息 -
String getServletPath():返回Servlet路径
例如:/oneServlet -
String getRemoteAddr():返回当前客户端的IP地址
-
String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址
-
String getScheme():返回请求协议
例如:http; -
String getServerName():返回主机名
例如:localhost -
int getServerPort():返回服务器端口号
例如:8080
1.5 request获取请求参数
最为常见的客户端传递参数方式有两种:
- 浏览器地址栏直接输入:一定是GET请求
- 超链接:一定是GET请求
- 表单:可以是GET,也可以是POST,这取决与的method属性值
GET请求和POST请求的区别:
- GET请求:
-
- 请求参数会在浏览器的地址栏中显示,所以不安全
-
- 请求参数长度限制长度在1K之内
-
- GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码
- POST请求:
-
- 请求参数不会显示浏览器的地址栏,相对安全
-
- 请求参数长度没有限制
2. response
2.1 response概述
response是 Servlet.service方法的一个参数,类型为 avax.servlet.http. HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个 response对象,并传入给 Servlet. service()方法。 response对象是用来对客户端进行响应的,这说明在 service()方法中使用 response对象可以完成对客户端的响应工作
response对象的功能分为以下四种
- 设置响应头信息
- 发送状态码
- 设置响应正文
- 重定向
2.2 response用法
-
设置响应行的状态码
setStatus(int value) -
设置响应头
-
- addHeader(String name,String value)
addIntHeader(String name,int value)
addDateHeader(String name,long value)
- addHeader(String name,String value)
-
- setHeader(String name,String value)
setIntHeader(String name ,int value)
setDateHeader(String name, long value)
- setHeader(String name,String value)
注意了,要注意setHeader和addHeader的不同,一个是设置,一个是添加,设置只能是设置最后一个,但是添加可以添加很多个
2.3 response实现重定向
方法一:
response.setStatus(302); //设置响应行的状态码为302 重定向
response.setHeader("Location", "/Servlet/servlet2"); //设置响应头的属性 跳转到Servlet2
方法二:
response.sendRedirect("/Servlet/servlet2"); //利用response中的sendRedirect属性完成重定向
2.4 Response中应注意的细节
- response获得的流OutputStream不需要手动关闭,Tomcat容器会帮助我们关闭
但是InputStream需要手动关闭 - getWriter和getOutputStream不能同时调用
3. servletContext
3.1 servletContext概述
ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象
3.2 servletContext作用
- 是一个域对象
- 可以读取全局配置参数
- 可以搜索当前工程目录下面的资源文件
- 可以获取当前工程名字(了解)
servletContext是一个域对象
- 域对象是服务器在内存上创建的存储空间,用于在不同动态资源(servlet)之间传递与共享数据
- 凡是域对象都有如下3个方法:
-
- setAttribute(name,value);name是String类型,value是Object类型;
往域对象里面添加数据,添加时以key-value形式添加
- setAttribute(name,value);name是String类型,value是Object类型;
-
- getAttribute(name);
根据指定的key读取域对象里面的数据
- getAttribute(name);
-
- removeAttribute(name);
根据指定的key从域对象里面删除数据
- removeAttribute(name);
servletContext存储数据特点
- 全局共享,里面的数据所有动态资源都可以写入和获取
- 服务器启动的时候创建,服务器关闭的时候销毁,因为这是全局应用程序对象,全局共享对象
3.2.1 可以读取全局配置参数
servletContext读取全局参数核心方法
- getServletContext().getInitParameter(name);
根据指定的参数名获取参数值 - getServletContext().getInitParameterNames();
获取所有参数名称列表
实现步骤
- 在web.xml中配置全局参数
<!-- 全局配置参数,因为不属于任何一个servlet,但是所有的servlet都可以通过servletContext读取这个数据 -->
<context-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</context-param>
<context-param>
<param-name>param2</param-name>
<param-value>value2</param-value>
</context-param>
- 在动态资源servlet里面使用servletcontext读取全局参数代码
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//使用servletContext读取全局配置参数数据
//核心方法
/*getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
getServletContext().getInitParameterNames();//获取所有参数名称列表*/ //打印所有参数
//1.先获取所有全局配置参数名称
Enumeration<String> enumeration = getServletContext().getInitParameterNames();
//2.遍历迭代器
while(enumeration.hasMoreElements()){
//获取每个元素的参数名字
String parameName = enumeration.nextElement(); //根据参数名字获取参数值
String parameValue = getServletContext().getInitParameter(parameName); //打印
System.out.println(parameName+"="+parameValue);
}
}
3.2.2 可以搜索当前工程目录下面的资源文件
核心方法
- getServletContext().getRealPath(path)
根据相对路径获取服务器上资源的绝对路径 - getServletContext().getResourceAsStream(path)
根据相对路径获取服务器上资源的输入字节流
3.2.3 可以获取当前工程名字
核心方法
- getServletContext().getContextPath()
作用:获取当前工程名字