目录
1.1 什么是JSP
Java Server Pages.Java服务器端页面,JSP本质上就是Servlet!!用于动态web技术。
没有JSP时程序员是将前端页面转译成Java代码在类里面一个个out出去,非常麻烦。
1.2JSP和Html的区别
Html只给用户提供静态数据
JSP页面中可以嵌入Java代码,为用户提供动态数据。
1.3JSP原理
浏览器向服务器发送请求,不管访问什么资源,其实是在访问Servlet!
JSP最终也会被转为一个类!
咋先启动一个tomcat找到JSP看源码
发现它变成了个Java类!
发现JSP类最终还是继承了Servlet类,所以说它本质是个Servlet
再仔细往下看,它有类似于生命周期的函数
内置对象
final javax.servlet.jsp.PageContext pageContext; //页面上下文
javax.servlet.http.HttpSession session = null; //session
final javax.servlet.ServletContext application; //applicationContext
final javax.servlet.ServletConfig config; //config
javax.servlet.jsp.JspWriter out = null; //out
final java.lang.Object page = this; //page:当前Request;
Response;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
页面里面内置的代码
response.setContentType("text/html;charset=UTF-8"); //设置页面类型和字符集
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
我们会发现这些代码不就是我们之前在Servlet里面写的吗,而这些代码会在JSP页面里面自动执行 !!!
JSP里面的代码其实都转换成了我们原本在Servlet写的代码。
JSP执行流程
1.4JSP简单的代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%--JSP表达式
作用:用来将程序的输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date() %>
<%-- jsp脚本片段--%>
<%
int sum=0;
for(int i=0;i<100;i++){
sum+=i; }
out.println(sum);
%>
</body>
</html>
jsp代码基本被淘汰了不再细讲。
有个很坑壁的错误
如果你下面写了个hello.jsp
你访问时候访问路径必须写上后缀,只写hello会报错。。可能会为了和之后的springmvc用controller跳转区分开来吧。
1.5九大内置对象
PageContext 存东西
Request 存东西
Response
Session 存东西
Application【ServletContext】存东西
config【ServletConfig】
out
page,几乎不用
exception
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
pageContext.setAttribute("name","小红"); //保存的数据只在一个页面中有效
request.setAttribute("name2","小红2"); //保存的数据只有在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","小红3"); //保存的数据只有在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","小红4"); //保存的数据只有在服务器中生效,从打开服务器到关闭服务器
%>
<%
String name1=(String) pageContext.findAttribute("name");
%>
<%--用el表达式取出数据--%>
<h1>取出的值为</h1>
<h3>${name}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<%--用jsp--%>
<h3><%=name1%></h3>
</body>
</html>
这里我们先放入数据,如果在另一个页面去获取数据只能取到name3和name4的值,也就是只能取到session和application,为什么?
简单来说,session和application是可以跨页面的。
session是一次会话,那么应该是我们在自己电脑上的每个请求都可以获取session 而不是几个电脑共享这个数据 那是application。
又回到上面那个问题,为什么session和application可以跨页面?其实setAttribute可以有第三个参数,scope作用域。
源码:
1.6四大作用域
JSP四大作用域分别为:page、request、session、application。
第一个作用域是page
只在当前页面有效,也就是用户请求的页面有效。page只在当前页面有效,也就是用户请求的页面有效,当当前页面关闭或转到其他页面时,page对象将在响应回馈给客户端后释放。
第二个作用域是request
它在当前请求中有效。request可以通过setAttribute()方法实现页面中的信息传递,也可以通过forward()方法进行页面间的跳转,需要注意的是request是转发不是重定向,转发相对于浏览器来说是透明的,也就是无论页面如何跳转,地址栏上显示的依旧是最初的地址。
第三个作用域是session
它在当前会话中有效。当一个台电脑上的同一浏览器对服务器进行多次访问时,在这多次访问之间传递的信息就是session作用域的范围。它从浏览器发出第一个HTTP请求即可认为会话开始,但是会话结束的时间是不确定的,因为在浏览器关闭时并不会通知服务器,一般Tomcat设置的默认时间为120分钟,也可以通过 setMaxInactiveInterval(int)方法进行设置,或是通过invalidate()方法强制结束当前 会话。
第四个作用域是application
他在所有的应用程序中都有效,也就是当服务器开始到服务器结束这段时间,application作用域中存储的数据都是有效的,同样可以通过setAttribute赋值和getAttribute取值。
page太菜了,不怎么用了,其他的三个举个小例子理解一下