JavaWeb ——servlet学习4之HttpServletRequest、HttpServletResponse和资源下载
Web 服务器收到客户端的 http 请求,会针对每一次请求,分别创建一个用于 代表请求的 request 对象和 代表响应的 response 对象。request 和 response 对象代表请求和响应:获取客户端数据,需要通过request 对象; 向客户端输出数据,需要通过 response 对象。HttpServletResponse 的主要功能用于服务器对客户端的请求进行响应,将Web 服务器处理后的结果返回给客户端。service()方法中形参接收的是HttpServletResponse 接口的实例化对象,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
HttpServletRequest
获取客户端的信息
获取客户端信息
getRequestURL:返回客户端发出请求时的完整URL。
getRequestURI:返回请求行中的资源名部分。
getQueryString :返回请求行中的参数部分。
getPathInfo:返回请求URL中的额外路径信息。额外路径信息是请求URL中的位
于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
getRemoteAddr:返回发出请求的客户机的IP地址。
getRemoteHost:返回发出请求的客户机的完整主机名。
getRemotePort:返回客户机所使用的网络端口号。
getLocalAddr:返回WEB服务器的IP地址。
getLocalName:返回WEB服务器的主机名。
获得客户请求头
getHeader(string name):String getHeaders(String name):Enumeration getHeaderNames()方法
获得客户机请求参数(客户端提交的数据)
-
getParameter(String) (常用)
-
getParameterValues(String name)(常用)
若出现乱码问题,需要进行处理
-
get请求处理乱码:
//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里面做配置,以后get请求过来的数据永远都是用UTF-8编码。
在tomcat里面做设置处理 conf/server.xml 加上URIEncoding="utf-8"
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
-
Post请求处理乱码:
在getParameter之前,进行格式配置request.setCharacterEncoding("UTF-8");
HttpServletResponse
HttpServletResponse四类功能:
-
设置响应头信息;addHeader(“reFresh”, “5;URL=xxxx”);
-
发送状态码;sendError(404);
-
*设置响应正文;getWriter().print(“fdsfdsa”);*
-
*重定向:sendRedirect(“path”);*
设置正文:
//以字符流的方式写数据
response.getWriter().print("3秒后跳转到注册页面"); //3秒后跳转到1.html页面
response.setHeader("reFresh", "3;URL=/request_demo5/1.html");
//以字节流的方式写数据
response.getOutputStream().write("hello response2222...".getBytes());
设置状态码,一般不需要我们自己设置,这是由tomcat来分析的
response.setStatus(404);
设置响应头
Date date = new Date(0);
response.setHeader("name", "xuefu");
response.addIntHeader("age", 18);
response.addDateHeader("birthday",date.getTime());
response.addHeader("name", "xueli");
response.setIntHeader("age", 20);
设置重定向
//没有响应,告知客户端重定向到servlet2
//1设置状态码
response.setStatus(302);
//2.设置响应头Location
response.setHeader("Location", "/WEBpro/servlet2");
处理乱码问题
设置编码,如果响应类型为文本,我们需要设置响应编码和文本编码
response.setContentType("text/html;charset=UTF-8") :设置响应类型和编码
response.setCharacterEncoding("UTF-8"): 设置文本编码
资源下载
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 。这个DefaultServlet 专门用于处理放在tomcat服务器上的静态资源。
自己设置下载
//1. 获取要下载的文件名字 aa.jpg --- inputStream
String fileName = request.getParameter("filename");
//2. 获取这个文件在tomcat里面的绝对路径地址
String path = getServletContext().getRealPath("download/"+fileName);
//让浏览器收到这份资源的时候, 以下载的方式提醒用户,而不是直接展示。
response.setHeader("Content-Disposition", "attachment; filename="+fileName);
response.sendRedirect("login_success.html");
//3. 转化成输入流
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();
int len = 0 ;
byte[]buffer = new byte[1024];
while( (len = is.read(buffer)) != -1){
os.write(buffer, 0, len);
}
os.close();
is.close();
文件名字中带有中文处理
IE、Google用URLEncoding编码
FireFox使用Base64编码
String clientType = request.getHeader("UserAgent");
if(clientType = "firefox"){
filename = DownLoadUtil.Base64EncodingFileName(filename)
}
filename = URLEncoding.encode(filename,"UTF-8");
重定向与请求转发
// 重定向:
response.setStatus(302);
response.setHeader("Location", "login_success.html");
//重定向写法: 重新定位方向 参数即跳转的位置
response.sendRedirect("login_success.html");
// 请求转发
request.getRequestDispatcher("login_success.html").forward(request, response);
异同:
重定向:
-
地址上显示的是最后的那个资源的路径地址
-
请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问
-
可以跳转到任意路径。 不是自己的工程也可以跳
-
效率稍微低一点, 执行两次请求。
-
后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求
请求转发:
-
地址上显示的是请求servlet的地址。 返回200 ok
-
请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作。
-
只能跳转自己项目的资源路径 。
-
效率上稍微高一点,因为只执行一次请求。
-
可以使用上一次的request对象。