Servlet-2

1.HttpServletRequest类

a.HttpServletRequest类的作用

  • 每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。
  • 然后传递到service方法(doGet,doPost)中给我们使用。我们可以通过该类对象,获取到所有请求信息。

b.HttpServletRequest类的常用方法

  1. getRequestURI() 获取请求的资源路径
  2. getRequestURL() 获取请求的统一资源定位符(绝对路径)
  3. getRemoteHost() 获取客户端的ip地址
  4. getHeader() 获取请求头
  5. getParameter() 获取请求的参数
  6. getParameterValues() 获取请求的参数(多个值时使用)
  7. getMethod() 获取请求方式(get/post)
  8. SetAttribute(key, value) 设置域数据
  9. getAttribute(key) 获取域数据
  10. getRequestDispatcher() 获取请求转发对象

c.获取请求参数

设置表单:

用户名:
密码:
兴趣爱好: java c++

获取参数:

    String username = req.getParameter("username");
    String password = req.getParameter("password");
    String[] hobby = req.getParameterValues("hobby");

    System.out.println(username);
    System.out.println(password);
    System.out.println(Arrays.asList(hobby));

注:若需通过post获取输入中文字符需设置req.setCharacterEncoding("UTF-8");
且需将其设置在所有getParameter之前

d.请求的转发

  • 请求转发是指服务器收到请求后,从一个资源跳转到另一个资源的操作。
    image

通过servlet1,2模拟请求转发过程
servlet1:

    //获取请求参数
    String username = req.getParameter("username");
    System.out.println("servlet1查看参数: " + username);

    //盖章
    req.setAttribute("key", "done");

    //问路
    //请求转发必须要以/打头,/表示地址为http://ip:port/工程名/,映射到IDEA代码的web目录
    RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");

    //走向柜台2
    requestDispatcher.forward(req,resp);

servlet2:

    //获取请求参数
    String username = req.getParameter("username");
    System.out.println("servlet2查看参数: " + username);

    //查看柜台1是否有盖章
    Object key = req.getAttribute("key");
    System.out.println("柜台1是否有章: " + key);

    //处理自己的业务
    System.out.println("Servlet2处理自己的业务");

请求转发的特点:

  1. 浏览器地址栏没有变化
  2. 他们是依次请求
  3. 他们共享Request域中的数据
  4. 可以转发到WEB_INF目录下(可以通过请求转发访问WEB_INF)
  5. 不可以访问工程以外的资源(都是基于当前工程下的地址访问)
  6. 请求转发必须要以/打头,/表示地址为http://ip:port/工程名/,映射到IDEA代码的web目录

e.base标签的作用

(通过请求转发来进行深层跳转时无法返回浅层页面)

  • base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。(设置页面相对路径工作时参考的地址)

用法:在head中设置base:
<base href="http://localhost:8080//web_02_war_exploded/a/b/c.html">

image

f.web中的相对路径和绝对路径

  1. 相对路径: . 表示当前目录;.. 表示上一级目录;资源名 表示当前目录/资源名
  2. 绝对路径: http://ip:port/工程路径/资源路径

h.web中/的不同意义

  • web中'/'为一种绝对路径。
  • '/'若被浏览器解析,得到的地址是: http://ip:port/
  • '/'若被服务器解析,得到的地址是: http://ip:port/工程路径
  • 特殊情况(请求重定向):respose.sendRediect("/"); 表示把'/'发送给浏览器解析,得到http://ip:port/

2.HttpServletResponse类

a.HttpServletResponse类的作用

  • 与HttpServletResquest类一样,每次请求进来,Tomcat服务器就会创建一个Response对象传递给Sertvlet程序去使用。
  • HttpServletRequest表示请求过来的信息。
  • HttpServletResponse表示所有相应的信息。
  • 若需要设置返回给客户端的信息,都可以通过Response对象来进行设置。

b.两个输出流的声明(通过流传送给客户端)

  1. 字节流: getOutPutStream(); 常用于下载(传递二进制数据)
  2. 字符流 getWriter(); 常用于回传字符串(常用)
  • 两个流同时只能使用一个。(使用了字节流就不能再使用字符流,反之亦然)

c.如何向客户端回传数据(回传字符串数据)

    PrintWriter writer = resp.getWriter();
    writer.println("response's content!!");

d.解决相应中文乱码

方案一:

  1. 设置服务器字符集为UTF-8
    resp.setCharacterEncoding("UTF-8");

  2. 通过响应头设置浏览器使用UTF-8
    resp.setHeader("Content-Type", "text/html; charset=UTF-8");

方案二:

  • 同时设置服务器和客户端同时使用UTF-8字符集,还设置了响应头(获取流对象之前调用)
    resp.setContentType("text/html; charset=UTF-8");

e.请求重定向

方案一

  • 请求重定向指客户端给服务器发请求,然后服务器告诉客户端一个新地址,使其访问新地址(之前地址可能被废弃/停用)。

用法:

    //设置响应状态码为302表示重定向(已搬迁)
    resp.setStatus(302);

    //设置响应头,说明新得地址在哪里
    resp.setHeader("Location", "http://localhost:8080//web_02_war_exploded/response2");

image

  1. 地址栏会发生变化
  2. 两次请求
  3. 不共享Request域中的数据(两次Response两次请求)
  4. 不可以访问WEB-INF下的资源(两次请求均为浏览器发送服务器)
  5. 可以访问工程外的资源

方案二(推荐使用)

(302是固定的)一行搞腚: resp.sendRedirect("http://www.baidu.com");

posted @ 2021-09-06 16:40  rttrti  阅读(45)  评论(0编辑  收藏  举报