1.Servlet类的继承体系
2.ServletConfig类(servlet的一个属性)
Servlet程序的配置信息类,Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象。(这个属性在servlet的init函数里面创建并赋值,然后在Servlet的方法里可以引用)
作用:
1、可以获取 Servlet 程序的别名 servlet-name 的值 (servletConfig.getServletName()))
2、获取初始化参数 init-param(servletConfig.getInitParameter("username"))init-param在xml的servlet配置标签中
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
3、获取 ServletContext 对象(servletConfig.getServletContext())
注意:
重写init方法的话要记得super.init(config)
3.ServletContext类(通过ServletConfig获取)
ServletContext 是一个接口,它表示 Servlet 上下文对象,而一个 web 工程,只有一个 ServletContext 对象实例(然而一个servlet有一个ServletConfig实例),ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁。ServletContext 对象是一个域对象(也就是说它想map一样可以存取数据,范围是整个web工程)。
域对象 setAttribute() 存 getAttribute() 取 removeAttribute() 删
作用:
1、获取 web.xml 中配置的上下文参数 context-param(这个是整个web工程的servlet都可以用的参数)
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
2、获取当前的工程路径,格式: /工程路径
context.getContextPath() 当前工程路径
3、获取工程部署后在服务器硬盘上的绝对路径
/ 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录
context.getRealPath("/") 工程部署路径(就到该项目目录下)
context.getRealPath("/css") 工程下 css 目录的绝对路径是
4、像 Map 一样存取数据
用setAttribute() 存 getAttribute() 取 removeAttribute() 删,这个可以使得两个servlet程序相互通信。
4.HttpServletRequest 类
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
常用方法:
i. getRequestURI() 获取请求的资源路径
ii. getRequestURL() 获取请求的统一资源定位符(绝对路径)
iii.
getRemoteHost() 获取客户端的 ip 地址
iv. getHeader() 获取请求头
v. getParameter() 获取请求的参数
vi. getParameterValues() 获取请求的参数(多个值的时候使用)
vii. getMethod() 获取请求的方式 GET 或 POST
viii. setAttribute(key, value); 设置域数据
ix. getAttribute(key); 获取域数据
x. getRequestDispatcher() 获取请求转发对象
请求转发的特点:(请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录)
1.是一次请求(url不变)
2.共享request域数据
3.可以转发到WEB-INF中,不可以访问工程以外的资源
<!--base 标签设置页面相对路径工作时参照的地址
href 属性就是参数的地址值
-->
<base href="http://localhost:8080/07_servlet/a/b/">
在 web 中 / 斜杠 是一种绝对路径。
/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
<a href="/">斜杠</a>
/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
1、<url-pattern>/servlet1</url-pattern>
2、servletContext.getRealPath(“/”);
3、request.getRequestDispatcher(“/”);
特殊情况: response.sendRediect(“/”);
把斜杠发送给浏览器解析。得到 http://ip:port/ 这个是请求重定向:
1.是两次请求(浏览器地址栏会变)
2.不能访问WEB-INF,可以访问工程外资源
3.不共享request域数据
还可以:(不过一下方法不推荐)
// 设置响应状态码 302 ,表示重定向,(已搬迁) resp.setStatus(302); // 设置响应头,说明 新的地址在哪里 resp.setHeader("Location", "http://localhost:8080");
5.HttpServletResponse 类
两个输出流的说明:
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个。使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
PrintWriter writer = resp.getWriter();
writer.write("response's content!!!");
解决乱码问题:
解决响应中文乱码方案一(不推荐使用):
// 设置服务器字符集为 UTF-8
resp.setCharacterEncoding("UTF-8");
// 通过响应头,设置浏览器也使用 UTF-8 字符集
resp.setHeader("Content-Type", "text/html; charset=UTF-8");
解决响应中文乱码方案二(推荐):
// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效
resp.setContentType("text/html; charset=UTF-8");