刚学javaWeb时对一些信息的获取有一些不懂,请求行获取的信息和请求域获取的信息有什么不一样的?除了方法不一样…但是搞清楚了原理,一切迎刃而解;如果你也有疑惑,那就看看这篇文章吧!
请求行与请求域
请求行
就是浏览器地址栏处的信息-----
当请求信息时有时候我们会填写一些信息,然后到服务器中去请求;
举个很常见的例子---->>>百度搜索关于javaweb的一些内容
红色方框处是我们的请求内容,其他内容是百度服务器自己添加的一些关于请求信息的内容;
那我们怎样获得请求信息呢?
来一个简单的网页----
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="get" action="MyServlet2.do">
账 户:<input type="text" name="user" required><br>
密 码:<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服务内,跨请求,跨会话
生命周期
创建 项目启动
使用 项目运行任何时间有效
销毁 项目关闭