java--HttpServlet及request、response

 HttpServlet

但在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多, 我们一般创建类继承HttpServlet

实现步骤:

1)创建类继承HttpServlet类

2)覆盖doGet和doPost

3)在web.xml中进行servlet的配置

HttpServletResponse

1.HttpServletResponse概述

      我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大,今天我们学习HttpServletResponse。

response的运行流程

Http响应

2.通过response设置响应行 

1 //设置状态码
2 response.setStatus(405);

3.通过response设置响应头

 

//添加响应头
response.addHeader("name2", "bianxiutong");
//5秒后跳转百度
response.setHeader("refresh", "5;url=https://baidu.com/");

/*//重定向步骤:1.设置状态码
response.setStatus(302);
//2.设置响应头Location
response.setHeader("Location", "/Servlet04");*/
//实际开发中,上面的代码不会使用,重定向用一句话搞定
response.sendRedirect("/Servlet04");

4.通过response设置响应体

1 response.getWriter().write("hello dandan...");

案例--文件下载

(1)向浏览器输出一张照片

 1 //向客户端输出一张图片
 2     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 3         //明确数据源
 4         String path=getServletContext().getRealPath("IMG_0152.JPG");
 5         //获得输入流
 6         FileInputStream fis=new FileInputStream(path);
 7         //明确目的地
 8         ServletOutputStream sos=response.getOutputStream();
 9         //复制
10         int len=0;
11         byte[] bytes=new byte[1024];
12         while((len=fis.read(bytes))!=-1){
13             sos.write(bytes, 0, len);
14         }
15         //释放资源
16         fis.close();
17     }

(2)提供下载

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         //获取要下载的文件名称
 3         String filename=request.getParameter("filename");
 4         //response解决中文乱码
 5         filename=new String(filename.getBytes("ISO8859-1"),"utf-8");
 6         //要下载的文件类型--客户端会通过文件的MIME类型去区分类型
 7         response.setContentType(getServletContext().getMimeType(filename));
 8         //获取请求头中的浏览器信息
 9         String agent=request.getHeader("User-Agent");
10         //复制不同浏览器对文件名编码的代码
11         String filenameEncoder="";
12         if (agent.contains("MSIE")) {
13                 // IE浏览器
14                 filenameEncoder = URLEncoder.encode(filename, "utf-8");
15                 filenameEncoder = filenameEncoder.replace("+", " ");
16         } else if (agent.contains("Firefox")) {
17                 // 火狐浏览器
18                 BASE64Encoder base64Encoder = new BASE64Encoder();
19                 filenameEncoder= "=?utf-8?B?"
20                         + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
21         } else {
22                 // 其它浏览器
23                 filenameEncoder= URLEncoder.encode(filename, "utf-8");                
24         }
25         //要告知客户端文件的打开方式(下载)
26         response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
27         //获取文件的绝对路径
28         String path=getServletContext().getRealPath("download/"+filename);
29         //获得该文件的输入流
30         FileInputStream fis=new FileInputStream(path);
31         //获取文件输出流
32         ServletOutputStream sos=response.getOutputStream();
33         //文件复制
34         int len=0;
35         byte[] bytes=new byte[1024];
36         while((len=fis.read(bytes))!=-1){
37             sos.write(bytes, 0, len);
38         }
39         //释放资源
40         fis.close();
41     }

下载html:

<h1>使用服务器端的编码方式实现文件的下载</h1>
    <a href="/WEB04/DownLoadServlet?filename=IMG_0152.JPG">IMG_0152.JPG</a>
    <a href="/WEB04/DownLoadServlet?filename=你好.txt">你好.txt</a>
    <a href="/WEB04/DownLoadServlet?filename=New Folder.zip">New Folder.zip</a>
    <a href="/WEB04/DownLoadServlet?filename=ServletCOntext.wmv">ServletCOntext.wmv</a>

response细节点:

  1. response获得的流不需要手动关闭,web容器(tomcat容器)会帮助我们关闭,
  2. getWriter和getOutputStream不能同时调用
  3. 重定向语句一般作为终结代码

关于中文乱码问题

  https://www.cnblogs.com/-dashu/p/9625892.html

 

HttpServletRequest

1.HttpServletRequest概述

  我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大,今天我们学习HttpServletRequest。

response的运行流程

 

 

http请求

 

 2.通过request获得请求行

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         //1.获取请求方式
 3         String method=request.getMethod();
 4         System.out.println("请求方式:"+method);
 5         //2.获取请求资源的相关内容
 6         String requestURI=request.getRequestURI();
 7         System.out.println("requestURI:"+requestURI);
 8         StringBuffer requestURL=request.getRequestURL();
 9         System.out.println("requestURL:"+requestURL);
10         //3.获取WEB应用名称
11         String contextpath=request.getContextPath();
12         System.out.println("WEB项目名称为:"+contextpath);
13         //4.获取get方式提交url后的参数信息
14         String queryString=request.getQueryString();
15         System.out.println("get提交参数信息"+queryString);
16         //5.获取客户端的访问者的ip地址
17         String ip=request.getRemoteAddr();
18         System.out.println("ip地址为:"+ip);
19     }

 

 3.通过request获得请求头

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         //1.获取指定的头
 3         String agent=request.getHeader("User-Agent");
 4         System.out.println(agent);
 5         //2.获取所有头的名称
 6         Enumeration<String> headerNames=request.getHeaderNames();
 7         while(headerNames.hasMoreElements()){
 8             String headerName=headerNames.nextElement();
 9             String headerValue=request.getHeader(headerName);
10             System.out.println(headerName+"..."+headerValue);
11         }
12     }

 

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         //获取referer的信息
 3         String refer=request.getHeader("referer");
 4         //解决中文乱码
 5         response.setContentType("text/hetml;charset=utf-8");
 6         //对referer进行判断
 7         if(refer!=null&& refer.startsWith("http://localhost")){
 8             response.getWriter().write("一、京东重创中国网络零售商京东创始人刘强东涉嫌犯罪事态升级。明尼拿波里斯警察局发言人埃尔德(John Elder)接受电话采访表示,刘强东涉嫌强暴重罪。");
 9         }else{
10             response.getWriter().write("你是盗链者,可耻");
11         }
12     }

4.通过request获得请求体

 

form.jsp:

<form action="/WEB06/ContentServlet" method="post">
        用户名:<input type="text" name="username"><br>
        <input type="checkbox" name="hobby" value="zq">足球
        <input type="checkbox" name="hobby" value="lq">篮球
        <input type="checkbox" name="hobby" value="pq">排球
        <input type="checkbox" name="hobby" value="ppq">乒乓球
        <input type="submit" value="提交">
</form>

 

 servlet:

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         //获取单个值
 3         String username=request.getParameter("username");
 4         //获取指定表单元素的value值
 5         String[] hobbys=request.getParameterValues("hobby");
 6         for(String h:hobbys){
 7             System.out.println(h);
 8         }
 9         //获取所有参数,并封装到一个Map<String,String[]>中
10         Map<String,String[]> map=request.getParameterMap();
11         for(Map.Entry<String,String[]> entry:map.entrySet()){
12             //参数的name值
13             System.out.println(entry.getKey());
14             //参数value值(String[])
15             for(String str:entry.getValue()){
16                 System.out.println(str);
17             }
18             System.out.println("-----------------");
19         }
20

 5.request的其他功能

(1)request是一个域对象

//往域对象中设置值
request.setAttribute("name", "张三");
//中文乱码
response.setContentType("text/hetml;charset=utf-8");
//获取域对象值
String name=(String)request.getAttribute("name");
response.getWriter().write(name);

 (2)request完成请求转发

 

//请求转发--获得转发器、通过转发器转发
request.getRequestDispatcher("/Servlet2").forward(request, response);

转发与重定向的区别?

1)重定向两次请求,转发一次请求

2)重定向地址栏的地址变化,转发地址不变

3)重新定向可以访问外部网站 转发只能访问内部资源

4)转发的性能要优于重定向

 

注意:ServletContext域与Request域的生命周期比较?

ServletContext:

创建:服务器启动

销毁:服务器关闭

域的作用范围:整个web应用

request

创建:访问时创建request

销毁:响应结束request销毁

域的作用范围:一次请求中

注意:客户端地址与服务器端地址的写法?

客户端地址:

是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用名

直接输入地址:重定向 

服务器端地址:

服务器内部资源的跳转的地址,特点:不需要写web应用的名称

请求转发

 

posted @ 2018-09-10 17:07  大树*  阅读(872)  评论(0编辑  收藏  举报