JSP
JSP簡介
JSP指的是 JavaServerPages ,Java服務器端頁面,也和Servlet一樣,用來開發動態web
JSP頁面中可以嵌入java代碼爲用戶提供動態數據
JSP原理
JSP是如何執行的?瀏覽器在訪問java資源其實訪問的都是Servlet
JSP最終也會被轉換爲一個java類,JSP一般會繼承HttpJspBase而HttpJspBase繼承了HttpServlet,所以Jsp本質上也是個Servlet
public void _jspInit() {} //初始化
public void _jspDestroy() {} //銷燬
public void _jspService(HttpServletRequest request, HttpServletResponse response) //響應
在IDEA中的tomcat的index_jsp.java
文件內中大致有如下內容
1、判斷請求
if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS");
return;
}
2、初始化9個內置對象
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; //當前頁面
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
HttpServletRequest request //請求
HttpServletResponse response //響應
3、輸出頁面前增加的代碼
對內置類對象賦值。以下對象可以在jsp頁面內直接使用
response.setContentType("text/html"); //設置contentype
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;
在jsp文件中<% %>
內可以寫java代碼,在<% %>
java代碼會原封不動的輸出,如果是html代碼會被out.write("html代碼")這種形式進行輸出最終一起構造成了jsp頁面。
其實JSP中的內容大致就是java代碼,內置了9個對象方便我們調用,然後加上out.write()中輸出html代碼,兩者合在一起構造一個jsp文件,並且可以實現動態的與服務器端進行交互。
JSP基礎語法
1、JSP表達式
<%= 變量或表達式%>
當然這裏也可以用EL表達式${變量或表達式}
將其值取出。
<%--JSP表達式
作用:用來講程序的輸出,輸出到客戶端頁面上
<%= 變量或表達式%>
--%>
<%= new java.util.Date() %>
2、JSP腳本片段
<% 腳本片段 %>
<%--JSP腳本片段--%>
<%
int sum = 0;
for (int i = 0; i < 100; i++) {
sum = sum+i;
}
out.println("<h3>sum=" + sum + "</h3>");
%>
3、在代碼中嵌入html元素
<%--在代碼中嵌入html元素--%>
<%
for (int i = 0; i < 5; i++) {
%>
<h3>Hello,JSP <%=i%></h3>
<%
}
%>
JSP聲明 <%! >
<%!
static {
System.out.println("靜態代碼塊");
}
private String globalVal = "Zh1z3ven";
public void zh1z3ven(){
System.out.println("進入了方法" + globalVal);
}
%>
JSP聲明會被編譯到JSP生成餓Java類中。而上面其他三種會被生成到_jspService()
方法中。
JSP指令 <%@ %>
JSP常用指令:如上圖 基本就三個
<%@ page errorPage="/error/500.jsp" %> //指向自定義的報錯頁面
<%@ page isErrorPage="true" %> //是否爲錯誤頁面
<%@ include file="common/header.jsp"%> //在該位置包含jsp文件
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> //導入JSTL核心標籤庫
自定義錯誤頁面
<%@ page errorPage="/error/500.jsp" %> //指向自定義的報錯頁面
<%@ page isErrorPage="true" %> //是否爲錯誤頁面
Web.xml
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
包含文件
指令形式:
<%@ include file="common/header.jsp"%> //在該位置包含jsp文件
jsp標籤形式:
<jsp:include page="common/footer.jsp"></jsp:include>
test01.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page errorPage="/error/500.jsp" %>
<%@ include file="common/header.jsp"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
out.println("<h1>" + "我是主體內容" + "</h1>");
%>
<%@ include file="common/footer.jsp"%>
</body>
</html>
jsp標籤形式和jsp指令形式去做包含是有區別的。jsp指令形式會將要包含的內容用out.print()或者out.write()與當前頁面合二爲一。而jsp標籤形式是直接拿到這個jsp文件,在html標籤處去拼接頁面。一般會用jsp標籤形式
9大內置對象
- PageContext 存東西
- Request 存東西
- Response
- Session 存東西
- Application 【ServletContext】 存東西
- config 【ServletConfig】
- out
- page
- Exception
存儲屬性
<%--內置對象--%>
<%-- 4個存東西的對象--%>
<%
pageContext.setAttribute("name1", "Zh1z3ven1"); //保存的數據在一個頁面中有效
request.setAttribute("name2", "Zh1z3ven2"); //保存的數據在一次請求中有效,請求轉發會攜帶這個數據
session.setAttribute("name3", "Zh1z3ven3"); //保存的數據在一次會話中有效,從打開瀏覽器到關閉
application.setAttribute("name4", "Zh1z3ven4"); //保存的數據在服務器中有效,服務器崩了才丟數據
%>
其中 pagecontext的作用域是在當前頁面上下文,request的作用域是一次請求中,後面的session和application算是最大的了
作用域從低到高:pageContext ==> request ==> session ==> application
比如在另一個jsp頁面 就取不到pageContext和request設置的setAttribute。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--內置對象--%>
<%-- 4個存東西的對象--%>
<%
pageContext.setAttribute("name1", "Zh1z3ven1"); //保存的數據在一個頁面中有效
request.setAttribute("name2", "Zh1z3ven2"); //保存的數據在一次請求中有效,請求轉發會攜帶這個數據
session.setAttribute("name3", "Zh1z3ven3"); //保存的數據在一次會話中有效,從打開瀏覽器到關閉
application.setAttribute("name4", "Zh1z3ven4"); //保存的數據在服務器中有效,服務器崩了才丟數據
%>
<%
//通過find尋找到Attribute
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表達式輸出 ${}}--%>
<h1>取出的值爲:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
</body>
</html>