Servlet-2
Posted rttrti
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet-2相关的知识,希望对你有一定的参考价值。
1.HttpServletRequest类
a.HttpServletRequest类的作用
- 每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。
- 然后传递到service方法(doGet,doPost)中给我们使用。我们可以通过该类对象,获取到所有请求信息。
b.HttpServletRequest类的常用方法
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的ip地址
- getHeader() 获取请求头
- getParameter() 获取请求的参数
- getParameterValues() 获取请求的参数(多个值时使用)
- getMethod() 获取请求方式(get/post)
- SetAttribute(key, value) 设置域数据
- getAttribute(key) 获取域数据
- getRequestDispatcher() 获取请求转发对象
c.获取请求参数
设置表单:
获取参数:
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");
System.out.println(username);
System.out.println(password);
System.out.println(Arrays.asList(hobby));
注:若需通过post获取输入中文字符需设置req.setCharacterEncoding("UTF-8");
且需将其设置在所有getParameter之前
d.请求的转发
- 请求转发是指服务器收到请求后,从一个资源跳转到另一个资源的操作。
通过servlet1,2模拟请求转发过程
servlet1:
//获取请求参数
String username = req.getParameter("username");
System.out.println("servlet1查看参数: " + username);
//盖章
req.setAttribute("key", "done");
//问路
//请求转发必须要以/打头,/表示地址为http://ip:port/工程名/,映射到IDEA代码的web目录
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//走向柜台2
requestDispatcher.forward(req,resp);
servlet2:
//获取请求参数
String username = req.getParameter("username");
System.out.println("servlet2查看参数: " + username);
//查看柜台1是否有盖章
Object key = req.getAttribute("key");
System.out.println("柜台1是否有章: " + key);
//处理自己的业务
System.out.println("Servlet2处理自己的业务");
请求转发的特点:
- 浏览器地址栏没有变化
- 他们是依次请求
- 他们共享Request域中的数据
- 可以转发到WEB_INF目录下(可以通过请求转发访问WEB_INF)
- 不可以访问工程以外的资源(都是基于当前工程下的地址访问)
- 请求转发必须要以/打头,/表示地址为http://ip:port/工程名/,映射到IDEA代码的web目录
e.base标签的作用
(通过请求转发来进行深层跳转时无法返回浅层页面)
- base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。(设置页面相对路径工作时参考的地址)
用法:在head中设置base:
<base href="http://localhost:8080//web_02_war_exploded/a/b/c.html">
f.web中的相对路径和绝对路径
- 相对路径: . 表示当前目录;.. 表示上一级目录;资源名 表示当前目录/资源名
- 绝对路径: http://ip:port/工程路径/资源路径
h.web中/的不同意义
- web中\'/\'为一种绝对路径。
- \'/\'若被浏览器解析,得到的地址是: http://ip:port/
- \'/\'若被服务器解析,得到的地址是: http://ip:port/工程路径
- 特殊情况(请求重定向):respose.sendRediect("/"); 表示把\'/\'发送给浏览器解析,得到http://ip:port/
2.HttpServletResponse类
a.HttpServletResponse类的作用
- 与HttpServletResquest类一样,每次请求进来,Tomcat服务器就会创建一个Response对象传递给Sertvlet程序去使用。
- HttpServletRequest表示请求过来的信息。
- HttpServletResponse表示所有相应的信息。
- 若需要设置返回给客户端的信息,都可以通过Response对象来进行设置。
b.两个输出流的声明(通过流传送给客户端)
- 字节流: getOutPutStream(); 常用于下载(传递二进制数据)
- 字符流 getWriter(); 常用于回传字符串(常用)
- 两个流同时只能使用一个。(使用了字节流就不能再使用字符流,反之亦然)
c.如何向客户端回传数据(回传字符串数据)
PrintWriter writer = resp.getWriter();
writer.println("response\'s content!!");
d.解决相应中文乱码
方案一:
-
设置服务器字符集为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");
e.请求重定向
方案一
- 请求重定向指客户端给服务器发请求,然后服务器告诉客户端一个新地址,使其访问新地址(之前地址可能被废弃/停用)。
用法:
//设置响应状态码为302表示重定向(已搬迁)
resp.setStatus(302);
//设置响应头,说明新得地址在哪里
resp.setHeader("Location", "http://localhost:8080//web_02_war_exploded/response2");
- 地址栏会发生变化
- 两次请求
- 不共享Request域中的数据(两次Response两次请求)
- 不可以访问WEB-INF下的资源(两次请求均为浏览器发送服务器)
- 可以访问工程外的资源
方案二(推荐使用)
(302是固定的)一行搞腚: resp.sendRedirect("http://www.baidu.com");
以上是关于Servlet-2的主要内容,如果未能解决你的问题,请参考以下文章