HttpServletRequest
这个对象封装了客户端提交过来的一切数据
1.可以获得客户端的请求头信息
//获取客户端的请求头信息
//得到一个枚举集合
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
String name = parameterNames.nextElement();
//根据参数名称,逐个获取头信息
String vlaue = request.getHeader(name);
System.out.println(name + "=" + vlaue);
}
2.获取客户端提交过来的信息,如参数等
String name = request.getParameter("name");
String address = request.getParameter("address");
System.out.println("name:" + name + " --- " + "address:" + address);
----------------------------------------------------------------------
//使用 Map 集合的方式获取参数
//name=kk&name=kk1&name=kk2 一个key可以对应多个值。
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keySet = parameterMap.keySet();
//获取key的迭代器
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()){
//获取key值
String key = iterator.next();;
//根据key值 获取相对应的value值
String value = parameterMap.get(key)[0];
String value1 = parameterMap.get(key)[1];
System.out.println("key:" + key + " ---- value:" + value + "value1:" + value1);
}
3.获取中文数据
客户端提交给服务器端的数据,如果数据中带有中文的话,可能会出现乱码情况
那么,可以参照一下方法进行处理。
- 如果是GET方式:
1.代码进行转码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 未转码的字符串
System.out.println("username:" + username + " -- password:" + password);
//get请求过来的数据,在url地址栏上已经编过码了,所以我们取到的就是乱码。
//tomcat收到了这批数据,getParameter 默认使用ISO-8859-1 去解码
//先让文字回到ISO-8859-1 对应的字节数组,然后再按UTF-8 组拼字符串
username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("username:" + username + " --- password:" + password);
- 直接在Tomcat 里面对配置文件进行设置,conf/server.xml 里,加上URIEncoding=“utf-8”,自动将Get请求中的数据以 UTF-8 的格式编码。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
- 如果是POST方式
这个设置的是请求体(body of the request)里的文字编码格式
对于get方式,这种方法没用,因为get方式的数据是带在URL上的,没有在请求体中
request.setCharacterEncoding(“UTF-8”);
PS:这行设置编码代码一定要写在getParameter方法之前。
HttpServletResponse
负责返回数据给客户端,输出数据到客户端,其实就是对之前的请求做出响应
- 输出数据到页面上
//以字符流写数据
response.getWriter().write("hello response");
//以字节流泻数据
response.getOutputStream().write("hello response".getBytes());
- 使用方法
//设置当前这个请求的处理状态码
response.setStatus(300);
//设置一个响应头信息
response.setHeader(name,value);
//设置响应的内容类型,以及编码
response.setContentType(type);
响应的数据中有中文,可能会出现中文乱码
如果想让服务器端出去的数据,在客户端中正常显示中文,只要确保一点。
响应出去的时候,所使用的编码,和客户端解析看这份数据使用的码表是一样的即可。
- 以字符流形式输出
response.getWriter().write();
//这里写出去的文字,默认使用的是ISO-8859-1,我们可以指定写出去的时候,使用什么编码编写
//1.指定输出到客户端的时候,这些文字使用UTF-8编码
response.setCharacterEncoding("UTF-8");
//2.直接规定浏览器看这份数据的时候,使用什么编码来看
response.setHeader("Content-Type","text/html;charset=UTF-8");
response.getWriter().write("hello,乱码测试");
- 以字节流形式输出
response.getOutputStream().write();
//1.指定浏览器看这份数据使用的码表
response.setHeader("Content-Type","text/html;charset=UTF-8");
//2.指定输出的中文使用的码表
response.getOutputStream().write("hello,编码测试".getBytes("UTF-8"));
PS:Sring 这个类里面getBytes()方法使用的码表,是UTF-8.
- 通用型方式
不管是字节流还是字符流输出,只需要设置一行代码即可。
response.setContentType(“Content-Type;text/html;charset=UTF-8”);
// 设置响应的数据类型是html文本,并且告知浏览器,使用UTF-8来编码
服务器上的资源下载
1.直接以链接的形式下载,不写任何代码,也能进行下载
让tomcat的默认的Servlet去提供下载
<a href="download/aa.jpg">aa.jpg</a><br>
<a href="download/bb.txt">bb.txt</a><br>
<a href="download/cc.rar">cc.rar</a><br>
原因是tomcat服务器里面有一个默认的Servlet — DefaultServlet,它专门用于处理放在tomcat服务器上的静态资源。
2.代码的形式,自己写Servlet,对资源进行下载,如果服务器文件名称中包含中文名称,还需要对其进行特殊的编码处理。
//1.获取要下载的文件的名字 ---- inputStream
String filename = request.getParameter("filename");
//来了一个Get请求,这个filename包含中文,会出现乱码
//为了让服务器能正确找到这个文件,需要转换中文编码,才可以正常的找到该文件
filename = new String(filename.getBytes("ISO-8859-1"), "UTF-8");//为了让服务器端找到相应中文文件
//2.获取这个文件在tomcat里面的绝对路径地址
String path = getServletContext().getRealPath("download/" + filename);
/*
*为了客户端(浏览器)在保存下载页面的时候,正确显示中文名称
* 还需要对包含中文名的文件进行编码处理
*
* 如果是IE,或者Chrome,使用URLEncoding编码
*
* 如果是Firefox,使用Base64编码
* */
//通过请求头的信息,User-Agent,获取来访的客户端类型,也就是浏览器的类型
String clientType = request.getHeader("User-Agent");
if (clientType.contains("IE") || clientType.contains("Chrome")) {
//如果是IE,或者是谷歌浏览器,对中文名字进行编码处理
filename = URLEncoder.encode(filename,"UTF-8");
//为了下载页面的时候客户端能正常显示中文
}
//让浏览器收到这个资源的时候,以下载的形式提醒用户,而不是直接展示在页面上
response.setHeader("Content-Disposition","attachment;filename=" + filename);
//3.转换成输入流
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len;
byte[] bytes = new byte[1024];
while ((len = is.read(bytes)) != -1) {
os.write(bytes,0,len);
}
os.close();
is.close();