Java之JSP

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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章