100_JavaWeb_Servlet3_HttpServletRequest_HttpServletResponse
HttpServletRequest 类作用
Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中然后传递到 service 方法(doGet 和 doPost),
可以通过 HttpServletRequest 对象,获取到所有请求的信息
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() 获取请求转发对象
public class HttpServletRequestTest1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// i.getRequestURI() 获取请求的资源路径
System.out.println(request.getRequestURI()); //TomcatTest2/httpservletrequesttest1
// ii.getRequestURL() 获取请求的统一资源定位符(绝对路径)
System.out.println(request.getRequestURL()); //http://localhost:8080/TomcatTest2/httpservletrequesttest1
// iv.getHeader() 获取请求头
System.out.println(request.getHeader("User-agent"));
// vii.getMethod() 获取请求的方式GET或POST
System.out.println(request.getMethod());
// iii.getRemoteHost() 获取客户端的ip地址
System.out.println(request.getRemoteHost());
/**
* 在IDEA中,使用localhost访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
* 在IDEA中,使用127.0.0.1访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
* 在IDEA中,使用 真实ip 访问时,得到的客户端 ip 地址是 ===>>> 真实的客户端 ip 地址<br/>
*/
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题
// 也要在获取请求参数之前调用才有效
request.setCharacterEncoding("UTF-8");
System.out.println("-------------doPost------------");
// 获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobbies = request.getParameterValues("hobby");
System.out.println(username); // 用户名
System.out.println(password); // 密码
System.out.println(Arrays.asList(hobbies)); // 选中的选项
}
}
请求的转发 : 服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发
特点:
1 浏览器地址没有变化
2 他们是一次请求,共享Request域中的数据
3 可以转发到 WEB-INFO目录下,但是不能转发到工程以外的资源 (公网网站 NG)
public class Servlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设定字符集
request.setCharacterEncoding("UTF-8");
// 1 获取请求参数
String username = request.getParameter("username");
System.out.println("servlet1 的请求参数: " + username);
// 2 打个标记
request.setAttribute("key_servlet1", "alex");
// 3 转发地址
// RequestDispatcher requestDispatcher = req.getRequestDispatcher("/WEB-INF/form2.html"); // 浏览器不能直接访问,请求转发可以访问
// RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.baidu.com"); 只能在工程内转发
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");
// 4 转发
requestDispatcher.forward(request, response);
}
}
public class Servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1 查看请求参数
String username = request.getParameter("username");
System.out.println("servlet2 的请求参数: " + username);
// 2 查看 request 标记
System.out.println(request.getAttribute("key_servlet1"));
// 3 处理自身业务
System.out.println("servlet2 自身业务");
}
}
base 标签的作用 可以设置当前页面所有相对路径工作时,参照哪个路径进行跳转
<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--base标签设置页面相对路径工作时参照的地址
href 属性就是参数的地址值
-->
<base href="http://localhost:8080/07_servlet/a/b/"> <!-- 如果有base标签浏览器会忽略掉当前浏览器地址, 同时资源名可以省略 -->
</head>
<body>
这是a下的b下的c.html页面<br/>
<a href="../../index.html">跳回首页</a><br/>
</body>
</html>
在javaWeb中,路径分为相对路径和绝对路径两种:
相对路径是:
. 表示当前目录
.. 表示上一级目录
资源名 表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资源路径
web 中 / 是一种绝对路径;有不同意义
/ 斜杠 如果被浏览器解析,得到的地址是:http://ip:port/
<a href="/"> 斜杠 </a>
/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
<url-pattern>/servlet1</url-pattern>
servletContext.getRealPath(“/”);
request.getRequestDispatcher(“/”);
特殊情况重定向: response.sendRediect(“/”); 把斜杠发送给浏览器解析,得到 http://ip:port
HttpServletResponse 类
a)HttpServletResponse 类的作用
HttpServletResponse类同HttpServletRequest 类,每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet程序去使用。
HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,
设置返回给客户端的信息,都可以通过 HttpServletResponse对象来进行设置
b)两个输出流的说明。
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个,使用了字节流,就不能再使用字符流,反之亦然,否则就会报错
public class Servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// System.out.println( resp.getCharacterEncoding() );//默认ISO-8859-1
// 1 通过响应头,设置浏览器也使用UTF-8字符集
response.setHeader("Content-Type", "text/html; charset=UTF-8");
// 2 通过 setContentType 设置服务器和客户端都使用UTF-8字符集,还设置了响应头 此方法一定要在获取流对象之前调用才有效
response.setContentType("text/html; charset=UTF-8");
//3 回传
PrintWriter writer = response.getWriter(); // 回传字符
// ServletOutputStream outputStream = response.getOutputStream(); // 回传字节
writer.write("alex-sully");
}
}
请求重定向,是指客户端给服务器发请求,然后服务器给新地址。客户端去访问新地址, 叫请求重定向(之前的地址可能已经被废弃)
请求重定向的特点:
1 浏览器地址栏会发生变化
2 两次请求,不能共享request域中的数据
3 不能访问WEB-INFO下的资源,可以访问工程外的资源
请求重定向方案
// 1 设置响应状态码 302 ,表示重定向,(已搬迁)
resp.setStatus(302);
// 设置响应头,说明 新的地址在哪里
resp.setHeader("Location", "http://localhost:8080")
//2 请求重定向的第二种方案(推荐使用):
resp.sendRedirect("http://localhost:8080")
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("曾到此一游 Response1 ");
req.setAttribute("key1", "value1");
// 设置响应状态码302 ,表示重定向,(已搬迁)
// resp.setStatus(302);
// 设置响应头,说明 新的地址在哪里
// resp.setHeader("Location", "http://localhost:8080/07_servlet/response2");
// resp.setHeader("Location", "http://localhost:8080");
resp.sendRedirect("http://localhost:8080");
}
- 点赞
- 收藏
- 关注作者
评论(0)