一、HTTPServletRequest
这个对象封装了客户端提交过来的一切数据
1、作用
(一)、获取客户端请求头信息
//获取请求头信息,得到枚举集合
Enumeration<String> headerNames = req.getHeaderNames();
//遍历头信息
while(headerNames.hasMoreElements()) {
String name=headerNames.nextElement();
String value=req.getHeader(name);
System.out.println(name+":"+value);
}
(二)、获取客户端提交过来的数据
String name=req.getParameter("username");
String password=req.getParameter("password");
2、获取中文数据时出现乱码
- 如果是GET方式(浏览器一般都对其做了相应处理,所以一般也不会出现此类乱码问题)
(1)用字符串对url进行反编码,先将编码格式改为ISO-8859-1,再用UTF-8转换
//假如get方式提交时出现中文乱码
String name=req.getParameter("username");
String password=req.getParameter("password");
//先让提交过来的请求参数回到ISO-8859-1对应的编码格式,把它变成字节数组
String username=new String(name.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("name"+username+";password"+password);
(2)在Tomcat的conf/server.xml找到
<Connector port="8080" redirectPort="8443" protocol="HTTP/1.1" connectionTomeout="20000" URIEncoding="UTF-8" />
- 如果是POST方式
//假如post方式提交时出现中文乱码
//设置请求体里面的编码格式:在获取到参数之前
req.setCharacterEncoding("UTF-8");
String name=req.getParameter("username");
String password=req.getParameter("password");
System.out.println("name"+name+";password"+password);
二、HttpServletResponse
负责返回数据给客户端
//把数据输出到页面上
//以字节流的方式输出到页面上,图片,文件,字节文件
resp.getOutputStream().write("hello world".getBytes());
//以字符流对页面进行输出,字符串(响应的数据有中文时会出现乱码)
resp.getWriter().write("hello world!!!!");
响应的数据有中文时,可能会出现乱码
//解决以字符流输出时的乱码问题
private void test02(HttpServletResponse resp) throws IOException{
//1.输出到客户端的时候,指定编码格式
resp.setCharacterEncoding("UTF-8");
//2.指定浏览器看这份数据时以什么方式打开
resp.setHeader("Content-type", "text/html; charset=UTF-8");
resp.getWriter().write("大家好");
}
//解决以字节流输出时的乱码问题
private void test03(HttpServletResponse resp) throws IOException{
//客户端要以指定的格式来读取这份流
resp.setHeader("Content-type", "text/html; charset=UTF-8");
//以UTF-8的编码格式发送字节流到客户端
resp.getOutputStream().write("大家好".getBytes("UTF-8"));
}
//解决以字节字符流通用的解决乱码的方式
private void test04(HttpServletResponse resp) throws IOException{
//设置响应的格式是text或者HTML,并且告知客户端以utf-8的方式解码
resp.setContentType("text/html; charset=UTF-8");
//resp.getOutputStream().write("大家好".getBytes());
resp.getWriter().write("好好学习,天天向上");
}
总结:对于我们一般编程,将这两句写在最前面基本上可以处理绝大多数乱码问题
request.setCharacterEncoding(“UTF-8”);
response.setContentType(“text/html;charset=UTF-8”);
三、利用过滤器处理乱码
在每个servlet都来处理乱码现象,会造成代码冗余,所以可以写一个过滤器拦截所有页面并对其进行乱码处理
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter("/*")
/*
* @WebFilter(value="/*" ,initParams = {
@WebInitParam(name = "encode", value = "GBK")
})
*/
public class EncodingFilter implements Filter {
//存储编码格式信息
private String encode = null;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//转换
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
/*
* 判断在web.xml文件中是否配置了编码格式的信息
* 如果为空,则设置编码格式为配置文件中的编码格式
* 否则编码格式设置为utf-8
*/
if(this.encode != null && !this.encode.equals("")){
req.setCharacterEncoding(this.encode);
resp.setContentType("text/html;charset="+this.encode);
}else{
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
}
/*
* 使用doFilter方法调用链中的下一个过滤器或目标资源(servlet或JSP页面)。
* chain.doFilter处理过滤器的其余部分(如果有的话),最终处理请求的servlet或JSP页面。
*/
chain.doFilter(req, resp);
}
public void init(FilterConfig fConfig) throws ServletException {
//获取在web.xml文件中配置了的编码格式的信息
this.encode = fConfig.getInitParameter("encode");
}
}