JAVA笔记:HttpServletRequest& HttpServletResponse

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);
  1. 直接在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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值