1. 程式人生 > >java--jsp(Java Server Page)_1

java--jsp(Java Server Page)_1

JSP技術簡介
JSP是Java Server Page的縮寫,它是Servlet的擴充套件,它的作用是簡化網站的建立和維護。
JSP是HTML程式碼與Java程式碼的混合體。
JSP檔案通常以JSP或JSPX的副檔名。
JSP擁有自己的語法。
JSP形式上像HTML,但本質上是Servlet。
JSP的出現,使得將Web開發中的HTML與業務邏輯程式碼有效分離成為可能。通常JSP只負責生成動態的HTML文件,而業務邏輯由其他Java元件如JavaBean來實現。JSP可以通過Scriptlet來訪問這些元件。
< % %>
ContentType與pageEncoding的區別:


pageEncoding是jsp檔案本身的編碼 ,把jsp檔案編譯成java的時候給編譯器用的 。
contentType的charset是指伺服器傳送給客戶端時的內容編碼 ,是瀏覽器解析網頁的時候用的
如果兩個任意設定了其中一個,另一個即會與此保持一致。但,contentType除可以設定charset外,還可以設定MIME型別,如text/html
Tomcat首次訪問JSP的過程:
當瀏覽器(客戶端)首次請求時,如果沒有此jsp對應的servlet的class檔案,tomcat會把jsp檔案翻譯成servlet原始檔.java,再編譯成servlet的.class檔案,把.class 檔案傳送給瀏覽器,讓瀏覽器解析.class檔案。如果有,就呼叫。
容器按照以下順序處理JSP請求

1、查詢與JSP檔案對應的Servlet,如果已經存在,就呼叫它的服務方法。
2、如果與JSP對應的Servlet不存在,就解析檔案系統中的JSP檔案,將它翻譯成Servlet原始檔,接著把Servlet原始檔編譯成Servlet類,然後再去初始化並執行Servle。
下是經過翻譯的JSP檔案,可見在它的服務方法中存在以下對像
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;

JSP語法:
SP指令 < %@ 指令名 屬性=“值”%>
JSP宣告 成員變數,或是成員方法。<%! …. %>
Java程式片段 不論有多少這樣的程式碼塊,都將包含_jspSerivice方法中。<% … %>
Java表示式 快速輸出資訊. _jspSerivice。<%= …%>
JSP隱含對像 pageContext.request,response,session,confing,application

JSP指令-page:

語法:<%@ 指令名 屬性=“值”%>
Page指令-用於指定所使用的語言,及匯入的包。
屬性說明:
language – 示例:language=“java”
import -如: (注意多個引用之間使用逗號分開。)
<%@ page import=“java.util.,java.sql.”%> contentType – 指定響應結果的MIME型別。預設為text/html;charset=ISO-8859-1
session = true | false –指定jsp頁面是否使用session.
errorPage = url – 指定當發生異常時轉發到哪一個頁面。
isErrorPage = true|false, - 表示此頁是處理異常的頁面。
pageEncoding – 設定頁面的編碼方式,此編碼方式,會自動應用到contentType中的charset上,如果沒有設定content-Type的話。顯示時以content-Type為準。建議這兩個值應該設定一個或至少應該一致。建議設定content-Type
buffer = none | 8kb | sizeb – 設定頁面緩衝區大小。-建議不要修改此值。

JSP指令-taglib—標籤庫:
taglib指令,用於在頁面上宣告要使用的自定義標籤。
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>
uri – 指定自定義的標籤的引用URI。
Prefix-指定使用時的字首。
如:
此內容將在講自定義標籤時具體講。
JSTL :java Standard Tag Lib
URL – 統一資源定位符
URI – 統一資源識別符號.—XML namespace=“http://hncu.cn
這裡寫圖片描述

這裡寫圖片描述

<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" import="java.util.*,java.awt.*" errorPage="jsps/error.jsp" pageEncoding="UTF-8"%>
<!-- jsp中的導報:1.import   2.","+包 -->
<!-- isErrorPage="true":錯誤頁面 -->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>JSP技術演示</title>
  </head>

  <body>
    <h2>這是主頁</h2>
    cForEach:<c:forEach begin="0" end="10">
        這裡相當於for迴圈...<br/>
    </c:forEach>
    <%
         for(int i=3;i<10;i++){  //注意JSP表示式不能用;號結束
     %>
           <%=i %><br/>
     <%
         }
     %>

    <%//JSP的Java程式片段和JSP表示式:
        //可以宣告多個Java片段,它們都位於_jspService方法中。
        int a=100;
        out.println(a+"<br/>");//JspWriter
        //jsp八個隱藏物件--用PageContext()可以獲取


        Button b=new Button("測試導報");//在page指令中import屬性新增,java.awt.*
        Date d=new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time=sdf.format(d);
        out.println(time+"<br/>");

        //JSP中的區域性變數---在底層函式 _jspService()內都有效
        String str="湖南城院";

        //錯--底層函式_jspService()內不可巢狀函式
        //void hello(){
        //}

        //pageContext.setAttribute("name", "page1111");
        //request.setAttribute("name", "req22222");
        //session.setAttribute("name", "session33333");
        application.setAttribute("name", "app44444");


     %>

     <%!//JSP宣告
     //宣告函式或者變數,JSP中的成員變數或方法----在index_jsp.java中和  _jspService()並列的方法
        //語法:
        int t=1;
        String hello(){
            return "hello";
        }
        //可以宣告靜態變數,也可以宣告靜態方法。可以多個JSP宣告的程式碼塊。
      %>

      <%out.println("out.println_str:"+str+"<br/>");//在底層函式 _jspService()內訪問它的的區域性變數 
        out.println("out.println_hello():"+hello()+"<br/>");//在底層函式 _jspService()內訪問它的的成員變數


        //依次從pageContext開始request,session,application,從小到大尋找一個name屬性的值
        String name=(String)pageContext.findAttribute("name");
        out.println("out.println_name:"+name+"--pageContext.,request,session,application中之一的name屬性值<br/>");

        String name2=(String)pageContext.findAttribute("name2");
        out.println("out.println_name2:"+name2+"<br/>");//null
      %>

      $_name:${name}--pageContext.,request,session,application中之一的name屬性值<br/><!-- el表示式 -->
      $_name2:${name2}若4個容器中都不存在該屬性,什麼也不輸出(不會輸出null)<br/><!-- 若4個容器中都不存在該屬性,什麼也不輸出(不會輸出null) -->

      <!-- 快速輸出, 小細節: %=兩者緊挨著,結尾處不要新增";"號 -->
      <%="快速輸出str:"+str+"<br/>" %>
      <%="快速輸出hello():"+hello()+"<br/>" %>
      <%="快速輸出name:"+name+"<br/>" %>
      <%="快速輸出name2:"+name2+"<br/>" %><!-- 輸出null -->

     <% //exception.getStackTrace();//必須在page指令中新增屬性isErrorPage="true" 
        //使用exception,必須在Page指令中新增屬性:isErrorPage="true"
     %>

     <%
     //以下用於測試erroPage屬性
     //int i = 100/0;   
   %>

  </body>
</html>
<%@ page session="false" language="java" import="java.util.*,java.awt.*" isErrorPage="true" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>錯誤...</title>
  </head>

  <body>
    <h1>這是錯誤頁面</h1>

     <%
        out.println(exception);
        //session.getAttribute("aa");
      %>
  </body>
</html>