HttpServletRequest
HttpServletRequest 对象代表客户端的请求,客户端的所有消息都封装在这个对象中,通过这个方法可以获取请求数据
作用:
- 读取和写入HTTP请求数据
- 取得和设置Cookies
- 取得路径信息
- 标识HTTP信息
- 实现请求转发
HttpServletResponse
HttpServletRequest 对象代表服务端提供给客户端的响应,封装了HTTP响应数据
作用:
- 设置对客户端的输出内容
- 设置响应的状态码
- 设置浏览器的解码方式
- 设置Cookies
- 实现重定向
处理请求参数
例如:key-value、key-values
public ModelAndView getIps(HttpServletRequest request) {
String currPageStr = request.getParameter("page");
String values[] = request.getParameterValues("name");
}
请求方式
请求方式 | 作用 |
---|---|
GET | 请求指定资源 |
POST | 向指定的资源提交需要处理的数据 |
HEAD | 要求相应于相应的get一样,只是没有响应体 |
PUT | 上传指定资源 |
DELETE | 删除指定资源 |
请求方式是用户请求的意向,利于服务器做出不同的响应,因为不同请求方式:
- 数据传输可能不同
- 表单提交、服务端处理可能不同
- 浏览器会用不同处理缓存方式等
GET 与 POST
GET:
- 直接将请求资源放在资源路径的后面,只能提交少量数据
- 请求参数显示在浏览器地址栏上,不安全
POST:
- 提交需要处理的数据,可以导致新资源的产生和已有资源的更新
- 请求参数添加在实体内容中,可提交大量数据
- 不会将请求参数显示在浏览器地址栏,相对安全
处理中文参数
须统一设置为UTF-8,编码和解码不一致会产生乱码
请求方式为POST
- step1 页面指定字符集
JSP页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
html页面:
<meta charset="UTF-8">
- step2 服务器端编码
try { request.setCharacterEncoding("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
请求方式为GET
- step1 页面与post方式相同
- step2 服务端
//iso-8859-1 转为 utf-8
String currPageStr = request.getParameter("page");
try {
currPageStr = new String(currPageStr.getBytes("iso-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
处理返回中文
服务端:
response.setContentType("text/html;charset=utf-8");
- 通知容器,使用指定字符集
- 生成消息头中content-type的值,通知浏览器返回的数据类型和字符集
Springmvc 编码过滤器
- web.xml中可能需要编码过滤器
<!-- 编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其bean实现:
CharacterEncodingFilter.doFilterInternal(HttpServletRequest request...){
//核心,为每次请求都设置所配置的字符集
request.setCharacterEncoding(this.encoding);
}
其他编码问题
- 数据库连接池,我这里是mysql: useUnicode=true&characterEncoding=utf-8
data_source_url=jdbc:mysql://localhost:3306/just_test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowMultiQueries=true
- 数据库编码查看
mysql> show variables like 'character_set_%'; +--------------------------+--------------------------------------+
| Variable_name | Value | +--------------------------+--------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:\baseRuntime\mysql\share\charsets\ | +--------------------------+--------------------------------------+
8 rows in set (0.00 sec)
- 设置,如
mysql> SET character_set_client='utf-8';
mysql> SET character_set_connection='utf-8'
mysql> SET character_set_results='utf-8'