我们回忆如下所示:Session是对应一个浏览器,从这个浏览器访问的页面session相同。而ServletContext对应这一个服务器,不同浏览器访问都是对应着同一个ServletContext。
我们会把重要的文件放到WEB-INF文件夹下,因为这些文件是不可见的。同时把img,css,js,plugins等一些静态文件放到webapps文件夹下的static文件。
1.1 九大内置对象
(1)PageContext(页面的上下文) (存东西)
(2)Request (存东西)
(3)Response
(4)Session (存东西)
(5)Application(ServletContext)存东西
(6)config(ServletConfig)
(7)out
(8)page,不用了解
(9)exception
我们进行编写如下代码:这是可以存东西的四大对象:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- 内置对象--%>
<%
pageContext.setAttribute("name1","蕾峰编程总公司");
request.setAttribute("name2","蕾峰编程分公司2号");
session.setAttribute("name3","蕾峰编程分公司3号");
application.setAttribute("name4","蕾峰编程分公司4号");
%>
</body>
</html>
我们进行分析如下:
PageContext里面有个include方法,也能用这个方法来包含页面。forward方法也可以用来请求转发。getPage()得到当前的页面。
通过request.getParameter("");来获取参数。
request.getParameter("");
通过application.getResourceAsStream("");来获取流资源
application.getResourceAsStream("");
我们也可以通过相同的方式进行取:
<% pageContext.setAttribute("name1","蕾峰编程总公司"); request.setAttribute("name2","蕾峰编程分公司2号"); session.setAttribute("name3","蕾峰编程分公司3号"); application.setAttribute("name4","蕾峰编程分公司4号"); %> <%--脚本片段中的代码,会被原封不动生成到.JSP.java 要求:这里面的代码:必须保证java语法的正确性 --%> <% //从pageContext取出 pageContext.getAttribute("name1"); request.getAttribute("name2"); %>
我们进行寻找设置的时候,如下所示:
<% //从pageContext取出,我们通过寻找的方式来 Object name1 = pageContext.findAttribute("name1"); pageContext.findAttribute("name2"); pageContext.findAttribute("name3"); pageContext.findAttribute("name4"); %>
我们设置对象的时候,我们发现为Object,我们输入进去为Sting,我们将其改变为String,然后进行强制转换:
代码如下所示:
<% //从pageContext取出,我们通过寻找的方式来 String name1= (String) pageContext.findAttribute("name1"); String name2 = (String) pageContext.findAttribute("name2"); String name3 = (String) pageContext.findAttribute("name3"); String name4 = (String) pageContext.findAttribute("name4"); String name5 = (String) pageContext.findAttribute("name5"); //不存在 %>
我们找到后需要进行输出:
代码如下所示:<%--使用EL表达式进行输出 ${},ctrl+D为自动补全--%> <h1>取出的值为:</h1> <h3>${name1}</h3> <h3>${name2}</h3> <h3>${name3}</h3> <h3>${name4}</h3> <h3>${name5}</h3>
我们知道name5不存在,我们通过这种方式进行取的时候运行如下所示:
我们将name5的取出方式使用另一种如下所示:<h3><%=name5%></h3>
运行之后如下所示:
我们再进行查看该四大存的对象:
<%
pageContext.setAttribute("name1","蕾峰编程总公司"); //保存的数据只在一个页面中有效
request.setAttribute("name2","蕾峰编程分公司2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","蕾峰编程分公司3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","蕾峰编程分公司4号"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
我们利用画图来进行了解:
我们创建一个新的jsp,(pageDemo02.jsp)看是否可以取到这些东西:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--脚本片段中的代码,会被原封不动生成到.JSP.java
要求:这里面的代码:必须保证java语法的正确性
--%>
<%
//从pageContext取出,我们通过寻找的方式来
//从底层到高层(作用域):
String name1= (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5"); //不存在
%>
<%--使用EL表达式进行输出 ${},ctrl+D为自动补全--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3><%=name5%></h3>
</body>
</html>
我们运行如下所示:
我们发现我们再 pageContext和request里面存储的无法获取到。而session和application里面的可以获取到。这是和作用域有关系的。因为会话没有关浏览器会话还在线,所以为每个用户创建session访问到了3.而4号是针对服务器,服务器没有关,所以可以访问到4号。
与此同时我们发现pageContext.findAttribute("name1");我们是通过这种方式进行寻找的,那是否可以通过这种方式进行设置:pageContext.setAttribute
我们新建pageDemo03进行判断他的设置的作用:
我们进入源码如下所示:
我们点击进去之后,如下所示:
public void setAttribute(String name, Object attribute, int scope) { switch (scope) { case 1: this.mPage.put(name, attribute); break; case 2: this.mRequest.put(name, attribute); break; case 3: this.mSession.put(name, attribute); break; case 4: this.mApp.put(name, attribute); break; default: throw new IllegalArgumentException("Bad scope " + scope); } }
我们了解到scope为作用域。我们进行存储如下:
pageContext.setAttribute("hello1","hello1",PageContext);
我们进入PageContext的源码进行查看:
public static final int PAGE_SCOPE = 1; public static final int REQUEST_SCOPE = 2; public static final int SESSION_SCOPE = 3; public static final int APPLICATION_SCOPE = 4;
我们发现有四个常量,为他的作用域的设置:
我们进行设置如下所示:
<% pageContext.setAttribute("hello1","hello1",PageContext.SESSION_SCOPE); // session.setAttribute("hello1","hello1"); %>
这两个是相同的。
我们查看我们取寻找代码的设计:
<% //从pageContext取出,我们通过寻找的方式来 //从底层到高层(作用域):先从page->request->session->application,再找不到则会报null。 //JVM:双亲委派机制:寻找一个类,先从所导的包里找,后从类加载器里找,后去rt.jar包里找,都找不到,则返回class not found。 String name1= (String) pageContext.findAttribute("name1"); String name2 = (String) pageContext.findAttribute("name2"); String name3 = (String) pageContext.findAttribute("name3"); String name4 = (String) pageContext.findAttribute("name4"); String name5 = (String) pageContext.findAttribute("name5"); //不存在 %>
其中双亲委派机制如下所示:
我们设立:java.lang,之后设立String类:
我们设置test类的时候如下所示:
我们new一个对象,如下所示:
String s = new String();
我们进入String类,我们发现该类并不是我们所设置的类:
而是java自带的java.lang包。我们进行强制导入的时候,如下所示:
import java.lang.String;
我们进入该类的源码的时候,我们发现仍然是java自带的java.lang。
我们的测试类如下所示:
package java.lang; import java.lang.String; public class Test { public static void main(String []args){ //当前我们所写的这个程序。程序里面有个string,他不会给string,而会给他的扩展类, // 扩展类没有string,而是继续往上走,到rt.jar包。rt.jar包里面有String,用的是这个String,而不是底层应用的String. String s = new String(); } }
我们继续进行下来pageContext.forward的应用:
我们所设计的代码如下所示:命名为pageContextDemo03.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% pageContext.forward("/index.jsp"); %> </body> </html>
我们去实现到我们转发到我们所设计的index.jsp,
我们点击运行如下所示:
我们设计如下代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% pageContext.forward("/index.jsp"); //前端跳转用这个就可以跳转 //以上代码的原型为如下所示: request.getRequestDispatcher("/index.jsp").forward(request,response); //servlet后台这样子去写 %> </body> </html>
我们将pageContext.forward运用如下所示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%-- 内置对象--%> <% pageContext.setAttribute("name1","蕾峰编程总公司"); //保存的数据只在一个页面中有效 request.setAttribute("name2","蕾峰编程分公司2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据 session.setAttribute("name3","蕾峰编程分公司3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器 application.setAttribute("name4","蕾峰编程分公司4号"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器 %> <%--脚本片段中的代码,会被原封不动生成到.JSP.java 要求:这里面的代码:必须保证java语法的正确性 --%> <% //从pageContext取出,我们通过寻找的方式来 //从底层到高层(作用域): String name1= (String) pageContext.findAttribute("name1"); String name2 = (String) pageContext.findAttribute("name2"); String name3 = (String) pageContext.findAttribute("name3"); String name4 = (String) pageContext.findAttribute("name4"); String name5 = (String) pageContext.findAttribute("name5"); //不存在 pageContext.forward("/pageDemo02.jsp"); %> <%--使用EL表达式进行输出 ${},ctrl+D为自动补全--%> <h1>取出的值为:</h1> <h3>${name1}</h3> <h3>${name2}</h3> <h3>${name3}</h3> <h3>${name4}</h3> <h3><%=name5%></h3> </body> </html>
我们进行转发后,进入网址:http://localhost:9571/javaweb_jsp_war_exploded/PageContextDemo01.jsp
url不变,但是我们所看到的页面是转发的pageDemo02.jsp的页面。
但是我们访问pageDemo02的时候,页面仍然没有蕾峰编程分公司2号,因为请求还没有转发过来。
我们进行查看四大作用域:
pageContext.setAttribute("name1","蕾峰编程总公司"); //保存的数据只在一个页面中有效
request.setAttribute("name2","蕾峰编程分公司2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","蕾峰编程分公司3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","蕾峰编程分公司4号"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
request:客户端向服务器发送请求,产生的数据用户看完就没用了,比如:新闻,用户看完没用的。
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车,我们进行浏览的时候还可以往购物车里面加,不需要往数据库里面放。
application:客户端向服务器发送请求,产生的数据一个用户用完了,其他用户还可能使用,比如:聊天数据,