Servlet-处理HTTP请求与响应

来源:互联网 发布:涟源行知中学校花图片 编辑:程序博客网 时间:2024/06/05 13:00

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-8String 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'
0 0