天天看點

JSP (二) -- JSP與HTML內建開發

目錄

  • 腳本
    • 普通腳本
    • 聲明腳本
    • 輸出腳本
  • JSP注釋
    • 文法規則
  • JSP指令
    • page指令
    • include指令
    • taglib指令
  • 動作标簽
    • include
    • useBean
    • setProperty
    • getProperty
    • forward
    • param
    • 内置對象
      • 四大域對象

腳本

腳本可以編寫Java語句、變量、方法或表達式。

普通腳本

文法:<% Java代碼 %>
<!--普通腳本-->
<%
      int b = 456 ; //局部變量
      out.println("我在普通腳本裡"); //可以直接輸出到頁面上
      System.out.println("哈哈哈哈");//輸出到控制台上
%>
           
  • 經驗:普通腳本可以使用所有Java文法,除了定義函數。

注意:

  • 腳本與腳本之間不可嵌套,腳本與HTML标簽不可嵌套。
  • 普通腳本裡面的變量為局部變量(_jspService方法裡面)。

聲明腳本

文法:<%! 定義變量、函數%>
<%! int i = 0; %>
<%! int a,b,c; %>
<%! Object object = new Object(); %>
<%!
      int a = 123; //全局變量

      //定義方法
      public void m1(){
            System.out.println("Hello World! , 你好!");
      }
%>
           

注意:

  • 聲明腳本聲明的變量是全局變量(轉為生成Servlet的成員變量)。
  • 聲明腳本的内容可以在普通腳本<% %>中調用。
  • 如果聲明腳本中的函數具有傳回值,可以直接使用輸出腳本調用<%=方法() %>

輸出腳本

文法:<%=Java表達式%>
<%= new java.util.Date()%>
           

注意:

  • 輸出腳本可以輸出帶有傳回值的函數。
  • 輸出腳本中不能加

    ;

JSP注釋

JSP注釋主要有兩個作用:為腳本代碼作注釋以及作為HTML内容注釋。

文法規則

文法 描述
<%--注釋--%> JSP注釋,注釋内容不會被發送至浏覽器甚至不會被編譯
<!--注釋--> HTML注釋,通過浏覽器檢視網頁源代碼時可以看見注釋内容

JSP指令

JSP指定用來設定與整個JSP頁面相關的屬性。
指令 描述
<%@ page ... %> 定義頁面的依賴屬性,比如腳本語言,error頁面,緩存需求等等
<%@ include ... %> 包含其他檔案
<%@ taglib ... %> 引入标簽庫的定義,可以是自定義标簽

page指令

  • 文法:<%@ page attribute1="value1" attribute2="value2" %>
  • Page指令為容器提供目前頁面的使用說明。一個JSP頁面可以包含多個page指令
屬性 描述
contentType 指定目前JSP頁面的MIME類型和知乎編碼格式
errorPage 指定目前JSP頁面發生異常時需要轉向的錯誤處理頁面
isErrorPage 指定目前頁面是否可以作為另一個JSP頁面的錯誤處理頁面
import 導入要使用的Java類
language 定義JSP頁面所用的腳本語言,預設是Java
session 指定JSP頁面是否使用session.預設為true立即建立,false為使用時建立
pageEncoding 指定JSP頁面的編碼格式
<%@ page contentType="text/html;charset=UTF-8" language="java" session="false" errorPage="error.jsp"  pageEncoding="utf-8" %>
<%@ page import="java.util.Date" %>
           

include指令

  • 文法:<%@include file="被包含的SP路徑" %>
  • 通過incdude指令來包含其他檔案。
  • 被包含的檔案可以是JSP檔案、HTML檔案或文本檔案。包含的檔案就好像是目前JSP檔案的一部分,會被同時編譯執行(靜态包含)。
<%@ include file="header.jsp">
...
...
<%@ include file="footer.jsp">
           

注意:有可能會有重名的沖突問題,不建議使用。

taglib指令

  • 文法:<%@ taglib uri="外部标簽庫路徑% prefix="字首" %>
  • 引入JSP的标準标簽庫
<%@ taglib uri="http://java.sun.com/jsp/jstl/core prefix="c"%>               
           

動作标簽

  • 文法:<jsp:action_name attribute="value" />

include

  • 文法:<jsp:include page="相對URL位址"/>
  • jsp:include 動作元素會将外部檔案輸出結果包含在JSP中(動态包含)
<jsp:inculde page="index.jsp"/>
           

注意:

前面已經介紹過include指令,它是将外部檔案的輸出代碼複制到了目前JSP檔案中。而這裡的jsp:include動作不同,是将外部檔案的輸出結果引入到了目前JSP檔案中。

useBean

  • 文法:<jsp:useBean id="name" class="package.className">
  • jsp:useBean 動作用來加載一個将在JSP頁面中使用的JavaBean。
<jsp:useBean id="user" class="com.zjw.User"/>
           
  • 在類載入後,我們可以通過jsp:setProperty和jsp:getProperty動作來修改和擷取bean的屬性。

setProperty

可以在jsp:useBean元素之後使用jsp:setProperty進行屬性的指派
屬性 描述
name name屬性是必須的。它表示要設定屬性的是哪個Bean。
property property屬性是必須的。它表示要設定的是哪個屬性。
value value屬性是可選的。該屬性用來指定Bean屬性的值。
<jsp:useBean id="user" class="com.zjw.bean.User"/>
<jsp:setProperty name="user" property="age" value="25"/>
<jsp:setProperty name="user" property="name" value="朱俊偉"/>
           

getProperty

jsp:getProperty動作提取指定Bean屬性的值,轉成字元串,然後輸出
屬性 描述
name 要檢索的Bean屬性名稱。Bean必須已定義。
property 表示要提取Bean屬性的值。
<jsp:getProperty name="user" property="name"/>
<jsp:getProperty name="user" property="age"/>
           

forward

  • 文法:<jsp:forward page="相對URL位址"/>
  • jsp:forward動作把請求轉到另外的頁面。

<jsp:forward page="index.jsp">

param

  • 文法:<jsp:param name="" value=""/>
  • 在轉發動作内部使用,做參數傳遞
<%
    request.setCharacterEncoding("UTF-8");
%>
<%--轉發--%>
<jsp:forward page="../index.jsp" >
    <jsp:param name="name" value="朱俊偉"/>
</jsp:forward>
           
<%=request.getParameter("name")%>
           

内置對象

由JSP自動建立的對象,可以直接使用
對象名 類型 說明
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
session javax.servlet.http.HttpSession 由session="true"開關
application javax.servlet.http.ServletContext
config javax.servlet.http.ServletConfig
exception javax.lang.Throwable 由isErrorPage="false"開關
out javax.servlet.jsp.JspWriter javax.servlet.jsp.JspWriter
pageContext javax.servlet.jsp.PageContext
page javax.lang.Object目前對象的this 目前servlet執行個體

四大域對象

JSP有四大作用域對象,存儲資料和擷取資料的方式一樣,不同的是取值的範圍有差别
  • pageContext(javax.servlet.jsp.PageContext)目前JSP頁面範圍
  • request(javax.servlet.http.HttpServletRequest)一次請求有效
  • session (javax.servlet.http.HttpSession) 一次會話有效(關閉浏覽器失效)
  • application(javax.servlet.ServletContext)整個Web應用有效(伺服器重新開機或關閉失效)
package com.zjw.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/scope")
public class Scope extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("request","request值");
        req.getSession().setAttribute("session","session值");
        req.getServletContext().setAttribute("application","servletContext值");
        System.out.println("servlet....");
        resp.sendRedirect(req.getContextPath()+"/scope/scope.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

           
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        pageContext.setAttribute("pageContext","pageContext值");
    %>
    <%=pageContext.getAttribute("pageContext")%><br>
    <%=request.getAttribute("req")%><br>
    <%=session.getAttribute("session")%><br>
    <%=application.getAttribute("application")%><br>
</body>
</html>