Servlet类讲解(九)

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");

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容