详解请求Request和响应Response

第七章 Response讲解

7.1 Response简介

​ 定义辅助 servlet 将响应发送到客户端的对象。servlet 容器创建 ServletResponse 对象,并将它作为参数传递给 servlet 的 service 方法。 要发送 MIME 正文响应中的二进制数据,请使用 #getOutputStream 返回的 ServletOutputStream。要发送字符数据,请使用 #getWriter 返回的 PrintWriter 对象。 可使用 #setCharacterEncoding 和 #setContentType 显式指定 MIME 正文响应的 charset。如果未指定 charset,则将使用 ISO-8859-1。setCharacterEncoding、setContentType 方法必须在调用 getWriter 之前,并且必须在提交采用要使用的字符编码的响应之前调用。

7.2 HttpServletResponse介绍

扩展 ServletResponse 接口以提供特定于 HTTP 的发送响应功能。例如,该接口拥有访问 HTTP 头和 cookie 的方法。 客户端向服务器发起的都是HTTP协议操作,所以我们大部分使用HttpServletResponse对象作为直接操作对象!

7.3 HttpServletResponse 常用API介绍

方法名称作用
setStatus(int code)设置响应状态码
setHeader(name,value)设置响应信息头
setCharacterEncoding(String);设置编码格式
setContentType(String)设置返回数据mimetype
getWriter()获取字符输出流
getOutputStream()获取字节输出流

7.4 设置返回字符编码格式

  • 方案1

    response.setCharacterEncoding()
    设置tomcat编码格式
    <html  meta charset=UTF-8 ><body>编写返回的文本内容</body>
    设置浏览器解析文本内容格式  

    可以解决返回字符串乱码问题,但是需要将返回的字符串封装到html代码中.操作繁琐!

  • 方案2

    response.setCharacterEncoding()
    response.setHeader("Content-type","text/html;charset=UTF-8")

    方案按相对简单,通过设置响应头告知浏览器解析字符串的编码格式!

  • 方案3

    response.setContentType("text/html;charset=UTF-8")

    利用setContentTyoe这种综合性的写法解决问题!此方法也是开发中常用的方法!方便!

7.5 Response练习

  1. 用户下载服务器图片

    public class DownLoadServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            /**
             * 别人访问我 我给你一张图片
             * 
             * 1.获取图片的输入流
             * 2.response的字节输出流
             */
        
           //获取图片在本地的路径
            String path = getServletContext().getRealPath("/吃鸡.jpg");
            
            System.out.println(path);
            //文件输入流
            FileInputStream stream = new FileInputStream(path);
            
            String filename = path.substring(path.lastIndexOf(File.separator)+1);
            
            
             filename =  URLEncoder.encode(filename,"UTF-8");
        
            //设置响应头
            //content-disposition", "attachment;filename="+filename 
            //下载用的 attachment下载: filename下载文件的名字 
            response.setHeader("content-disposition", "attachment;filename="+filename);
            //根据文件名字的后缀名获取类型
            String mimetype = getServletContext().getMimeType(filename);
            response.setContentType(mimetype); //下载文件的类型
            ServletOutputStream outputStream = response.getOutputStream();
            byte [] b = new byte [stream.available()];
        stream.read(b)
            stream.close();
            outputStream.close();
        }
    }
  1. 页面中添加验证码

在目前的网页的登录、注册中经常会见到各种验证码。其目的便是为了:防止暴力破解 .因为只要CPU性能较强,便可以在慢慢尝试密码的过程中来破解用户账号,因而导致的结果是用户信息不安全。

但是如果使用验证码,一旦用户输入的密码或账号不正确时,验证码也会立马改变,这样便在一定程度上实现了安全性.

  1. 项目中添加第三方jar包!validatecode.jar

  2. 创建返回验证码的servlet!

   public class CodeServlet extends HttpServlet {
​
    /**
         * The doGet method of the servlet. <br>
         * This method is called when a form has its tag value method equals to get
         * @param request the request send by the client to the server
         * @param response the response send by the server to the client
         * @throws ServletException if an error occurred
         * @throws IOException if an error occurred
         */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置生成规则
        /**
         * width:验证码的宽度  px 像素
         * height: px
         * codeCount:生成验证码有几个数
         * lineCount:有几根线
         */
        ValidateCode code = new ValidateCode(200, 50, 6, 20);
        //2.获取生成的验证码的字符串值
        System.out.println(code.getCode()); //获取正确值
        //3.响应写回验证图片
        code.write(response.getOutputStream());
    }
   } 
  1. 页面中使用当前servlet

   <!DOCTYPE html>
   <html>
     <head>
       <title>login.html</title>
       <meta name="keywords" content="keyword1,keyword2,keyword3">
       <meta name="description" content="this is my page">
       <meta name="content-type" content="text/html; charset=UTF-8">
       <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
     </head>
     <body>
         <form action="/Day11_Response1/servlet/LoginServlet"  method="post">
              <input type="text" name="username" placeholder="请输入账号!" />
              <input type="submit" value="登录"/>
         </form>
         <img src="/Day11_Response1/servlet/CodeServlet" onclick="changeCodes()" alt="验证码" title="验证码"/>
         <a href="javascript:changeCodes()" >看不清?</a>
         <script type="text/javascript">
            function changeCodes(){
                var img= document.getElementsByTagName("img")[0];
                img.src = "/Day11_Response1/servlet/CodeServlet?r="+Math.random();
            }
         </script>
     </body>
   </html>

第八章 Request讲解

8.1 ServletRequst介绍

定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参数传递给该 servlet 的 service 方法。

8.2 HttpServletRequest介绍

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

小结: 同响应相同,客户端请求协议都是基于HTTP所以我们选用HttpServletRequest来操作用户发送过来的请求的数据!

8.3 HttpServletRequest常用API

//获取请求路径相关参数
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
//获取请求头信息
getHead(name)方法 
getHeaders(String name)方法 
getHeaderNames方法 
//获取请求正文参数
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法 
getParameterMap方法  //做框架用,非常实用

 

 

8.6 Servlet如何处理HTTP协议

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的HttpServletRequest对象、和代表响应的HttpServletResponse对象。
HttpServletRequest和HttpServletResponse对象即然代表请求和响应,那我们要获取客户端提交过来的数据,只需要找HttpServletRequest对象就行了。要向客户端输出数据,只需要找HttpServletResponse对象就行了

8.4 获取请求数据练习

代码如下所示:

/**
 * Servlet implementation class RequestServlet
 * 演示request的各种常用方法
 */
@WebServlet("/RequestServlet")
public class RequestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RequestServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
​
    /**
     * @see 处理GET请求
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //编码格式
        //request.setCharacterEncoding("UTF-8");
        //获取参数方法
        System.out.println(request.getParameter("name"));
        System.out.println(Arrays.toString(request.getParameterValues("name")));
        System.out.println(request.getParameterMap());
        System.out.println(request.getParameterNames());
        //获取请求方法
        System.out.println("getMethod--->"+request.getMethod());
        //获取远程ip地址
        System.out.println(request.getRemoteAddr());
        //获取远程端口号
        System.out.println(request.getRemotePort());
        System.out.println(request.getRemoteHost());
        System.out.println(request.getRemoteUser());
        System.out.println("getRequestURL:"+request.getRequestURL());
        System.out.println("getContextPath:"+request.getContextPath());
        System.out.println("getServletPath--->"+request.getServletPath());
        System.out.println("getServerName--->"+request.getServerName());
        Enumeration<String> ets=request.getHeaderNames();
         while (ets.hasMoreElements()) {
            String key=ets.nextElement();
            System.out.println("请求消息头:key="+key+"---值:"+request.getHeader(key));
        }
    }
​
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //doGet(request, response);
    }
}

8.6.2 HttpServletResponse

HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
向客户端(浏览器)发送响应头的相关方法:
​
 addHeader:如果Header中没有定义则添加,如果已定义则保持原有value不改变。
 
 setHeader:如果Header中没有定义则添加,如果已定义则用新的value覆盖原用value值
​
 setContentType:设置响应内容的格式
 addCookie:新增Cookie
设置状态响应码:
setStatus:设置Http协议的状态响应码
负责向客户端(浏览器)发送数据的相关方法:
getOutputStream:获取输出字节流向客户端写出内容
getWriter:获取输出字符流向客户端写出内容

代码如下所示:

/**
 * Servlet implementation class ResponseServlet
 * 演示response常用的方法
 */
@WebServlet("/ResponseServlet")
public class ResponseServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ResponseServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
​
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //编码格式
        //request.setCharacterEncoding("");//设置请求内容的编码格式
        response.setCharacterEncoding("UTF-8");//设置响应数据的编码格式
        response.setStatus(404);//设置状态响应码
        //设置响应内容的类型和编码格式
        response.setContentType("text/html;charset=UTF-8");
        //response.getOutputStream();
        //获取打印字符流
        PrintWriter pw=response.getWriter();
        pw.println("困了");
        pw.println("站起来");
        pw.close();
        System.out.println("OK");
        
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
}

转载来源:有道云iuv002的分享

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值