JavaWeb-HttpServletResponse, HttpServletRequest

HttpServletResponse介绍

HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。查看HttpServletResponse的API,可以看到这些相关的方法。

使用OutputStream流向客户端浏览器输出中文数据

使用OutputStream流输出中文注意问题:

在服务器端,数据是以哪个码表输出的,那么就要控制客户端浏览器以相应的码表打开,比如:outputStream.write(“中国”.getBytes(“UTF-8”));使用OutputStream流向客户端浏览器输出中文,以UTF-8的编码进行输出,此时就要控制客户端浏览器以UTF-8的编码打开,否则显示的时候就会出现中文乱码,那么在服务器端如何控制客户端浏览器以以UTF-8的编码显示数据呢?可以通过设置响应头控制浏览器的行为,例如:response.setHeader(“content-type”, “text/html;charset=UTF-8”);通过设置响应头控制浏览器以UTF-8的编码显示数据

案列

public class ResponseDemo01 extends HttpServlet {
 
    private static final long serialVersionUID = 4312868947607181532L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        outputChineseByOutputStream(response);//使用OutputStream流输出中文
  }
   
   
    public void outputChineseByOutputStream(HttpServletResponse response) throws IOException{
      /**使用OutputStream输出中文注意问题:
          * 在服务器端,数据是以哪个码表输出的,那么就要控制客户端浏览器以相应的码表打开,
        * 比如:outputStream.write("中国".getBytes("UTF-8"));//使用OutputStream流向客户端浏览器输出中文,以UTF-8的编码进行输出
         * 此时就要控制客户端浏览器以UTF-8的编码打开,否则显示的时候就会出现中文乱码,那么在服务器端如何控制客户端浏览器以以UTF-8的编码显示数据呢?
         * 可以通过设置响应头控制浏览器的行为,例如:
         * response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据
         */
        String data = "中国";
         OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流
         response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
         /**
          * data.getBytes()是一个将字符转换成字节数组的过程,这个过程中一定会去查码表,
         * 如果是中文的操作系统环境,默认就是查找查GB2312的码表,
          * 将字符转换成字节数组的过程就是将中文字符转换成GB2312的码表上对应的数字
          * 比如: "中"在GB2312的码表上对应的数字是98
         *         "国"在GB2312的码表上对应的数字是99
          */
         /**
        * getBytes()方法如果不带参数,那么就会根据操作系统的语言环境来选择转换码表,如果是中文操作系统,那么就使用GB2312的码表
          */
         byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换
         outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组
     }

     public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
 
 }

使用PrintWriter流向客户端浏览器输出中文数据

使用PrintWriter流输出中文注意问题:

在获取PrintWriter输出流之前首先使用"response.setCharacterEncoding(charset)"设置字符以什么样的编码输出到浏览器,如:response.setCharacterEncoding(“UTF-8”);设置将字符以"UTF-8"编码输出到客户端浏览器,然后再使用response.getWriter();获取PrintWriter输出流,这两个步骤不能颠倒

案列

 public class ResponseDemo01 extends HttpServlet {
     private static final long serialVersionUID = 4312868947607181532L;
     public void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
       outputChineseByPrintWriter(response);//使用PrintWriter流输出中文

     public void outputChineseByPrintWriter(HttpServletResponse response) throws IOException{
        
        //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
         //response.setHeader("content-type", "text/html;charset=UTF-8");
        
        response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器
        /**
          * PrintWriter out = response.getWriter();这句代码必须放在response.setCharacterEncoding("UTF-8");之后
         * 否则response.setCharacterEncoding("UTF-8")这行代码的设置将无效,浏览器显示的时候还是乱码
          */
        PrintWriter out = response.getWriter();//获取PrintWriter输出流
         * 多学一招:使用HTML语言里面的<meta>标签来控制浏览器行为,模拟通过设置响应头控制浏览器行为
          * out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");
          * 等同于response.setHeader("content-type", "text/html;charset=UTF-8");
          */
        out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'/>");
        out.write(data);//使用PrintWriter流向客户端输出字符
    }    
     public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

文件下载

文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载

文件下载功能的实现思路:

1.获取要下载的文件的绝对路径

2.获取要下载的文件名

3.设置content-disposition响应头控制浏览器以下载的形式打开文件

4.获取要下载的文件输入流

5.创建数据缓冲区

6.通过response对象获取OutputStream流

7.将FileInputStream流写入到buffer缓冲区

8.使用OutputStream将缓冲区的数据输出到客户端浏览器

 public class ResponseDemo02 extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
       downloadFileByOutputStream(response);//下载文件,通过OutputStream流
    }


    private void downloadFileByOutputStream(HttpServletResponse response)
             throws FileNotFoundException, IOException {
         //1.获取要下载的文件的绝对路径
         String realPath = this.getServletContext().getRealPath("/download/1.JPG");
        //2.获取要下载的文件名
         String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
         //3.设置content-disposition响应头控制浏览器以下载的形式打开文件
         response.setHeader("content-disposition", "attachment;filename="+fileName);
         //4.获取要下载的文件输入流
         InputStream in = new FileInputStream(realPath);
         int len = 0;
         //5.创建数据缓冲区
         byte[] buffer = new byte[1024];
         //6.通过response对象获取OutputStream流
        OutputStream out = response.getOutputStream();
         //7.将FileInputStream流写入到buffer缓冲区
         while ((len = in.read(buffer)) > 0) {
         //8.使用OutputStream将缓冲区的数据输出到客户端浏览器
             out.write(buffer,0,len);
         }
         in.close();
     }
 
     public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
         doGet(request, response);
     }
 }

HttpServletRequest介绍

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

乱码问题解决方案:

  • 所有能设置编码的地方都统一设置 : 数据库,数据库字段,Servlet程序,请求,响应 , 前端,浏览器。

SP取得项目的路径

${pageContext.request.contextPath}

Request常用方法

获得客户机信息

getRequestURL方法返回客户端发出请求时的完整URL。
  getRequestURI方法返回请求行中的资源名部分。
  getQueryString 方法返回请求行中的参数部分。
  getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
  getRemoteAddr方法返回发出请求的客户机的IP地址。
  getRemoteHost方法返回发出请求的客户机的完整主机名。
  getRemotePort方法返回客户机所使用的网络端口号。
  getLocalAddr方法返回WEB服务器的IP地址。
  getLocalName方法返回WEB服务器的主机名。

public class RequestDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //查看request对象的方式
        System.out.println(request.getContextPath()); //获得web项目路径
        System.out.println(request.getRequestURI()); //请求的URL路径
        //Remote 远程
        System.out.println(request.getRemoteUser()); //获得远程的用户名
        System.out.println(request.getRequestedSessionId()); //获得SessionId;
        System.out.println(request.getServletPath()); //请求servlet的url
        System.out.println(request.getLocalAddr()); //获得本地地址  防火墙
        System.out.println(request.getLocalName()); //获得本地名字
        System.out.println(request.getLocalPort()); //获得访问的端口号

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

Request对象接收前端用户提交的参数

写前端注册页面

  • 表单的提交方式 get/post
  • 表单提交的位置 action:服务项目的路径/servlet对应的请求url
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>


<%--
JSP的注释
--%>


<%--
Form表单
    action:代表要提交的路径,表单要提交到哪里 ,可以提交到一个Servlet
        //提交到Servlet需要,获取到Web项目的路径下的Servlet
    method: 提交表单的方式
--%>
<h1>注册</h1>

<form action="${pageContext.request.contextPath}/r2" method="post">

    <p>用户名:<input type="text" name="username"></p>
    <p>密码:<input type="password" name="password"></p>

    <p>
        <input type="submit">
        <input type="reset">
    </p>

</form>



</body>
</html>

写处理前端提交信息的Servlet

  • 接收前端传递的控件信息, request.getParameter(“控件的name‘)
//处理前端提交过来的数据
public class RequestDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //通过HttpServletRequest获取前端用户提交的信息
        //req.getParameterValues(); 获得前端传递的控件信息,通过控件的name;但是可以接受多个参数的控件,比如(多选框....)
        //req.getParameter(); 获得前端传递的控件信息,通过控件的name;

        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        String username = req.getParameter("username");
        String password = req.getParameter("password");

        //连接数据库,比较数据库中的信息是否匹配

        if (username.equals("admin")&&password.equals("1234567")){
            System.out.println("登录成功!"); //跳转到成功页面
        }else {
            System.out.println("登录失败!"); //提示重新注册
        }

        System.out.println(username);
        System.out.println(password);


    }
}

配置web.xml

  • 配置对应的XML文件

    <servlet>
        <servlet-name>RequsetDemo02</servlet-name>
        <servlet-class>com.kuang.servlet.RequestDemo02</servlet-class>
    </servlet>


    <!--=====================================================-->


    <servlet-mapping>
        <servlet-name>RequsetDemo02</servlet-name>
        <url-pattern>/r2</url-pattern>
    </servlet-mapping>

提交测试

  • 检查英文提交情况,服务器是否接收成功!
  • 提交中文,看看乱码情况
  • 设置编码统一,解决乱码问题;

Request实现请求转发

public class FormServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理乱码
        req.setCharacterEncoding("UTF-8");
        //处理前端的请求
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println("接收到的用户名:"+username+"\n密码:"+password+"\n爱好:");

        String[] hobbies = req.getParameterValues("hobby");

        for (String hobby : hobbies) {
            System.out.println(hobby);
        }


        //重定向:服务器告诉客户端你应该请求另外一个地址;  (地址栏会变)
        //resp.sendRedirect("url");

        //转发:服务器把这个请求转向另外一个Servlet去处理; (地址栏不会变)
        //RequestDispatcher ,需要使用RequestDispatcher来进行处理,我们需要获得这个类
        //参数就是他要转发到的页面

        /*
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/success.jsp");
        requestDispatcher.forward(req,resp);
        */

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        req.getRequestDispatcher("/success.jsp").forward(req,resp);


    }
}

转发和重定向的区别

重定向:服务器告诉客户端,你去请求另外一个地址;客户端行为

  • 地址栏会变
  • 不能携带参数

转发:服务器自己转发到服务器上的另一个请求; 服务器行为

  • 地址栏不会变
  • 可以携带参数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值