HttpServleResponse 接口
介绍
- HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在 servlet-api.jar
- HttpServletResponse接口实现类由Http服务器负责提供
- HttpServletResponse接口主要负责 doGet/doPost 方法执行结果写入到【响应体】中交给浏览器
开发人员习惯将HttpServletResponse接口修饰的对象称为 响应对象
响应对象主要功能
将执行结果以二进制写入到【响应体】中
- 设置响应头中【content-type】属性值,控制浏览器使用对应的编译器,将响应体二进制数据编译为【文字、图片、视频、命令】
- 可以设置响应头的属性 【location】属性,将一个请求地址赋值给我们的location,从而控制浏览器向指定的服务器发送请求
通过doGet方法将响应结果写到响应体
问题1:
综上所述说明了 如果 write() 收到一个数字 会把 数字转换成ascii写入到响应体中String str = "Hello World"; //执行结果
//将执行结果响应到浏览器当中, 响应对象将结果写到响应体
// 通过响应对象(response)的getWrite()拿到输出流
PrintWriter out = response.getWriter();
//通过输出流的write() 把执行结果以二进制的形式写到响应体中
out.write(str);
out.write() // 在执行时,可以将 [字符] [字符串] [ascii] 写入到响应体中
解决方案 : 使用 out.print() 方法把数字写到响应体中(实际开发中常用)
问题2:
JAVA
MySQL
HTML? 问题描述 浏览器将响应的结果中的
也作为文字内容展示出来了 没有当作Html标签命令来执行
- 问题原因:浏览器收到响应包之后,根据响应头的【content-type】属性的值,来采用对应的【编译器】 进行编译
- 在默认的情况下。 content-type的值是“text” 【content-type = “text”】
此时我们的浏览器会采用文本编译器对响应体中的二进制数据进行解析
解决方案
一定要在得到输出流之前,通过响应对象对响应头的content-type 属性进行重新赋值,用于指定浏览器采用正确的编译器进行处理
- response.setContentType(“text/html”); // 意思是告诉浏览器使用text 或者 html编译器
问题3:
“红烧排骨
梅菜肘子
糖醋里脊” 输出到浏览器中为 ??? ??? ???
原因是 :在浏览器解析中文的时候,要靠响应头中的 content-type中的charset值来解析
解决方案:
response.setContentType(“text/html;charset=utf-8”);
或者response.setCharacterEncoding(“UTF-8”);
sendRedirect() 重定向
String str = “http://baidu.com“;
//通过响应对象将地址赋值给我们响应头中的location属性
response.sendRedirect(str);
// 现在的响应头里面 会出现一个location属性
//浏览器在接收到响应包之后,
// 如果发现响应头中存在location属性自动通过地址栏向location指定网站发送请求
使用sendRedirect() 方法可以远程控制浏览器的请求行为
http://baidu.com/?userName=mike (可以加上请求内容)
HttpServletRequest 接口
介绍
- HttpServletRequest接口,在Tomcat中存在 servlet-api.jar
- HttpServletRequest接口实现类由Http服务器提供
- HttpServletRequest接口负责在doGet/doPost() 在运行的时候读取Http请求协议包中的信息
- 开发人员习惯成他的对象为【请求对象】
作用:
- 可以去读取http请求协议包中【请求行】信息
- 可以读取保存在http请求协议包中【请求头】或者【请求体】中请求参数信息
可以去代替浏览器向http服务器申请资源文件调用
request.getRequestURL() // 得到url
返回一个StringBuffer 所以toString()一下
String url = request.getRequestURL().toString();
request.getMethod() //得到Method
request.getRequestURI() // 得到URI
URI : 资源文件精准定位地址,在请求行并没有,实际上是从URL中截取的一个字符串
格式: /网站名/资源文件名
URI的作用: 让http服务器来对被访问的资源文件进行定位通过请求对象 获取请求参数(请求头/请求体)
```java Enumeration
s = request.getParameterNames(); // 蒋所有请求参数名称保存到一个枚举对象当中 while(s.hasMoreElements()){ //类似 迭代 //1.得到参数名称 nextElement(); String para = (String) s.nextElement(); //2.通过请求对象的指定的参数的值获取到 String result = request.getParameter(para); //把请求参数名放进去 System.out.println(“请求参数名称”+para+”:”+result); }
post请求的内容在请求体里面,上面的方法仍然适用<br />请求体使用的是 iso-8859-1 编码 如果有中文 会乱码 所以先通知tomcat更换字符集 **request.setCharsetEncoding("utf-8");**<br />**request.getParameter("username");**
<a name="B1u9t"></a>
## post请求乱码
<a name="6ozAI"></a>
##### 问题:用get方式发送中文内容时得到正常结果,但是post得到的乱码 ?????????
原因:在tomcat9中get方法的使用utf-8进行解码 但是post使用的时ISO-8859-1进行解码(东欧语字符集)
<a name="enIKL"></a>
##### 解决方案
- 在post请求下 在读取请求体之前,通知请求对象去使用utf-8字符集去给请求体中的内容进行重新的解码
- post请求参数保存在请求体中,此时请求对象会对请求体解码【ISO-8859-1】所以会出现乱码
- **resquest.setCharacterEncoding("utf-8");**
<a name="rvjK6"></a>
# <br />请求响应生命周期/辅助知识点
<a name="3IUTu"></a>
## request和response生命周期(对象)
1. 在http服务器接收到浏览器发送的请求协议包之后会自动为当前的请求协议包生成请求对象和响应对象
1. 在http服务器调用doGet()/doPost()方法时,负责将【响应对象】和【请求对象】作为实参传递到方法中
1. doGet()/doPost()方法执行结束表示本次请求处理完毕——>响应协议包里存在响应结果被推送到浏览器
1. http服务器准备推送http相应协议包之前,tomcat负责销毁掉两个对象
1. 【请求对象】【响应对象】生命周期贯穿一个请求的处理过程中
<a name="I4PgH"></a>
##
<a name="s64jz"></a>
## 默认欢迎资源文件
1. 用户可以记住网站名称,但是不会记住网站的资源文件名
1. 这时就需要导航页面(欢迎页面)
1. 当用户向http服务器发送请求,针对某个网站的【默认请求】时,此时由http服务器自动从当前网站返回的资源文件
<a name="30jfS"></a>
### 对比
**正常请求**:http://localhost:8080/myWeb/index/html<br />默认请求: [http://localhost:8080/myWeb/](http://localhost:8080/myWeb/)
<a name="QBZtB"></a>
## tomcat对于默认欢迎资源文件定位规则
```xml
Tomcat——>conf——>web.xml——>最下面
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
把想要当成默认的欢迎资源文件名 改成 index.html
或者 自行设置当前网站的默认欢迎资源文件
规则: 网站/web/WEB-INF/web.xml
在web.xml下面添加
<welcome-file-list>
<welcome-file>User_login.html</welcome-file>
</welcome-file-list>
注意问题
- 如果网站里面设置默认文件定位规则(欢迎界面),那么此时tomact默认的定位规则会失效
- 也可以写动态资源文件,把class的别名复制过来。然后把开头的/ 去掉