ServletContext官方叫servlet上下文,是一个接口。服务器启动的时候创建,服务器关闭的时候销毁,启动时候会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。
通过servlet中的init方法中的servletConfig对象获取

httpservlet中直接获取ServletContext servletContext = getServletContext();
1. 是一个域对象
域对象是服务器在内存上创建的存储空间,用于在不同动态资源(servlet)之间传递与共享数据,凡是域对象都有如下3个方法
| setAttribute(name,value);name是String类型,value是Object类型; | 往域对象里面添加数据,添加时以key-value形式添加 |
| getAttribute(name); | 根据指定的key读取域对象里面的数据 |
| removeAttribute(name); | 根据指定的key从域对象里面删除数据 |
2. 可以读取全局配置参数
getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
getServletContext().getInitParameterNames();//获取所有参数名称列表
在web.xml中配置全局参数
param1 value1 param2 value2
在动态资源servlet里面使用servletcontext读取全局参数代码
ublic void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//使用servletContext读取全局配置参数数据
//核心方法
/*getServletContext().getInitParameter(name);//根据指定的参数名获取参数值
getServletContext().getInitParameterNames();//获取所有参数名称列表*/
//打印所有参数
//1.先获取所有全局配置参数名称
Enumeration enumeration = getServletContext().getInitParameterNames();
//2.遍历迭代器
while(enumeration.hasMoreElements()){
//获取每个元素的参数名字
String parameName = enumeration.nextElement();
//根据参数名字获取参数值
String parameValue = getServletContext().getInitParameter(parameName);
//打印
System.out.println(parameName+"="+parameValue);
}
}
3. 可以搜索当前工程目录下面的资源文件
getServletContext().getRealPath(path),根据相对路径获取服务器上资源的绝对路径
getServletContext().getResourceAsStream(path),根据相对路径获取服务器上资源的输入字节流
4. 可以获取当前工程名字(了解)
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取工程名字,getServletContext().getContextPath()
response.getOutputStream().write(("工程名字:"+getServletContext().getContextPath()).getBytes());
}
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service()方法中写了根据请求方式的不同调用doget()和dopost().
service方法中的request的类型是ServletRequest,而doGet/doPost方法的request类型HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大
request运行流程


请求行
获得客户端的请求方式---String getMethod()
web应用的名称---String getContextPath()
获取URL---StringBuffer getRequestURL(); 如:http://localhost:8080/request/info
获取URI---String getRequestURI(); 如:/request/info
获得访问的客户端IP地址---request.getRemoteAddr()
获取get请求参数---String getQueryString();
请求头
获取所有请求头名称
//所有请求头名称
Enumeration headerNames = request.getHeaderNames();
//遍历所有请求头
while (headerNames.hasMoreElements()){
//名称
String s = headerNames.nextElement();
//名称对应的值
String requestHeader = request.getHeader(s);
System.out.println(requestHeader);
}
获取此次访问来源referer
String referer= request.getHeader("referer");
只有通过以下方式请求才会获取referer
请求体

转发和重定向

response.setState(Int code)
add是添加新的
addHeader(String name,String value)
addIntHeader(String name,int value)
addDateHeader(String name,date)
set是设置已经存在的
setHeader(String name,String value)
setIntHeader(String name,int value)
setDateHeader(String name,Date value)
response.getWriter().write("hello 测试");
默认情况下写的中文会发生乱码,把写的内容存到缓冲区使用的时ISO8859,而ISO8859不支持中文,所以乱码
//在存之前设置存放的编码
response.setCharacterEncoding("UTF-8");
//然后告知浏览器使用的编码
response.setHeader("Content-Type","text/html;charset=UTF-8");
response.getWriter().write("hello 测试");
注意
上面可以只告知浏览器使用的编码即可,tomcat看到了设置成了utf-8 在存储时也会使用utf-8
或者直接用封装好的方法
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("hello 测试");
注意getWrite()和getOutputSteam不能同时调用
response.setContentType("text/html;charset=UTF-8");
response.getOutputStream().write("hello 测试".getBytes());

servlet1当中没有这个资源,告诉你去找servlet2,再去发送一个请求到servlet2,要访问两次服务器,状态码是302,浏览器地址栏已经发生变化
response.setStatus(302);
response.setHeader("location","/userInfo");
每次都要写状态码,和location比较麻烦,就封装了一个方法
response.sendRedirect("/userInfo");
定时刷新重定向
response.setHeader("refresh","5;url=http://www.baidu.com")
url的值为5秒后要去跳转的地址