• Servlet 学习笔记3


    一、HttpServletRequest类

    a)HttpServletRequest类的作用

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

    b)HttpServletRequest类的常用方法

    getRequestURI();    获取请求的资源路径
    getRequestURL();    获取请求的统一资源定位符(绝对路径)
    getRemoteHost();    获取客户端的ip地址
    getHeader();        获取请求头
    getParameter();     获取请求的参数
    getParameterValues(); 获取请求的参数(多个值的时候使用)
    getMethod();        获取请求的方式
    setAttribute();     设置域数据
    getAttribute();     获取域数据
    getRequestDispatcher(); 获取请求转发对象
    1. public class RequestAPIServlet extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. // getRequestURI(); 获取请求的资源路径
    5. System.out.println("URI => " + req.getRequestURI());
    6. // getRequestURL(); 获取请求的统一资源定位符(绝对路径)
    7. System.out.println("URL => " + req.getRequestURL());
    8. // getRemoteHost(); 获取客户端的ip地址
    9. System.out.println("客户端ip地址:" + req.getRemoteHost());
    10. /*在IDEA中,使用localhost访问时,得到的客户端ip地址为 127.0.0.1
    11. * 如果使用真实的ip地址如 http://192.168.184.1:8088/web04_servlet/request
    12. * 得到的客户端ip地址为真实ip地址*/
    13. // getHeader(); 获取请求头
    14. System.out.println("请求头User-Agent:"+req.getHeader("User-Agent"));
    15. /*Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36*/
    16. // getMethod(); 获取请求的方式
    17. System.out.println("请求的方式:" + req.getMethod());
    18. }

    运行结果:

    1. URI => /web04_servlet/request
    2. URL => http://192.168.184.1:8088/web04_servlet/request
    3. 客户端ip地址:192.168.184.1
    4. 请求头User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36

    获取请求参数:

    1. public class ParameterServlet extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //获取请求参数
    5. String username = req.getParameter("username");
    6. String password = req.getParameter("password");
    7. String[] hobby = req.getParameterValues("hobby");
    8. System.out.println("用户名:" + username);
    9. System.out.println("密码:" + password);
    10. System.out.println("兴趣爱好:" + Arrays.asList(hobby));
    11. }
    12. }

    运行结果:

    1. 用户名:12345
    2. 密码:wee
    3. 兴趣爱好:[cpp, java, js]

    【post请求中文乱码问题】:

    在doPost()方法中修改编码集, 注意要在获取请求参数之前调用才有效!

    req.setCharacterEncoding("UTF-8");

    c)请求转发

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

    1. public class Servlet1 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //一个业务需要先在servlet1中执行 再去servlet2
    5. //查看参数
    6. String username = req.getParameter("username");
    7. System.out.println("在servlet1中查看参数:" + username);
    8. //使用域数据 给材料盖一个章 并传递到servlet2去查看
    9. req.setAttribute("key","Servlet1 over");
    10. //问路 servlet2的路
    11. /*请求转发 必须要以斜杠打头, 斜杠表示地址为http://ip:port/工程名, 映射到idea代码的web目录*/
    12. RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
    13. //走向 servlet2
    14. requestDispatcher.forward(req, resp);
    15. }
    16. }
    1. public class Servlet2 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. //查看参数
    5. String username = req.getParameter("username");
    6. System.out.println("在servlet2中查看参数:" + username);
    7. //查看servlet1是否盖章over key一定要相同!
    8. Object key = req.getAttribute("key");
    9. System.out.println("servlet1是否结束:" + key);
    10. //处理自己的业务
    11. System.out.println("servlet2 处理了自己的业务");
    12. }
    13. }

    【请求转发的特点】

    1、浏览器地址栏没有变化

    2、他们是一次请求

    3、他们共享Request域中的数据

    4、请求转发可以进入到WEB-INF目录下

    5、不可以访问工程以外的资源,只能在自己的工程中跳转

    d)base标签的作用

    base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。否则会默认以当前浏览器地址栏中的地址为参考。

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <base href="http://localhost:8088/web04_servlet/a/b/">
    7. head>
    8. <body>
    9. 这是a下的b下的c.html页面<br/>
    10. <a href="../../index.html">跳回首页a><br/>
    11. body>
    12. html>

    h)web中 / 斜杠的不同意义

    web中, / 斜杠是一种绝对路径

    / 斜杠如果被浏览器解析,得到的地址是 http://ip:port/

    / 斜杠如果被服务器解析,得到的地址是 http://ip:port/工程路径

           如:/forwardc

                servletContext.getRealPath("/");

                request.getRequestDispatcher("/");

    特殊情况:response.sendRediect("/") 请求重定向,把斜杠发送给浏览器解析,得到 http://ip:port/

  • 相关阅读:
    Java运算符
    java计算机毕业设计项目材料管理系统源代码+数据库+系统+lw文档
    NEXT.js环境变量使用
    防止 PHP 应用程序中的 SQL 注入 - 简单而权威的指南
    setViaGenMode
    使用Composition API和setup语法糖重构Vue组件
    比较3个结构之间的关系
    CORE EMU初接触
    kube-ovn安装与卸载
    9. Java字符串支持正则表达式的方法
  • 原文地址:https://blog.csdn.net/hhhxykeke/article/details/126783144