Servlet中三大域对象详解----[笔记]

刚学javaWeb时对一些信息的获取有一些不懂,请求行获取的信息和请求域获取的信息有什么不一样的?除了方法不一样…但是搞清楚了原理,一切迎刃而解;如果你也有疑惑,那就看看这篇文章吧!

请求行

就是浏览器地址栏处的信息-----
在这里插入图片描述当请求信息时有时候我们会填写一些信息,然后到服务器中去请求;
举个很常见的例子---->>>百度搜索关于javaweb的一些内容

在这里插入图片描述红色方框处是我们的请求内容,其他内容是百度服务器自己添加的一些关于请求信息的内容;

那我们怎样获得请求信息呢?

来一个简单的网页----

<!DOCTYPE html>
<html >
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="get" action="MyServlet2.do">
    账&emsp;户:<input type="text" name="user" required><br>
   密&emsp;码:<input type="password" name="pwd" required><br>
    <input type="submit"value="登录">
</form>
</body>
</html>

在浏览器中输入账户,密码
在这里插入图片描述


//这里是绝对路径
@WebServlet(urlPatterns = "/MyServlet2.do")
public class MyServlet1 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得请求行的信息
        String user = req.getParameter("user");
        String pwd = req.getParameter("pwd");
        System.out.println(user);
        System.out.println(pwd);
    }
}

点击登录,则会在控制台上打印账户和密码
在这里插入图片描述
关于请求行中的信息,是以键值对的形式存储的,获得请求行中的信息----
req.getParameter(“user”);

图解请求行信息----

在这里插入图片描述

请求域

对于请求行,它是通过HttpServletRequest req 来获取请求行中的信息;
关于请求域,其实它也是一个对象,

什么是域对象?
那些能放数据并存储传递数据作为数据存放区域的对象 简单来说就是能够存储数据,获取数据,传递数据的对象

Servlet中有三大域----------对象------------------作用范围

Request域 HTTPServletRequest 一次请求/请求转发
Session域 HTTPSession 一次会话(跨请求)
Application域 ServletContext 任意一次请求和会话(跨会话)

请求域中的信息怎么获取呢


@WebServlet(urlPatterns = "/MyServlet10.do")
public class MyServlet10  extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //向Request域中添加数据
        List<String> g= new ArrayList<>();
        Collections.addAll(g,"a","b","c");
        req.setAttribute("list",g);
        req.setAttribute("java","工程师");
        req.setAttribute("Python","人工智能");
        //当键值对的name相同时,会取后面一个
        req.setAttribute("java","全栈工程师");
        //请求转发到MyServlet11,以上信息才能继续存活
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("MyServlet11.do");
        requestDispatcher.forward(req,resp);
    }
}

这里采用请求转发的形式,请求转发到MyServlet11,以上信息才能继续存活


@WebServlet(urlPatterns = "/MyServlet11.do")
public class MyServlet11 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       /* Enumeration<String> names = req.getAttributeNames();
        while (names.hasMoreElements()) {
            String s = names.nextElement();
            System.out.println(s + "--" + req.getAttribute(s));
        }*/
        System.out.println(req.getAttribute("list"));
        System.out.println(req.getAttribute("java"));
        System.out.println(req.getAttribute("Python"));

    }
}

而如果是响应重定向,则会得到null;
在这里插入图片描述
什么原因呢?
原因就在于如果是请求转发,则会将请求对像和响应对象通通转发给目标服务器,而如果是响应重定向,则会再目标服务器上新建一个请求对象;

请求域中的方法------->>>>

setAttribute(name,value); 设置修改数据
getAttribute(name);获得数据的方法
removeAttribute(name);移除数据的方法

三大域对象的作用范围是不同的----
在这里插入图片描述

Session域

有效范围

单次会话内有效,可以跨多个请求

生命周期

创建 会话的产生,第一次发生请求-----会话的开始

**使用 本次会话之内,**浏览器和服务器之间发生多次请求和响应有效

销毁 会话结束,如:浏览器失去JSESSIONID、到达最大不活动时间、手动清除


@WebServlet(urlPatterns = "/MyServlet10.do")
public class MyServlet10  extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //向Request域中添加数据
        List<String> g= new ArrayList<>();
        Collections.addAll(g,"a","b","c");
        HttpSession session = req.getSession();
        session.setAttribute("list",g);
        session.setAttribute("java","工程师");
        session.setAttribute("Python","人工智能");
        //当键值对的name相同时,会取后面一个
        session.setAttribute("java","全栈工程师");
        //请求转发到MyServlet11,以上信息才能继续存活
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("MyServlet11.do");
        requestDispatcher.forward(req,resp);
    }
}

@WebServlet(urlPatterns = "/MyServlet11.do")
public class MyServlet11 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            HttpSession session = req.getSession();
        System.out.println(session.getAttribute("list"));
        System.out.println(session.getAttribute("java"));
        System.out.println(session.getAttribute("Python"));

    }
}

request域在一次请求到一次响应----生命周期结束,当然中间还可以加上请求转发;
在这里插入图片描述

在这里插入图片描述

Application域


@WebServlet(urlPatterns = "/MyServlet12.do")
public class MyServlet12 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //向Request域中添加数据
        List<String> g= new ArrayList<>();
        Collections.addAll(g,"a","b","c");
        ServletContext application = this.getServletContext();
        application.setAttribute("list",g);
        application.setAttribute("java","工程师");
        application.setAttribute("Python","人工智能");
        //当键值对的name相同时,会取后面一个
        application.setAttribute("java","全栈工程师");

    }
}


@WebServlet(urlPatterns = "/MyServlet13.do")
public class MyServlet13 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        System.out.println(servletContext.getAttribute("list"));
        System.out.println(servletContext.getAttribute("java"));
        System.out.println(servletContext.getAttribute("Python"));

    }
}

怎么体现Application域作用范围更大呢?

1—可以关掉浏览器然后重新访问;
2,–换一个浏览器访问;
在这里插入图片描述在这里插入图片描述在这里插入图片描述

application的生命周期随着服务的启动而开始,随着服务起的关闭/重启而结束;
由于生命周期太长,不适合放一些用户数据,避免application域中的信息太多而过于臃肿,
application域中适合放一些关于服务器的配置信息等域服务其相关的数据;

Application域

有效范围

当前web服务内,跨请求,跨会话

生命周期

创建 项目启动

使用 项目运行任何时间有效

销毁 项目关闭

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeMartain

祝:生活蒸蒸日上!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值