*.ServletConfig接口

ServletConfig:代表当前Servlet在web.xml中的配置信息

1.ServletConfig的四个方法

  • String getServletName() — 获取当前Servlet在web.xml中配置的名字
  • String getInitParameter(String name) — 获取当前Servlet指定名称的初始化参数的值
  • Enumeration getInitParameterNames() — 获取当前Servlet所有初始化参数的名字组成的枚举
  • ServletContext getServletContext() — 获取代表当前web应用的ServletContext对象

    2.ServletConfig的作用(3个)

  • 获取当前Servlet在web.xml中配置的名字

  • 获取当前Servlet指定名称的初始化参数的值
  • 获取代表当前web应用的ServletContext对象

    3.初始化参数的设置

    在web.xml里的标签里使用设置 ```xml

ServletTest01 com.ahpu.java.ServletTest01 username root password root

  1. <a name="aS0dB"></a>
  2. ## *.ServletContext接口
  3. **ServletContext是什么?**
  4. 1、ServletContext 是一个接口,它表示 Servlet 上下文对象 <br />2、一个 web 工程,只有一个 ServletContext 对象实例。 <br />3、ServletContext 对象是一个域对象(对象数据操作的范围)。 <br />4、ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁
  5. <a name="b6z72"></a>
  6. ### 1.ServletContext 类的四个作用
  7. 1、获取 web.xml 中配置的上下文参数 context-param (getInitParameter())<br />2、获取当前的工程路径,格式: /工程路径 (context.getContextPath())<br />3、获取工程部署后在服务器硬盘上的绝对路径 (getRealPath(String path))<br />4、像 Map 一样存取数据(setAttribute(String key,Object value))(Servlet的通信)
  8. <a name="HSVMk"></a>
  9. ### 2.ServletContext常用的方法
  10. <a name="grBJR"></a>
  11. #### (1)(域对象)属性相关的方法(4个)
  12. 设置和获得ServletContext的Attribute属性,这个属性是全工程的servlet共用的。<br />1)设置属性setAttribute(String key,Object value)<br />2)获得属性getAttribute()<br />3)removeAttribute(String name)<br />4)getAttributeNames()
  13. ```java
  14. //设置属性名称
  15. //设置属性setAttribute()
  16. context.setAttribute("attribute01","servletContext的attribute01");
  17. //获得属性getAttribute()
  18. String contextStr = (String)context.getAttribute("attribute01");
  19. Object attribute = context.getAttribute("javax.servlet.context.tempdir");
  20. //删除一个removeAttribute(String name)
  21. context.removeAttribute(String name)
  22. //获得所属性的名称getAttributeNames()
  23. context.setAttribute("attribute02","servletContext的attribute02");
  24. Enumeration<String> attributeNames = context.getAttributeNames();
  25. //结果输出
  26. System.out.println("属性:"+contextStr);
  27. while (attributeNames.hasMoreElements()){
  28. System.out.println("属性名称:"+attributeNames.nextElement());
  29. }
  30. 执行结果:
  31. 属性:servletContext的attribute01
  32. 属性名称:javax.servlet.context.tempdir
  33. 属性名称:org.apache.catalina.resources
  34. 属性名称:org.apache.tomcat.util.scan.MergedWebXml
  35. 属性名称:org.apache.tomcat.InstanceManager
  36. 属性名称:org.apache.catalina.jsp_classpath
  37. 属性名称:attribute02
  38. 属性名称:attribute01
  39. 属性名称:javax.websocket.server.ServerContainer
  40. 属性名称:org.apache.jasper.compiler.ELInterpreter
  41. 属性名称:org.apache.jasper.compiler.TldCache
  42. 属性名称:org.apache.tomcat.JarScanner
  43. 属性名称:org.apache.jasper.runtime.JspApplicationContextImpl

(2)初始化参数方法

获得在web.xml里配置的context初始化参数信息
1)getInitParameter(String key)

  1. /*
  2. 设置servletContext的初始化参数
  3. <context-param>
  4. <param-name>context</param-name>
  5. <param-value>initContext</param-value>
  6. </context-param>
  7. */
  8. //设置初始化参数(需要在ServletContext初始化前使用)
  9. //context.setInitParameter("contextStr", "contextStr");
  10. //获得初始化参数getInitParameter()
  11. String InitParameter = context.getInitParameter("context");
  12. //获取所有初始化参数的名称getInitParameterNames()
  13. Enumeration<String> initParameterNames = context.getInitParameterNames();
  14. //结果输出
  15. System.out.println("获取初始化参数值:"+I
  16. getContext(String uripath)nitParameter);
  17. while (initParameterNames.hasMoreElements()){
  18. System.out.println("获取初始化参数的名称:"+initParameterNames.nextElement());
  19. }
  20. 执行结果:
  21. 获取初始化参数值:initContext
  22. 获取初始化参数的名称:context
  23. 获取初始化参数的名称:context2

(3)getContext(String uripath)

返回ServletContext对应于服务器上指定 URL的对象。根绝uriPath可以获得服务器布置的所有ServletContext对象

(4) getRequestDispatcher(String path)

返回一个RequestDispatcher对象,该对象充当位于给定路径的资源的包装器。可以转发请求

(5)getServletContextName()

返回与此 ServletContext 相对应的此 Web 应用程序的名称,该名称由 display-name 元素在此 Web 应用程序的部署描述符中指定。

(6) getRealPath(String path)

获取与给定虚拟路径对应 的真实路径。

*.HttpServletRequest 类

1.HttpServletRequest 类的作用

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的 信息。

2.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() 获取请求转发对象

3.请求的中文乱码解决

(1)doGet 请求的中文乱码解决

  1. // 获取请求参数
  2. String username = req.getParameter("username");
  3. //1 先以 iso8859-1 进行编码
  4. //2 再以 utf-8 进行解码
  5. username = new String(username.getBytes("iso-8859-1"), "UTF-8");

(2)POST 请求的中文乱码解决

  1. // 设置请求体的字符集为 UTF-8,从而解决 post 请求的中文乱码问题
  2. //需要在参数获取之前设置,才由效
  3. req.setCharacterEncoding("UTF-8");

4.请求的转发

什么是请求的转发?
请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。
image.png
代码:

  1. //获得调度器
  2. RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
  3. //前往调取器里的调度地址
  4. requestDispatcher.forward(req,resp);

5.base 标签的作用

给相对路径地址设置一个路径参考点,如果没设置此标签,则相对路径参考浏览器里的路径地址。

  1. <!DOCTYPE html> <html lang="zh_CN">
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>Title</title>
  5. <!--base 标签设置页面相对路径工作时参照的地址 href 属性就是参数的地址值 -->
  6. <base href="http://localhost:8080/07_servlet/a/b/">
  7. </head>
  8. <body>
  9. 这是 a 下的 b 下的 c.html 页面<br/> <a href="../../index.html">跳回首页</a><br/>
  10. </body>
  11. </html>

6.Web 中的相对路径和绝对路径

在 javaWeb 中,路径分为相对路径和绝对路径两种:
相对路径是:
. 表示当前目录
.. 表示上一级目录
资源名 表示上一级目录 资源名

绝对路径:
http://ip:port/工程路径/资源路径

在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。
1、绝对路径
2、base+相对

7.web 中 / 斜杠的不同意义

在 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/

*.HttpServletResponse 类

1.HttpServletResponse 类的作用

HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序的service发放区使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息, 我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置,封装到HttpServletResponse 对象中,经web容器解析成htto信息发给浏览器,让浏览器解析HTTP 协议信息,再展现出来。

2.两个输出流的说明

字节流 getOutputStream() 常用于下载(传递二进制数据)
字符流 getWriter() 常用于回传字符串(常用)

两个流同时只能使用一个。
使用了字节流,就不能再使用字符流,反之亦然,否则就会报错

3.响应的乱码解决

需要在获得输出流之前,设置编码集才能生效。

(1)分别设置服务器、浏览器的编码集

  1. // 设置服务器字符集为 UTF-8
  2. resp.setCharacterEncoding("UTF-8");
  3. // 通过响应头,设置浏览器也使用 UTF-8 字符集
  4. resp.setHeader("Content-Type", "text/html; charset=UTF-8");

(2)同时设置服务器、浏览器的编码集(推荐)

  1. // 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
  2. // 此方法一定要在获取流对象之前调用才有效
  3. resp.setContentType("text/html; charset=UTF-8");

4.请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求
重定向(因为之前的地址可能已经被废弃)。
image.png

(1)请求重定向的第一种方案:

  1. // 设置响应状态码 302 ,表示重定向,(已搬迁)
  2. resp.setStatus(302);
  3. // 设置响应头,说明 新的地址在哪里
  4. resp.setHeader("Location", "http://localhost:8080");

(2)请求重定向的第二种方案(推荐使用):

  1. resp.sendRedirect("http://localhost:8080");