一)response
我们通过浏览器访问网站的时候,处理响应的是response。
它由三部门组成:响应行、响应头、响应体 作用:往浏览器写东西。
1)响应行
格式:协议/版本 状态码 状态码说明。
状态码:
1xx 已发送请求。
2xx 已完成响应 200 正常响应。
3xx 还需浏览器进一步操作。
302 重定向,配合响应头:location。
304 读缓存。
4xx 用户操作错误。
404 用户操作错误。
405 访问方法不存在。
5xx
500 服务器内部错误。
常用方法:
setStauts()该方法,设置http返回码的时候,如果返回的自定义的比如说111的状态码直接浏览器处于pending状态,4xx的返回码也会显示请求有问题等。
@WebServlet(name = "Servlet_Rsq")
public class Servlet_Rsq extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setStatus();
response.getWriter().print("<h1>状态码400</h1>");
}
}
操作响应头:
setHeader(String key,String val) addHeader(String key,String val)设置相应头,如果存在则追加,如果不存在添加。
response.getWriter().print("<div>三秒之后进行跳转!</div>");
response.setHeader("refresh","3;url=/");
常用响应头:
1): 重定向建议使用第二种
1、location:需要注意必须配合setstatus()方法
response.setStatus();
response.setHeader("location","/local");
2:sendRedirect()
response.sendRedirect("/local");
2)文件下载
1、超链接下载:之前我们在部署下载服务器的时候,直接使用超链接下载,但是有的类型文件,比如说:xml 在下载的时候,直接被打开。而有的zip包取能被下载,这是为什么呢?
之所以会被下载是因为:浏览器解析不了的文件,会被浏览器下载处理,如果可以被解析的文件的,则会在浏览器呈现出来。也就是文件的mintype类型问题。所以出现之前的情况。
2、代码下载
通过指定文件mimeType的类型,通过输入IO流和输出流,返回给浏览器可以直接被下载,不会被出现上面的问题。
还有一个问题:文件名字中带有中文的时候,不同的浏览器需要编码不同。
Firefox:需要的base64编码
其他浏览器:需要utf-8
1)获取文件的mimeType类型。
2)设置头部信息。
3)对拷流。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename=request.getParameter("filename");
System.out.println(filename);
ServletContext context=this.getServletContext();
String mi=context.getMimeType("/download/"+filename);
System.out.println(mi);
response.setContentType(mi);
InputStream inp=context.getResourceAsStream("WEB-INF/download/time.jpg");
//设置头部信息。
response.setHeader("content-disposition","attachment;filename="+filename);
ServletOutputStream out=response.getOutputStream();
//io对拷。使用common.io
IOUtils.copy(inp,out);
}
二)request
作用:获取浏览器的发送过来的数据。
组成部分:
请求行、请求头、请求体
操作请求行:
格式:
请求方式 请求资源 协议/版本
常用方法: HttpServletRequest
掌握的方法:
//获取请求方法:get、post等
String method=request.getMethod();
//获取远程执行IP
String ip=request.getRemoteAddr();
//获取项目名称。
String pro=request.getContextPath();
System.out.println(method+" "+ip+" "+pro);
操作请求头:
//获取请求浏览器内核。
String nut=request.getHeader("user-agent");
//获取页面请求的来源 防盗链
String com=request.getHeader("referer");
System.out.println(nut+" "+com);
获取单个key多个值情况(checkbox)
//获取单个请求参数。
String finame=request.getParameter("filename");
//获取多个请求参数的值。
String[] vals=request.getParameterValues("info");
for(String i:vals){
System.out.println(i);
}
//获取多组参数值。
Map<String,String[]> get_val=request.getParameterMap();
// System.out.println(get_val);
for(String key:get_val.keySet()){
System.out.println(Arrays.toString(get_val.get(key)));
}
三:
get请求和post请求中文乱码,是因为在浏览器处理中文的时候utf8但是到tomcat使用的编码的是iso-8859-1。所以,我们需要转换相应的编码。
使用String str=String.getBytes("iso-8859-1",“utf-8”)
因为得到参数已经被iso-8859-1处理过,需要用iso-8859-1解码然后用utf-8解码。new String(oldstring.getBytes("iso-8859-1"),"utf-8")
//获取多个请求参数的值。
String[] vals=request.getParameterValues("info");
for(String i:vals){
System.out.println(new String(i.getBytes("iso-8859-1"),"utf-8"));
}
下载文件扩展:
针对带有中文的下载文件处理。针对不同的浏览器进行不同的处理
String filename=request.getParameter("filename");
filename=new String(filename.getBytes("iso-8859-1"),"utf-8");
System.out.println(filename);
String _filename;
if(nut.contains("Firefox")){
_filename=base64EncodeFileName(filename);
}else{
_filename= URLEncoder.encode(filename,"utf-8");
}
System.out.println(_filename);
ServletContext context=this.getServletContext();
String mi=context.getMimeType("/download/"+filename);
System.out.println(mi);
response.setContentType(mi);
//获取输入的流的时候需要注意的是:原始的文件名字 需要转码处理。
InputStream inp=context.getResourceAsStream("WEB-INF/download/"+filename);
//设置头部信息。
//添加不同的转码的文件名字。
response.setHeader("content-disposition","attachment;filename="+_filename);
ServletOutputStream out=response.getOutputStream();
//io对拷。使用common.io
IOUtils.copy(inp,out);
} public static String base64EncodeFileName(String fileName) {
/**
* 该函数主要处理判断请求的浏览器内核进行处理。
* 针对不同的浏览器内核,进行不同转码。
*/
BASE64Encoder base64encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?" + new String(base64encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
} catch (java.io.UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} }