JSP
JSP,能够直接使用Html代码,然后在html中写java代码的工具
学习网站:how2java
文章目录
(一)、JSP的执行过程
以 hello.jsp文件为例:
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%> 你好 JSP <br> <%=new Date().toLocaleString()%>
- 将hello.jsp转译为 hello_jsp.java;(hello_jsp.java位于tomat\work\Catalina\_\org\apache\jsp)
- hello_jsp.java是一个servlet,把hello_jsp.java编译为 hello_jsp.class;
- 执行hello_jsp , 生成html
- 通过http协议将html响应返回给浏览器
-
jsp文件转译成的Java程序是一个servlet
因为该类继承了 HttpJspBase ,而HttpJspBase继承了HttpServlet类所以可以说jsp文件转译生成的Java是一个servlet。
Jsp 执行过程
(二)、JSP的页面元素
-
静态内容
html,css,javascript等内容
-
指令
以<%@开始%>结尾,比如<%@page import=“java.util.*”%>
-
表达式 <%=%>
输出一段html
<%=%>与<%out.println%><
两者是等价的,out是jsp的隐式对象,可以直接使用。隐式对象一共有9种,参考 隐式对象 章节。
注: <%=%> 不需要分号结尾,<%%> 需要以分号结尾,和java代码一样
-
Scriptlet
在<%%>之间,可以写任何Java代码
-
声明
在<%!%>之间可以声明字段或方法,但不建议这么做
-
动作
<jsp:include page=“Filename”>
在jsp页面中包含另外一个页面。
-
注释<%-- --%>
不同于html的注释 ,通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了
Jsp 页面元素
(三)、Jsp中的include
几乎每个页面都需要加上的信息部分页面,比如每个网页最下方的版权声明信息,可以使用include包含,就可以避免每个网页都要单独写还有修改公共信息页面的工作量
-
指令include
<jsp:include file="footer.jsp"/>
指令include中footer.jsp的内容会被插入到 jsp转译成的 .Java中,最后只会生成一个Java文件。所以在hello.jsp中定义的变量,可以直接在footer.jsp访问
-
动作include
<jsp:include page="footer.jsp"/>
动作include中footer.jsp的内容不会被插入到jsp转译的.Java文件中,会有一个footer.java独立存在。每个包含footer.jsp的页面在服务器访问footer_jsp.java,然后把返回的结果嵌入到响应中。
动作include 是对footer.jsp进行一次独立的访问,需要进行传参。
<%! hello.jsp %> <%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%> 你好 JSP <%=new Date().toLocaleString()%> <jsp:include page="footer.jsp"> <jsp:param name="year" value="2017" /> </jsp:include> <%! footer.jsp %> <hr> <p style="text-align:center">copyright@<%=request.getParameter("year")%> </p>
(四)、跳转
跳转分为客户端跳转和服务端跳转
-
客户端跳转
<% response.sendRedirect("hello.jsp"); %>
客户端跳转效果在浏览器的调试工具中可以看到,访问jump.jsp时返回302(指临时客户端跳转),再跳转到hello.jsp中
-
服务端跳转
<% request.getRequestDispatcher("hello.jsp").forward(request, response); %> <%! 或者 %> <jsp:forward page="hello.jsp"/>
客户端跳转和服务端跳转的区别:
服务端跳转
客户端跳转
(五)、cookie
cookie是一种浏览器和服务器交互数据的方式
- Cookie由服务器创建,但不会保存在服务器
- 创建好之后发送给浏览器保存在用户本地。
- 在下次访问网站时候,就会把cookie发送给服务器
setCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
Cookie c = new Cookie("name", "Gareen");
c.setMaxAge(60 * 24 * 60);//cookie保留时间
c.setPath("127.0.0.1"); //服务器主机名
response.addCookie(c); //通过response将这个cookie保存到浏览器端口
%>
<a href="getCookie.jsp">跳转到获取cookie的页面</a>
getCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
Cookie[] cookies = request.getCookies();
if (null != cookies)
for (int d = 0; d <= cookies.length - 1; d++) {
out.print(cookies[d].getName() + ":" + cookies[d].getValue() + "<br>");
}
%>
(六)、Session(会话)
会话Session指的是从用户打开浏览器访问网站开始,无论在这个网站中访问了多少个页面,点击了多少链接,都属于同一个会话,知道该用户关闭浏览器为止,这都属于一个会话Session。
setSession.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
session.setAttribute("name", "teemo");
%>
<a href="getSession.jsp">跳转到获取session的页面</a>
getSession.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
String name = (String)session.getAttribute("name");
%>
session中的name: <%=name%>
Session 的有效期
登录一个网站后,在短时间内可以继续访问而不用重新登录。但如果长时间不登陆,过了Session的有效期,依然会要求重新登录。
Session的有效期在Tomcat中默认配置是30min。
可以通过在tomcat/conf/web.xml中的session-config配置中进行调整
(七)、JSP作用域
Jsp中的四个作用域:
- pageContext 当前页面
- requestContext 一次请求
- sessionContext 当前会话
- applicationContext 全局,所有用户共享
7.1 pageContext 当前页面
通过pageContext.setAttribute(key,value)的数据,只能在当前页面访问,在其他页面不能访问。
7.2 requestContext 一次请求
表示随着本次请求结束,其中的数据也就被回收了。
常用写法如下:
request.setAttribute("name","gareen");
request.getAttribute("name")
还可以用pageContext来做,不过不常用,如下:
pageContext.setAttribute("name","gareen",pageContext.REQUEST_SCOPE);
pageContext.getAttribute("name",pageContext.REQUEST_SCOPE)
(1)requestContext与服务端跳转
requestContext指的是一次请求
如果发生了服务端跳转,从setContext.jsp跳转到getContext.jsp,这其实,还是一次请求。 所以在getContext.jsp中,可以取到在requestContext中设置的值
这也是一种页面间传递数据的方式
setContext.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setAttribute("name","gareen");
%>
<jsp:forward page="getContext.jsp"/>
getContext.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%=request.getAttribute("name")%>
(2)requestContext与客户端跳转
客户端跳转时,浏览器会发生一次新的访问,新的访问会产生一个新的request对象
所以再页面跳转的情况下,是无法通过request传递数据的。
setContext.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8" %>
<%
request.setAttribute("name","gareen");
response.sendRedirect("getContext.jsp");
%>
getContext.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%=request.getAttribute("name")%>
7.3 sessionContext 当前会话
指的是会话,从一个用户打开网站的那一刻起,无论访问了多少网页,链接都属于同一个会话,直到浏览器关闭。
故页面间的传递数据,也是可以通过Session传递的。但不同用户对应的session是不一样的,所以session无法在不同的用户之间共享数据。
sessionContext的用法与requestContext类似:
- setContext.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
session.setAttribute("name","gareen");
response.sendRedirect("getContext.jsp");
%>
- getContext.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%=session.getAttribute("name")%>
也可以用如下方式:
pageContext.setAttribute("name","gareen",pageContext.SESSION_SCOPE);
pageContext.getAttribute("name",pageContext.SESSION_SCOPE)
7.4 applicationContext 全局
所有用户共享同一个数据。
在JSP中使用application对象,application对象是ServletContext接口的实例
可以通过request.getSevletContext()来获取;application映射的就是web应用本身。
故application == request.getServletContext()会返回true
下文待续
Jsp上手笔记(下)更新中,待续……