Http与HttpServelRequest,HttpServletResponse
什么是HTTP协议
什么是协议? 协议是双方或多方相互之间约定好,大家都需要遵守的规则。叫协议。 什么是HTTP协议? HTTP协议是客户端和服务器之间通信时数据都需要遵守的规则。 HTTP协议,也包含是通信的数据内容。 客户端和服务器之间数据通信的内容,也叫报文。
请求的HTTP协议格式
i.GET请求 1、请求行 (1)请求的方式 ====>>>> GET (2)请求的资源地址 ====>>>> 请求的资源地址(+?+请求参数) (3)请求的协议和版本号 ===>>>> HTTP/1.1 2、请求头 (1)key : value 不同的key有不同的作用
POST请求
1、请求行 1、请求的方式 ====>>>> POST 2、请求的资源地址 ====>>>> 请求的资源地址 3、请求的协议和版本号 ===>>>> HTTP/1.1 2、请求头 1、key : value 不同的key有不同的作用 请求头和请求体之间有一个空行 3、请求体
常用请求头的说明
Accept: 客户端可以接收的数据类型 Accept-Language: 客户端可以接收的语言 Host: 请求的服务器IP和端口号 User-Agent: 浏览器的信息 Content-Length: 请求体的长度 Accept-Encoding: 服务器返回的数据,支持的压缩格式(或编码格式)
哪些是GET请求,哪些是POST请求
GET请求: 1、在浏览器地址栏中输入请求地址,然后敲回车 2、a标签 3、script标签引入js文件 4、link标签引入css文件 5、img标签引入图片 6、iframe标签引入页面 7、form标签 method=GET POST请求: form标签 method=POST
响应的HTTP协议格式
1、响应行 (1)响应的协议和版本号 HTTP/1.1 (2)响应状态码 200 (3)响应状态描述符 OK 2、响应头 (1)空行 3、响应体
a) 常用的响应码说明
200 表示请求成功 302 表示请求重定向 404 表示服务器已经收到你的请求,但是你请求的资源不存在 500 表示服务器已经收到你的请求,但是服务器内部错误(代码)
1.HttpServletRequest类
HttpServletRequest类有什么作用
HttpServletRequest类它表示所有请求过来的信息。每次只要有请求进来。Tomcat服务器都会把请求里的内容封装到HttpServletReqeust对象中,然后传递给Servlet程序去使用。
HttpServletRequest对象实例,由Tomcat服务器在每次请求进来的时候负责创建。
a) HttpServletRequest类的常用方法
request.getRequestURI() 获取请求的URI地址 请求的资源地址 request.getRequestURL() 获取请求的统一资源定位符 请求的绝对路径
request.getRemoteHost() 获取客户端的ip request.getHeader() 获取请求头 request.getParameter() 获取请求的参数值 request.getParameterValues() 获取请求的参数值==多个值 request.getMethod() 获取请求的方式 request.setAttribute(key, value); 保存域数据 request.getAttribute(key); 获取域数据 request.getRequestDispatcher() 获取请求转发对象 ========================后面的内容================================= request.getCookies() 获取Cookie信息 request.getSession() 获取会话信息
常用API介绍:
public class RequestAPI extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // i.getRequestURI() 获取请求的URI地址 请求的资源地址 System.out.println( "请求的资源地址:" + request.getRequestURI() ); // ii.getRequestURL() 获取请求的统一资源定位符 请求的绝对路径 System.out.println("请求的资源绝对路径:" + request.getRequestURL()); // iii.getRemoteHost() 获取客户端的ip /** * 如果请求地址是localhost ====客户端是>>>0:0:0:0:0:0:0:1<br/> * 如果请求地址是127.0.0.1 ====客户端是>>>127.0.0.1<br/> * 如果请求地址是:你真正的ip(或域名) ====客户端是>>>真实的客户端ip地址<br/> */ System.out.println( "客户端的ip地址:" + request.getRemoteHost() ); // iv.getHeader() 获取请求头 System.out.println( "浏览器信息:" + request.getHeader("User-Agent") ); System.out.println( "Host:" + request.getHeader("Host") ); // getMethod() 获取请求的方式 System.out.println( "请求的方式:" + request.getMethod() ); } }
如何获取请求参数
表单:
<form action="http://localhost:8080/day07/getParameterServlet" method="get"> 用户名:<input type="text" name="username"/><br/> 密码:<input type="password" name="password"/><br/> 兴趣爱好: <input type="checkbox" name="hobby" value="cpp" />C++ <input type="checkbox" name="hobby" value="java" />java <input type="checkbox" name="hobby" value="js" />javaScript <br/> <input type="submit" /> </form>
服务器代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 用户名 String username = request.getParameter("username"); // 密码 String password = request.getParameter("password"); String[] hobby = request.getParameterValues("hobby"); System.out.println("用户名:" + username); System.out.println("密码:" + password); System.out.println("兴趣爱好:" + Arrays.asList(hobby)); }
a) GET请求的中文乱码解决
解决GET请求中文乱码第一种方案:
* 1、先以字符集iso-8859-1进行编码<br/>
* 2、以字符集UTF-8进行解码操作<br/>
// 用户名 String username = request.getParameter("username"); /** * 1、先以字符集iso-8859-1进行编码<br/> * 2、以字符集UTF-8进行解码操作<br/> */ username = new String (username.getBytes("iso-8859-1"),"UTF-8" ); System.out.println( username );
解决GET请求中文乱码第二种方案:
找到你Eclipse中的Tomcat的配置文件server.xml,找到Connector标签,添加URIEncoding=”UTF-8” 属性
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
a) POST请求的中文乱码解决
POST请求中文乱码解决方案一(不推荐使用):
* 1、先以字符集iso-8859-1进行编码<br/>
* 2、以字符集UTF-8进行解码操作<br/>
POST请求中文乱码解决方案二(推荐使用):
// 设置请求体的字符集,解决post请求中文知码 // setCharacterEncoding方法一定要在getParameter之前调用才能生效 request.setCharacterEncoding("UTF-8");
a) 请求的转发(在jsp之后显示如何具体使用)
请求的转发,是指,从一个动态资源,跳转到另一个资源的行为。叫转发。
a) base标签的作用
a) Web中的相对路径和绝对路径
回顾JavaSE的路径: 相对路径: 从工程名开始算 绝对路径: 盘符:\文件名 JavaSE的路径,不能在html页面中使用。 Web的路径是: 相对路径: . 当前目录 .. 上一级目录 资源名 ./资源名 ./可以省略 绝对路径: http://ip:port/工程名/资源名 1、在实际开发中,不允许简单的使用相对路径进行开发 2、在实际开发中,都必须使用绝对路径。 http://ip:port/工程名/资源名 base标签+相对路径 斜杠打头的地址
web中/斜杠的不同意义
在web中 /斜杠 就是绝对路径。 /斜杠 被html浏览器解析的时候,地址是:http://ip:port/ /斜杠 如果在服务器代码中被解析。则得到的地址是:http://ip:port/工程名/ 比如说: web.xml 配置文件: <url-pattern>/errorServlet</url-pattern> servletContext.getRealPath(“/”); 也表示到http://ip:port/工程名/ 映射到代码的WebContent目录 request.getRequestDisapcher(“/servlet2”); 也表示到http://ip:port/工程名/ 映射到代码的WebContent目录 注意: 特殊情况是: response.sendRedirect(“/”); 表示:http://ip:port/
1.HttpServletResponse类
a) HttpServletResponse类的作用
HttpServletResponse类表示所有响应的信息。通过这个类,我们可以设置返回给客户端的信息。
两个输出流的说明
字符流 response.getWriter(); 常用
字节流 response.getOutputStream(); 少用(下载)
这两个流,只能同时使用一个。使用了字节流,就不能使用字符流。反之亦然。
两个流,同时只能使用一个。
a) 如何往客户端回传数据
要求往客户端回传字符串。hello。
// 先获取字符流 PrintWriter writer = response.getWriter(); // print方法往客户端输出数据 writer.print("hello");
响应的乱码解决
// 同时设置客户端和服务器都统一使用UTF-8字符集,还设置了响应头 // 此方法一定要在获取流之前调用 才有效 response.setContentType("text/html; charset=UTF-8");
a) 如何设置响应头和响应状态码
请求重定向,是指从一次请求结果,获取信息,再请求到另一个资源。这种行为叫请求重定向
// 设置响应状态码 response.setStatus(302); // 设置响应头 response.setHeader("Location", "http://localhost:8080/day07/response2");
a) 请求重定向
// 设置请求重定向 response.sendRedirect("http://www.baidu.com");
1.请求转发和重定向的对比
|
转发 |
重定向 |
浏览器地址栏 |
没有变化 |
有变化 |
几次请求 |
1次请求 |
2次请求 |
API |
request |
response |
WEB-INF |
可以访问WEB-INF下的资源 |
不能访问WEB-INF下的资源 |
共享request请求域数据 |
可以 |
不可以 |
目标资源 |
只能访问当前工程以内的资源 |
可以访问工程外的资源 |
1、看需求 (1)我要访问WEB-INF里面的内容 === 请求转发 (2)我要访问http://www.baidu.com === 请求重定向 2、在请求转发和请求重定向都可以跳转的情况下 (1)优先使用请求转发 (因为快 , SpringMVC底层默认也是使用请求转发) (2)请求转发出bug,再排查,不行,再使用重定向。 (3)跳到首页(一般使用重定向,注销功能)
.