关于servlet的HttpServletRequest和HttpServletResponse

来源:互联网 发布:淘宝客用返利网推广 编辑:程序博客网 时间:2024/05/22 16:02
1.请求和响应
  • HttpServletRequest request
    • 代表
      • request代表浏览器发送给服务器的请求报文,该对象由服务器创建并以参数的形式传入到doGet和doPost方法中,在这两个方法中可以直接使用
    • 作用
      • 1)获取请求参数
          String userName = request.getParameter("username");
          String password = request.getParameter("password");
      • 2)获取当前Web应用的虚拟路径
          String contextPath = request.getContextPath();
      • 3)转发
          //获取转发器
          RequestDispatcher dispatcher = request.getRequestDispatcher("success.html");
          //转发请求
          dispatcher.forward(request, response);
      • 4)是一个域对象(下回分解)
  • HttpServletResponse response
    • 代表
      • response代表服务器发送给浏览器的响应报文,该对象由服务器创建并以参数的形式传入到doGet和doPost方法中,在这两个方法中可以直接使用
    • 作用
      • 1)给浏览器响应一个页面或页面的一个片段
          //响应一个页面的片段
          writer.write("<h1>Response Success!</h1>");
          //响应一个完整的页面
          writer.write("<!DOCTYPE html>");
          writer.write("<html>");
          writer.write("<head>");
          writer.write("<meta charset='UTF-8'>");
          writer.write("<title>Insert title here</title>");
          writer.write("</head>");
          writer.write("<body>");
          writer.write("<h1>登录成功!</h1>");
          writer.write("</body>");
          writer.write("</html>");
      • 2)重定向
           response.sendRedirect("success.html");
  • 转发与重定向的区别
    • 1)转发发送一次请求;重定向发送两次请求
    • 2)转发浏览器地址栏地址无变化;重定向浏览器地址栏地址有变化
    • 3)转发可以访问WEB-INF下的资源;重定向不能访问WEB-INF下的资源
    • 4)转发可以共享request域中的属性;重定向不能共享request域中的属性
2.Web应用中的路径问题
  • 相对路径不靠谱
    • 在转发的情况下,由于地址栏地址无变化,有时候就可以导致浏览器解析地址错误,所以不建议使用相对路径,建议使用绝对路径
  • 绝对路径
    • 什么绝对路径:以 / 开头的路径即为绝对路径
    • 绝对路径中 / 代表什么?
      • 如果路径由浏览器解析: / 就代表当前服务器,例如:http://localhost:8080
      • 那些路径由浏览器解析
        • 1)html标签中的路径
          • 如img中的src,script标签中的src属性;a标签中的href属性,link标签中的href属性;form表单中的action属性
        • 2)重定向中的路径
      • 如果路径由服务器解析:/ 就代表当前Web应用,例如:http://localhost:8080/Web01_Servlet_Ex
      • 那些路径由服务器解析
        • 1)web.xml中url-pattern中的路径
        • 2)转发中的路径
  • base标签
    • 可以让我们以相对路径的形式来表示绝对路径
          <base href="http://localhost:8080/Web01_Servlet_Ex/">
    • 注意:base标签href属性后面的 / 必须写
3.中文乱码问题
  • 编码:将字符转换成二进制数
  • 解码:将二进制数转换成字符
  • 乱码:编码和解码使用的字符集不一致就会导致乱码
  • 请求乱码
    • 请求由浏览器发送给服务器
      • 浏览器编码:浏览器编码的字符集有HTML页面决定,具体有HTML页面中的meta标签决定
      • 服务器解码:服务器默认的字符集是ISO-8859-1
      • 由于两者的字符集不一致所以导致乱码
      • 解决方案
        • 对于POST请求
          //该操作一定要在第一次获取请求参数之前
          request.setCharacterEncoding("utf-8");
        • 对于GET请求
          • 由于get请求的请求参数在地址栏中,在到达Servlet之前已经被服务器进行解码,所以在Servlet里使用POST请求的方式设置字符集就不管用了。
          • 这个时候我们需要改变服务器URL解码的字符集,在server.xml文件中的Connector标签中添加URIEncoding="UTF-8"
     <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
  • 响应乱码
    • 响应由服务发送给浏览器
      • 服务器编码:服务器默认的字符集是ISO-8859-1
      • 浏览器解码:浏览器解码默认的字符集是GBK
      • 解决方案
        • 通过以下两种方式设置
          //通过以下两种方式告诉浏览器使用UTF-8字符集进行解码
          //方式一:
//        response.setHeader("Content-Type", "text/html;charset=utf-8");
          //方式二:
          response.setContentType("text/html;charset=UTF-8");
      • 设置了响应头之后浏览器就会使用设置的字符集进行解码,同时在Servlet中也会使用该字符集进行编码
1 0
原创粉丝点击