JSP總結(經典)

工程師WWW發表於2015-11-09

day1

JSP 定義:

    1)Java Server Page, Java EE 元件,本質上是 Servlet。

    2)執行在 Web Container.接收 Http Request,生成 Http Response(預設協議是 Http 請求和響應)

    3)JSP 使得我們能夠分離頁面的靜態 HTML 和動態部分——我們需要的技術。

    4)使頁面可以混和html程式碼、Java程式碼以及JSP標籤;允許訪問元件

  

Servlet的缺陷(JSP出現的原因):

    1)寫靜態頁面必須部署後才能看到效果,很難控制頁面的外觀。

    2)從技術角度來說Servlet是Java程式碼和HTML靜態程式碼的混合程式碼。

    3)從市場競爭角度來說,微軟推出了ASP產品。

  

JSP的改進:

    1)JSP是標籤式的文字檔案(區Servlet是Java檔案)

    2)JSP不需要編譯(其實是由伺服器監測JSP檔案的變化,再將其翻譯成 Servlet 程式碼)

      伺服器對其進行編譯並在第一次請求時建立一個Servlet例項。所以,第一次訪問JSP頁面時會後延遲

    3)JSP不用寫配置檔案

    4)JSP以靜態程式碼為主,Java程式碼為輔。Servlet反之。

    5)是J2EE藍圖的一部分(Servlet、JSP以及EJB是J2EE的三大元件)

    JSP從本質上來說核心還是Servlet,但與Servlet不是替代關係而是一種互補的關係。

    JSP適合於寫顯示層的動態頁面,而Servlet則適合寫控制層的業務控制(頁面轉發)。

    JSP往純標籤方向發展,Servlet往純程式碼方向發展,他們以Servlet核心(請求響應式的工作方式)往兩個方向發展。

  

 

基本語法

一、JSP的宣告(statement)

   用來定義在產生的類檔案中的類的屬性和方法(成員變數)。可宣告類(即是內部類)。

   由於servlet是工作在多執行緒環境下,所以儘量不要在service方法體外宣告成員變數。

   <%!.....%>  //宣告時要加"!",屬於類成員,最先載入,可寫於任何位置;不加則是指令碼的區域性變數,必須呼叫前寫。

   如:  <%!String hello="Hello,World!";%>  //變數的宣告

        <%=hello%>  //變數的呼叫

        <%!private int counter=0;  public int count(){ return ++counter;}%> //函式的宣告

        <h1><%=count()%></h1>//函式的呼叫

   宣告規則:

    1) JSP中宣告的變數和方法對應於Servlet中的例項方法和例項變數。這些將被同時請求該頁面的所有使用者所共享;

    2) 在使用變數或方法前須先定義(不是說宣告變數的位置在頁面中要處於使用變數的前面,而是指變數不宣告不能使用);

    3) 宣告的變數或方法的作用域為當前頁面或包含的頁面;

    4) 語句間以分號分隔。

  

二、JSP程式碼段(Scriptlet)

      <% java程式碼 %>

   是一段可以在處理請求時間執行的Java程式碼。可以產生輸出,也可以是一些流程控制語句。

   在程式碼段中定義的變數為service方法中的區域性變數。

   1._jspService()中的區域性程式碼:

      <% System.out.println("Hi,I like JSP."); %>   //在控制檯列印出,網頁上沒顯示

      <% out.println("Hi,I like JSP.");%>          //列印在網頁上

      <% Connection conn=DriverManager.getConnection();  Statementst=conn.createStatement();

        Stringsql="select * fromusers";              ResultSet rs=st.executeQuery(sql);

         //……

       %>

    問:能否在JSP指令碼里定義方法?

    答:不能! //指令碼相當於方法,不能在方法裡定義方法

       <%!public void helloworld(){}%>  //可以宣告方法

       <% public void helloworld(){}%>  //編譯出錯;指令碼不能定義方法

   2.比較:

        <%!int i=100;%>     //成員變數

        <% int i=101;%>     //_jspService()方法中的區域性變數

        <%=i%> //同一檔案裡,區域性變數優先

   3.指令碼小程式規則:

     1) 你使用的指令碼語言決定了指令碼小程式的規則;

     2) 語句間以分號分隔;

     3) 可以使用預設的物件、import進的類、declaration宣告的方法和物件以及useBean tag中宣告的物件。

  

三、JSP表示式(expression)

       <%=……%>  // "="號

   在JSP請求處理階段計算他的值,表示式生成的程式碼是Service方法中的一個程式碼片斷。

   JSP對於宣告的處理:1、計算表示式的值

                   2、將值轉換成String

                   3、用out.println傳送標籤;把資料輸出至頁面的當前位置

      <%="Hello,JSPworld!"%>     //out.println("Hello,JSPworld");

      <%=name%>                  //<%!String name="GiGi";%> out.println(name);

      <%=new java.util.Date()%>   //out.println(new java.util.Date());

   表示式規則:

     1) 你使用的指令碼語言決定了指令碼小程式的規則;

     2) 執行的順序為從左到右;

     3) 分號不能用於表示式。

  

四、JSP指令(direction)

   指令用於從JSP傳送資訊到容器上。用來設定全域性變數,宣告類,要實現的方法和輸出內容等。

   指令在JSP整個檔案內有效。它為翻譯階段提供了全域性資訊。

       <%@......%> // "@"符號

   指令包括:page、include、taglib

   1.page指令

        import、session、errorPage、isThreadSafe

     頁面的語言、內容型別、字符集、頁面編碼

        <%@pagelanguage="java" contentType="text/html;charset=gbk" pageEncoding="gbk"%>

        language:java唯一值,表示指令碼中使用的程式語言

        contentType:設定了內容的型別和靜態頁面的編碼 (告訴瀏覽器以什麼編碼顯示)

        pageEncoding:頁面本身的編碼格式 (寫頁面時用的編碼格式)

        上面的程式碼等價於servlet裡: response.setContentType("text/html; charset=gbk");

     import:匯入其他的包和類; 其中,JSP預設匯入的包是java.lang.*

        <%@pageimport="java.util.Date"%> //具體的包和類

        <%@pageimport="java.sql.*"%>     //包下的所有類

        <%@pageimport="java.util.*, java.io.*, java.net.*"%> //連寫,逗號分隔

     Session:指示當前的jsp是否參與會話 (預設為true; 參與會話)

        通過指令使當前頁面與session不可會話:    <%@page session="false"%>

        session="true"時,可用內建物件session直接訪問會話,例如:

        <% session.setAttribute("username","maxwell");

            Stringname = (String)session.getAttribute("username"); %>

        <%=name%>

     errorPage:

        isErrorPage:Jsp頁面中出現異常的處理方式

        對於有可能出現異常的頁面:

            <%@pageerrorPage="error.jsp"%> //異常時會跳轉到處理異常的頁面;這頁面自己寫

            在有可能異常的地方列印原因:  throw new Exception("資料庫連線出錯");

        對於處理異常的頁面(error.jsp)裡:

            <%@pageisErrorPage="true"%>,其中使用<%=exception.getMessage() %>把異常資訊列印出來

     isThreadSafe——此屬性已經不再使用(已廢棄)

        當前Jsp頁面是否執行緒安全   default--->true

        <%@pageisThreadSafe="true"%>  //普通的Servlet,可以併發處理使用者請求

        <%@pageisThreadSafe="false"%> //相當於Servlet實現了SingleThreadModel

   2.include指令

        把目標頁面的內容包含到當前頁面,產生頁面疊加以後的輸出效果 //相當於將兩個頁面合併;編譯時就包含進來

        <%@includefile="foot.jsp"%> //可插入任意位置

   3.taglib指令

        留在JSTL裡講解。

  

五、JSP中的註釋

   1.java格式註釋

      編譯器會忽略掉此類註釋中的內容(客戶端的原始碼看不見)

      <%-- JSP註釋;可多行 --%>

      <%// java 單行註釋 %>

      <%/* java multilines comments */%>

      <%/**java 特有的註釋*/%>

   2.html風格註釋

      編譯器會執行此類註釋中的程式碼(客戶端的原始碼看得見)

      <!-- html風格註釋 -->  等價於out.println("<!-- html風格註釋-->")

      這種註釋方式不好的地方就是當頁面註釋資訊太多的時候會增大伺服器的負荷。

      還有註釋資訊需要在網路上傳輸,從而降低效率;內部程式設計師的測試資料一般不能寫在這種註釋中,以免洩露。

  

六、動作(Action)

    <jsp:actionNameattributeName=attributeValue/>

   JSP的動作包括:

     forward、include、useBean、setProperty、getProperty

   1.forward動作

     形式:<jsp:forwardpage="another.jsp"/>

          等價於 Servlet中通過RequestDispatcher.forward();

     可以傳引數

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

            <jsp:paramname="name" value="maxwell"/>

            <jsp:paramname="age" value="20" />

         </jsp:forward>

   2.Include動作

     形式:<jsp:includepage="another.jsp"/>

          等價於 Servlet中通過RequestDispatcher.include();

      Include動作也可以傳引數

          <jsp:include page="b.jsp" flush="true">

             <jsp:paramname="name" value="narci"/>

          </jsp:include>

      與<%@include file=""%>比較:

         include動作在執行期處理(include指令編譯期),jsp:include包含的是所包含URI的響應,而不是URI本身。

         這意味著:jsp:include 對所指出的 URI 進行解釋,因而包含的是生成的響應。

         對於頁面是靜態內容,這沒有太大的關係。但如果是動態內容,include動作可傳引數。

      flush 屬性

         flush指示在讀入包含內容之前是否清空任何現有的緩衝區。

         JSP1.1 中需要 flush 屬性,因此,如果程式碼中不用它,會得到一個錯誤。

         但是,在 JSP 1.2 中, flush 屬性預設為 false。

         建議:由於清空大多數時候不是一個重要的問題,因此,對於 JSP 1.1,將 flush 設定為 true;

              而對於 JSP 1.2 及更高版本,將其設定為 false 或不設定(用預設值)。

  

 

JSP的生命週期

    1) 每一個JSP都會對應有一個servlet生成

    2) 在 %tomcat%/work/Catalina/localhost/工程名/org/apache/jsp 目錄下可找到對應生成的 Servlet 檔案

    3) 一般而言,每一個JSP對應的servlet都有如下的生命週期方法:

  

一、 _jspInit()方法

    JSP容器第一次裝載jsp檔案時呼叫一次

    public void _jspInit(){……}

  

二、 _jspService()方法

    每當伺服器接收到對該jsp的請求,都需要呼叫一次該方法一次。

    public void _jspService(HttpServletRequest request, HttpServletResponse response)

       throwsjava.io.IOException, ServletException { ……}

  

三、 _jspDestroy()方法

    jsp檔案被修改時,JSP容器會銷燬舊的jsp檔案對應的物件,重新裝載一次更新後的jsp檔案的內容(只呼叫一次)。

    public void _jspDestroy(){……}

  

 

JSP處理過程:JSP原始檔處理分成二個階段:

 1) JSP頁面轉換階段:

    頁面被編譯成一個Java類,所有的HTML標記和JSP標記都被轉換建立一個Servlet。這時,指令碼和表示式還沒有被執行;

 2) 請求處理階段:發生在伺服器,將一個客戶端請求指向JSP頁面。

    一個請求物件建立、解析以及提交給編譯好的JSP對應的servlet。

    當這個servlet處理請求的時候它執行先前在JSP中定義的處理指令碼小程式和表示式。

  

使用指令碼程式碼的缺點和指導方針

 1) 缺點:

    a. 過度使用指令碼程式碼使用JSP頁面混亂和難以維護;

    b. 指令碼程式碼降低JSP二個主要的優點:軟體重用和程式碼分開

 2) 指導方針:只在元件功能無能為力或需要有限的指令碼時使用。

  

 

day2

  POJO: Plain Old Java Object  --> 簡單傳統的Java物件

  Java Bean: 元件、構件的規範(屬性,提供get/set方法;還可包含其他方法)

JSP呼叫JavaBean

  通過引入JavaBean,JSP才能較好的把頁面展示與業務邏輯分離。

  其中,業務邏輯放到後臺的Java Bean中,減少JSP中的指令碼程式碼,有利於程式的可維護性與可重用性。

一、Java Bean

     a.無參構造器(也是預設的構造方法)

     b.標準的getter、setter方法

     c.如要進行網路傳輸(支援RMI),需實現Serializable介面

二、如何在JSP中使用JavaBean?

   1.定義Java Bean

     形式:<jsp:useBeanid = "BeanName" class ="className"  sope="範圍域">

        id  ——宣告bean物件的識別符號,方便其他地方使用

        class——bean物件的型別,注意要使用完全限定名

        scope——javabean物件的共享範圍(page、request、session、application)

           page:當前頁面範圍(範圍最小,生命週期最短)

           request:同一個請求範圍 (forward,include)

           session:同一個會話(30分鐘不使用,會自動結束)

           application:同一個應用(範圍最大,生命週期最長)  ServletContext

     例如:  SuperGirl <jsp:useBeanid="girl" class="com.tarena.vo.SuperGirl" scope="session"/>

     等價於:<% SuperGirlgirl=(SuperGirl)session.getAttribute("girl");

           if(girl==null){

              girl= new SuperGirl(); //對應 id 和 class

              session.setAttribute("girl",girl); //對應 scope 的值

           }%>

     可以用表示式獲得bean的值:  <%=girl.getName();%>

   2.對JavaBean的屬性賦值

     形式:<jsp:setPropertyname="JavaBean物件名" property="JavaBean屬性名" value="屬性值"/>

        例子:   <jsp:setPropertyname="girl" property="name" value="Lily"/>

        等價於: <%girl.setName("Lily");%>

     可以巢狀JSP表示式:

        <jsp:setPropertyname="girl" property="name"

         value='<%=request.getParameter("name")%>'/>

     Java Bean中的屬性名與form中輸入域的名字保持一致的話,可以使用萬用字元*,一次設定所有欄位的值。

        <jsp:setPropertyname="" property="*"/>

   3.獲取JavaBean的屬性值

     形式:<jsp:getProperty name="" property=""/>

        name:標識具體的Bean物件,這與<jsp:useBean>標準動作中的id值相匹配

        property:標識屬性中的識別符號。

  

JSP中的異常處理

一、try/catch/finally/throws/throw

    // 在區域性程式碼裡處理異常。

二、errorPage, isErrorPage

    // 在整個頁面處理異常。

   1.errorPage

     形如: <%@page errorPage="error.jsp"%>

     表示:需要錯誤處理的頁面

   2.isErrorPage

     形如: <%@pageisErrorPage="true"%>

     指示:錯誤頁面。其中,有一個隱式物件exception可用: <%=exception%>

          產生(隱含)內建物件exception,可通過它獲得異常資訊

          <%=exception.getMessage()%> //把異常資訊列印出來

三、宣告的方式處理異常

    // 在整個應用處理異常。(範圍比前兩種更大)

   1.配置: 在web.xml進行配置異常處理

      ……<error-page>

           <exception-type>java.lang.ArithmeticException</exception-type>

           <location>/MathError.jsp</location>

         </error-page>

         <error-page>

           <error-code>404</error-code>

           <location>/404.jsp</location>

         </error-page> ……

   2.複習:Java中的異常——有2種

     受查異常(Checked Exception)

     非受查異常(Unchecked Exception)  Java中的RuntimeException及其子類是不需要處理的(try/catch)

        因為所有的RuntimeException總是可以通過優化程式碼來避免,因此,這種異常被稱為"Unchecked Exception"。

   3.思考:

     三種異常處理方式同時啟動用,那個優先順序高? 作用域越小,優先順序越高。

   注意:要使得頁面自動跳轉到錯誤頁面,必須關閉瀏覽器的"顯示友好HTTP錯誤資訊"選項。

      public void _jspService(HttpServletRequest request,HttpServletResponse response)

        throwsjava.io.IOException, ServletException { /*只處理這兩種相容的異常*/ …… }

  

 

安全的系統(企業級應用):

   1.身份認證(合法使用者) --登入

   2.授權(靜態)       --定義許可權

   3.訪問控制(動態)    --比較

   4.安全審計(日誌)    --修復bug (只有敏感的部門需要)

JAAS實現安全

   JAAS——Java Authentication andAuthorization Service

   (Java認證(Authentication)與授權(Authorization)服務)

   是Java EE規範之一,實現Java EE應用程式安全性的一個重要途徑

   (要求:會使用,不必深入理解)

一、網路安全的4大要素

   認證——抵禦假冒者(使用者身份的合法性)

   授權——合法使用者擁有的許可權

   機密性——防止關鍵資料落入其他人手中

   資料完整性——抵禦竊聽者(篡改私有資料)

二、對於Http應用是如何進行認證的(Web端的認證方法)?

   四種安全認證: (http協議)basic, form,digest, certificate(證照) + ssl

   HttpMonitor監控受限資源的訪問

三、容器是如何完成認證與授權的呢?

   圖示(容器做了些什麼事情)

   (容器的角度)

四、宣告式安全以及分工

   Servlet的開發者

   應用的管理員

   部署人員

  

五、實戰

  1.定義新使用者與角色

    在Tomcat伺服器中定義:   %TOMCAT_HOME%/conf/tomcat-user.xml

     <?xml version='1.0' encoding='utf-8'?>

     <tomcat-users>

      <rolerolename="manager"/>

        <rolerolename="admin"/>

        <userusername="maxwell" password="123" roles="admin,manager"/>

        <userusername="lily" password="iloveyou" roles="manager"/>

     </tomcat-users>

    為什麼tomcat可以使用tomcat-users.xml作為它儲存使用者和角色資訊的檔案?原因是在server.xml中,有以下配置:

     <Resourcename="UserDatabase" auth="Container"  type="org.apache.catalina.UserDatabase"

         description="Userdatabase that can be updated and saved"

         factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

         pathname="conf/tomcat-users.xml" />

     在DD中指定角色,則需在web.xml 中配置:

     <security-role>

        <description/>

        <role-name>admin</role-name>

     </security-role>

   2.宣告安全性約束(指明受限資源)

     在DD中加入<security-constraint>元素,其中包含了:

       Web資源集合:<web-resource-collection>

       其中包含了url資源以及http方法。

     授權約束:<auth-constraint>

      <security-constraint>

        <display-name>Constraint-all</display-name>

        <web-resource-collection>

           <web-resource-name>all-resources</web-resource-name>

           <description/>

           <url-pattern>/admin/*</url-pattern>   //被授權訪問的目錄和檔案

           <url-pattern>/security/*</url-pattern>

           <http-method>GET</http-method>

           <http-method>POST</http-method>

        </web-resource-collection>

        <auth-constraint>

           <description/>

           <role-name>admin</role-name>

        </auth-constraint>

      </security-constraint>

  

     要注意的規則:

      不要認為:資源本身受到約束;其實,是資源 + Http方法組合受到約束

      如果配置中不指定<http-method>,說明所有的方法(Get,Post,Trace,Head,Delete,Put,Options等)都受約束;

      當指定了具體的<http-method>,那麼約束只針對該方法,其他的http方法都不在約束之內;

      <auth-constraint>定義的是哪些角色可以做出受約束的請求;而不是定義訪問<web-resource-collection>

      沒有<auth-constraint>:任何角色都能訪問;   空的<auth-constraint />任何角色都不能訪問;

      對於不同的<security-constraint>,指定的url資源<url-pattern>在相同方法上定義了不同的<auth-constrain>,則存在合併規則。

  

     問題:為什麼要設定<auth-constraint />元素,使得任何角色的任何人都不能訪問受限資源呢?其意義何在?

        為了保護資源,只允許內部跳轉去訪問

  

   3.選擇認證方式

     如果是BASIC認證:則無需指定Form表單的action。

     <login-config>

         <auth-method>BASIC</auth-method>

         <realm-name>UserDatabaseRealm</realm-name>

     </login-config>

     如果是FORM認證:

     <login-config>

       <auth-method>FORM</auth-method>

       <form-login-config>

          <form-login-page>/logon/loginForm.jsp</form-login-page>

          <form-error-page>/logon/loginErrorForm.jsp</form-error-page>

       </form-login-config>

     </login-config>

  

     對於Form表單認證

      action的值,使用者名稱、密碼欄位的名稱都是固定的(規範)

      <formmethod="POST" action="j_security_check">     

        <inputtype="text" name="j_username">     

        <inputtype="password" name="j_password">     

        <inputtype="submit" value="Submit" name="B1">

      </form>

     標準的表單提交(固定不變):

      action:j_security_check

      name:j_username

      password:j_password

  

 

Day3

內容要點: 1.隱含物件 2.歡迎檔案 3 MVC

********************************************************************************************

一、隱含物件

 1.什麼是隱含物件(9個)?

   ————JSP中的隱含物件:不用我們手工去建立的物件

   型別                   物件名           功能

   ---------------------------------------------------------------------

   JspWriter             out              往瀏覽器寫內容

   HttpServletRequest    request          Http請求物件.

   HttpServletResponse   response         Http響應物件

   PageContext           pageContext      JSP的頁面上下文

   HttpSession           session          會話物件

   ServletContext        application      應用上下文

   ServletConfig         config           JSP的ServletConfig

   Object                page             頁面實現類的物件(例如:this)

   Exception             exception        含有指令<%@pageisErrorPage="true"%>

  

 2.範圍物件

   其中,有4個是範圍物件:pageContext,request,session,application

   對應<jsp:useBean/>指令的scope分別是:page,reqeust,session,application

   也就是說,指定不同scope的bean物件(Java Bean)會被繫結到不同的範圍物件中

   // 選擇範圍物件的原則:作用域的範圍越小越好;因為作用域小的生命週期短,有利於效能提高。

   例如:<jsp:useBean id="stu" class="vo.Student" scope="page"/>

   表示stu物件被繫結到javax.servlet.jsp.PageContext物件(pageContext)中,其等價的程式碼

   <%    Student stu= pageContext.getAttribute("stu");

         if(stu==null){

          stu=new Student();

          pageContext.setAttribute("stu",stu);

   }%>

  

   1)pageContext物件:

     每一個jsp頁面對應著一個pageContext。一般地,在實際應用中,主要是使用它來存取屬性。

     另外,pageContext物件能夠存取其他隱含物件。

    a.pageContext物件存取其他隱含物件屬性的方法,此時需要指定範圍的引數。

      ObjectgetAttribute(String name, int scope)

      EnumerationgetAttributeNamesInScope(int scope)

      void removeAttribute(String name, int scope)

      void setAttribute(String name, Object value, int scope)

     其中,範圍引數有四個,分別代表四種範圍:

      PAGE_SCOPE、REQUEST_SCOPE、SESSION_SCOPE、APPLICATION_SCOPE

    b.PageContext物件取得其他隱含物件的方法

      ExceptiongetException()           回傳目前網頁的異常,不過此網頁要為error page,

      JspWritergetOut()                回傳目前網頁的輸出流,例如:out

      ObjectgetPage()                  回傳目前網頁的Servlet實體(instance),例如:page

      ServletRequestgetRequest()        回傳目前網頁的請求,例如:request

      ServletResponsegetResponse()      回傳目前網頁的響應,例如:response

      ServletConfiggetServletConfig()   回傳目前此網頁的ServletConfig 物件,例如:config

      ServletContextgetServletContext() 回傳目前此網頁的執行環境(context),例如:application

      HttpSessiongetSession()           回傳和目前網頁有聯絡的會話(session),例如:session

    c.PageContext物件提供取得屬性的方法

      ObjectgetAttribute(String name, int scope)    回傳name 屬性(範圍為scope;型別為Object)

      EnumerationgetAttributeNamesInScope(int scope)   

                                       回傳所有屬性範圍為scope 的屬性名稱,回傳型別為Enumeration

      int getAttributesScope(String name)回傳屬性名稱為name 的屬性範圍

      void removeAttribute(String name)  移除屬性名稱為name 的屬性物件

      void removeAttribute(String name, int scope)   移除屬性名稱為name,範圍為scope 的屬性物件

      void setAttribute(String name, Object value, int scope)       

                                       指定屬性物件的名稱為name、值為value、範圍為scope

      ObjectfindAttribute(String name)  尋找在所有範圍中屬性名稱為name 的屬性物件

  

   2)request 物件

     request 物件包含所有請求的資訊,

     如:請求的來源、標頭、cookies和請求相關的引數值等等。

     request 物件實現javax.servlet.http.HttpServletRequest介面的,

     所提供的方法可以將它分為四大類:

     (1)儲存和取得屬性方法;

      void setAttribute(String name, Object value)      設定name屬性的值為value

      EnumerationgetAttributeNamesInScope(int scope)   取得所有scope 範圍的屬性

      ObjectgetAttribute(String name)   取得name 屬性的值

      void removeAttribute(String name)  移除name 屬性的值

     (2)取得請求引數的方法

      StringgetParameter(String name)   取得name 的引數值

      EnumerationgetParameterNames()    取得所有的引數名稱

      String []getParameterValues(String name)    取得所有name 的引數值

      MapgetParameterMap()             取得一個要求引數的Map

     (3)能夠取得請求HTTP 標頭的方法

      StringgetHeader(String name)      取得name 的標頭

      EnumerationgetHeaderNames()       取得所有的標頭名稱

      EnumerationgetHeaders(String name) 取得所有name 的標頭

      int getIntHeader(String name)      取得整數型別name 的標頭

      long getDateHeader(String name)    取得日期型別name 的標頭

      Cookie []getCookies()            取得與請求有關的cookies

     (4)其他的方法

      StringgetContextPath()           取得Context 路徑(即站臺名稱)

      StringgetMethod()                取得HTTP 的方法(GET、POST)

      StringgetProtocol()              取得使用的協議(HTTP/1.1、HTTP/1.0 )

      StringgetQueryString()           取得請求的引數字串,不過,HTTP的方法必須為GET

      StringgetRequestedSessionId()     取得使用者端的Session ID

      StringgetRequestURI()            取得請求的URL,但是不包括請求的引數字串

      StringgetRemoteAddr()            取得使用者的IP 地址

      StringgetRemoteHost()            取得使用者的主機名稱

      int getRemotePort()               取得使用者的主機埠

      StringgetRemoteUser()            取得使用者的名稱

      void getCharacterEncoding(String encoding)    設定編碼格式,用來解決窗體傳遞中文的問題

  

    3)session 物件

     session物件表示目前個別使用者的會話(session)狀況。

     session物件實現javax.servlet.http.HttpSession介面,HttpSession介面所提供的方法

      long getCreationTime()            取得session產生的時間,單位是毫秒

      StringgetId()                    取得session 的ID

      long getLastAccessedTime()         取得使用者最後通過這個session送出請求的時間

      long getMaxInactiveInterval()      取得最大session不活動的時間,若超過這時間,session 將會失效

      void invalidate()                 取消session 物件,並將物件存放的內容完全拋棄

      booleanisNew()                   判斷session 是否為"新"的會話

      void setMaxInactiveInterval(int interval)  

                                       設定最大session不活動的時間,若超過這時間,session 將會失效

    4)application物件

     application物件最常被使用在存取環境的資訊。

     因為環境的資訊通常都儲存在ServletContext中,所以常利用application物件來存取ServletContext中的資訊。

     application 物件實現javax.servlet.ServletContext 介面,ServletContext介面容器所提供的方法

      int getMajorVersion()             取得Container主要的Servlet API版本

      int getMinorVersion()             取得Container次要的Servlet API 版本

      StringgetServerInfo()            取得Container的名稱和版本

      StringgetMimeType(String file)    取得指定檔案的MIME 型別

      ServletContextgetContext(String uripath)        取得指定Local URL的Application context

      StringgetRealPath(String path)    取得本地端path的絕對路徑

      void log(Stringmessage)           將資訊寫入log檔案中

      void log(String message, Throwable throwable)    將stack trace 所產生的異常資訊寫入log檔案中

  

 3.其他物件:

    1)page 物件

     page物件代表JSP本身,更準確地說page物件是當前頁面轉換後的Servlet類的例項。

     從轉換後的Servlet類的程式碼中,可以看到這種關係: Object page = this;

     在JSP頁面中,很少使用page物件。

    2)response 物件

     response 物件主要將JSP 處理資料後的結果傳回到客戶端。

     response 物件是實現javax.servlet.http.HttpServletResponse介面。response物件所提供的方法。

    a.設定表頭的方法

      void addCookie(Cookiecookie)               新增cookie

      void addDateHeader(String name, long date)   新增long型別的值到name標頭

      void addHeader(String name, String value)    新增String型別的值到name標頭

      void addIntHeader(String name, int value)    新增int型別的值到name標頭

      void setDateHeader(String name, long date)   指定long型別的值到name標頭

      void setHeader(String name, String value)    指定String型別的值到name標頭

      void setIntHeader(String name, int value)    指定int型別的值到name標頭

    b.設定響應狀態碼的方法

      void sendError(int sc)                      傳送狀態碼(statuscode)

      void sendError(int sc, Stringmsg)           傳送狀態碼和錯誤資訊

      void setStatus(int sc)                      設定狀態碼

    c.用來URL 重寫(rewriting)的方法   

      StringencodeRedirectURL(String url)         對使用sendRedirect()方法的URL予以編碼

    3)out 物件

     out物件的型別是javax.servlet.jsp.JspWriter,該類從java.io.Writer類派生,以字元流的形式輸出資料。

     out物件實際上是PrintWriter物件的帶緩衝的版本(在out物件內部使用PrintWriter物件來輸出資料),

     可以通過page指令的buffer屬性來調整緩衝區的大小,預設的緩衝區是8kb。

     out 物件能把結果輸出到網頁上。

     out主要是用來控制管理輸出的緩衝區(buffer)和輸出流(output stream)。

      void clear()              清除輸出緩衝區的內容

      void clearBuffer( )         清除輸出緩衝區的內容

      void close()              關閉輸出流,清除所有的內容

      int getBufferSize( )        取得目前緩衝區的大小(KB)

      int getRemaining( )         取得目前使用後還剩下的緩衝區大小(KB)

      booleanisAutoFlush( )      回傳true表示緩衝區滿時會自動清除;false表示不會自動清除並且產生異常處理

    4)exception物件

     若要使用exception 物件時,必須在page 指令中設定:<%@ pageisErrorPage="true" %>才能使用。

     exception提供的三個方法:

      getMessage()

      getLocalizedMessage()

      printStackTrace(new java.io.PrintWriter(out))

    5)config 物件

     config 物件裡存放著一些Servlet 初始的資料結構。

     config 物件實現於javax.servlet.ServletConfig 介面,它共有下列四種方法:

      public String getInitParameter(name)

      public java.util.Enumeration getInitParameterNames( )

      public ServletContext getServletContext()

      public Sring getServletName()

  

 

例子:

1.範圍物件比較

<% pageContext 或request 或session 或application.setAttribute("name", "maxwell");

   pageContext.setAttribute("sex","m");

%>

  

2.輸出物件out

<%out.println("Hello JSP!");%>

<%System.out.println("Hello JSP!");%>

getBufferSize() //tomcat default:12k

getRemaining()

flush()

clearBuffer()

  

3.request物件

request:

getProtocol()

getMethod()

getHeader("User-Agent")

getCookies()

getRequestURI()

getRequestURL()

getContextPath()

getServletPath()

getPathInfo()

getQueryString()

isRequestedSessionIdFromCookie()

isRequestedSessionIdFromURL()

isRequestedSessionIdValid()

getLocalPort(),getRemotePort()

getRequestDispatcher(),setCharacterEncoding(),getInputStream()

  

4.session物件

session:

getId()

isNew()

invalidate()

setMaxInactiveInterval(10)

  

 

5.響應物件

response:

sendRedirect("third.jsp")

sendError(404, "400 Error!")

6.應用物件

application:

log("some body visit our website...");

getMajorVersion()

getMinorVersion()

getServerInfo()

getRequestDispatcher(),getResourceAsStream(),getInitParameter()

  

pageContext:

getAttribute("name")

  

config:

getInitParameter("classNo")

getServletName()

  

page:

getClass()

  

************************************************************************************************

二、歡迎檔案

  

 1.預設情況下,一個Web App中的  index.html, index.htm, index.jsp  可作為預設的歡迎檔案.

   當使用者請求沒有指明要訪問的資源時,Web Container會用歡迎檔案響應客戶端請求.

 2.手工設定歡迎檔案:

   web.xml

   找welcome.jsp,沒找到,繼續往下找

   <welcome-file-list>

     <welcome-file>/welcome.jsp</welcome-file>

     <welcome-file>/welcome1.jsp</welcome-file>

     <welcome-file>/welcome2.jsp</welcome-file>

   </welcome-file-list>

  

 

三、MVC

 MVC:    Model-View-Controller (使用者互動過程:輸入、處理、輸出)

 WEB應用的MVC;優化Web App的結構,使用MVC模式

 Model 1:    JSP + JavaBean(EJB)

 Model 2:    Servlet + JSP +JavaBean(EJB)------>MVC

  

體系結構

  

設計模式

  具體問題提出具體的解決辦法

  

習慣用法

  

 

Day4

內容要點: 1 實現檔案上傳 2 資料驗證  3 分頁實現

*****************************************************************************************

一、檔案上傳

1.表單形式

<form action="" method="POST" enctype="multipart/form-data">

  file:<input type="file" name="file"/><br/>

  <input type="submit"/>

</form>

  

2.使用HttpMonitor工具:

檢視檔案上傳時,請求的內容。

  

3.伺服器端對上傳檔案的處理

例子

fileupload

處理步驟(待補充)

  

知識點:

1)通過HttpServletRequest來傳送檔案內容

2)處理request頭,字串的分析

3)java.io.File API的使用

  

*****************************************************************************************

二、資料驗證

  

如何完成Web App中的資料驗證工作

  

1)客戶端校驗:

輸入域不能為空,只能是數字,資料長度大於5等等

JavaScript客戶端完成(驗證框架,負責客戶端方面的驗證)

  

2)伺服器端校驗:

例如:後臺資料庫要求提交資料唯一性

Java伺服器端完成(沒有現成的框架,因為不同的專案有不同的業務規則)

  

 

重點:

1)分清楚什麼情況下使用客戶端校驗,什麼情況下使用伺服器端校驗

  

 

***************************************************************************************

三、資料分頁

查詢資料庫時,如果滿足條件的記錄很多,該如何返回給頁面?

1.客戶端分頁

  同樣地,使用html/javascript等技術處理。甚至可以封裝成元件

2.伺服器端分頁

  非常重要的,在實際專案中非常需要————效能問題。

這需要結合JDBC/Hibernate/TopLink/EJB等技術實現。

  

查詢分頁

  1)一次性從資料庫中查出所有資訊,在記憶體中作分頁(快取)

      特點:速度非常快,消耗資源大(記憶體?)

  

  2)分多次查詢資料庫,一次查詢的資料量就是一個頁面可以顯示的資料量

      特點:消耗資源少,相對來說速度慢

  

  3)折衷的方案(一次只取n頁,1<n<總頁數)(部分快取)

      特點:中庸之道(實現中,置換演算法教難)

  

常見的分頁處理方法:定義如下幾個引數

rows:資料庫表中記錄總行數   select count(*) from 表名;

  totalPage:總頁數     (匯出屬性:可以由其他屬性計算而得) int totalPage = rows / size + 1;

size:每頁顯示的記錄數目    可定製,可寫死

curPageNo:當前頁         客戶端決定

  startRowNo:當前頁在資料庫中的起始行號(匯出屬性)        int startRowNo = (curPageNo -1 ) * size;

  

練習:

重新改造Usermanager例子中的查詢所有的使用者的功能(使用分頁)

  

 

Day5

內容要點:  1 EL   2 JSTL

**************************************************************

一、EL(Expression Language----表示式語言)

 為網頁美工而設,跟java語句相似;儘量減少java程式的依賴(不能要求美工使用java)

 1.語法

   表示式         vs.    EL表示式語言(JSP2.0)

   <%=name%>    <=>       ${name}

 2.文字

   在 EL 表示式中,數字、字串、布林值和 null 都可以被指定為文字值(常量)。

   字串可以用單引號或雙引號定界。布林值被指定為 true 和 false 。

  例子:

   表示式                             值

   -----------------------------------------------------------------------

   ${-168.18}                        -168.18

   ${3.8e-18}                        3.8e-18           //科學計數法

   ${3.14159265}                     3.14159265                 

   ${"Hello JSPEL!"}                Hello JSP EL!     等價於 <%="Hello JSPEL!"%>         

   ${'Hello JSPEL...'}              Hello JSP EL...

   ${true}  //can beTRUE?            true

   ${false} //can beFALSE?           false

   ${str==null}                      true              //布林值的表示式

  

 3.EL 運算子

   類別              運算子

   -------------------------------------------------------------

   算術運算子        +、  -、  *、 /(或 div)、    %(或 mod)

   關係運算子        ==(或 eq)、    !=(或 ne)、    <(或 lt)

                 >(或 gt)、    <=(或 le)、   >=(或 ge)

   邏輯運算子       &&(或 and)、  ||(或 or)、    !(或 not)

   驗證運算子       empty 

     其中,empty 判斷一個變數是否為null或是否包含有效資料:

     if(name==null||name.equlas("")) 等價於 ${empty name} ->    true

  例子:

    表示式                             值

   -------------------------------------------------------------

    ${3+5.1}                          8.1

    ${"Hello"+",Tarena!"}             報錯!  //EL的"+"沒有字串連線功能

    ${5*2}                            10

    ${9.3/3}                          3.1

    ${9.3 div3}                      3.1

    ${8 div0}                        Infinity // 表示無窮大

    ${9%2}                            1

    ${9 mod2}                        1

    ${8*6>68?"Yes":"No"}              No   //三目表示式

   <% String name="";

    request.setAttribute("name",name);     //如果沒有setAttribute ,則必定是空

   %>

    ${emptyname}                     true //對範圍物件內的變數或物件進行判空

  

 4.變數和JavaBean屬性資料輸出

   表示式語言輸出變數,是到範圍物件(pageContext,request,session,application)中查詢相應屬性。

   而非直接在頁面中查詢例項或區域性變數。

  表示式語言查詢變數的順序是:

   pageContext -> request ->session->application, 所有範圍都未找到時,賦值null

  

 5.存取器

   []    ->輸出物件屬性值,輸出陣列或集合中對應索引值

   .     ->輸出物件屬性值

  例子:

   <% SuperGirl girl = new SuperGirl();   girl.setName("Alice");

      session.setAttribute("girl",girl); %>  //一定要有這句,設定成範圍物件

   ${girl["name"]}

   ${girl['name']}   //拿屬性時,單引跟雙引等價

   ${girl.name}     //這種方法同樣可以

    

   <%  List aList = new ArrayList();

       aList.add("China"); aList.add(girl);  aList.add(168.18);

       session.setAttribute("aList",aList); %>

   ${aList[0]}   //使用下標來取值 "China"

   ${aList[1]}   //取得物件的引用地址  還可以巢狀:${aList[1]['name']}

   ${aList[3]}   //下標越界,不會報錯;只是取不出值

    

   <%  Map map = new HashMap();

       map.put("name","Kitty");  map.put("age", "25"); map.put("date", new Date());

       map.put("aList",aList);

       session.setAttribute("map",map); %>

   ${map.date}    ${map["date"]}     //這兩個等效

   ${map.aList[0]}${map["aList"][0]} //這兩個也等效

   ${map.aList[1][name]}             //巢狀取值

  

 6.隱含物件

   el提供了自己的一套隱含物件,方便在頁面內對各種常用資料資訊的訪問.

    EL隱藏物件                        JSP隱藏物件

   --------------------------------------------------------------------------------

    pageScope                        pageContext

    requestScope                     request

    sessionScope                     session

    applicationScope                 appication

  

    param:              request.getParameter()

    paramValues:        在提交表單裡,有多個輸入域同名getParameterValues

    header:             request.getHeader() 按照key-value的形式取出;value:是一個String型別的值

    headerValues         按照key-value的方式取出,但是headerValues裡面的value是一個String型別的陣列

    cookie               request.getCookies()

    initParam            context param

  

  例子:

    1)超女登記資訊 

      enroll.html

      <formaction="index.jsp" method="post">

        <tableborder="1">

        <tr><td>姓名:</td>

            <td><inputtype="text" name="name"></td></tr>

        <tr><td>年齡:</td>

            <td><inputtype="text" name="age"></td></tr> 

        <tr><td>城市:</td>

            <td><inputtype="text" name="city"></td> </tr> 

        <tr><tdalign="center" colspan="2"><inputtype="submit" value="提交"></td></tr>

        </table>

      </form>

  

      index.jsp

      <jsp:useBeanid="SuperGirl" class="vo.SuperGirl" scope="page"></jsp:useBean>

      <jsp:setPropertyname="SuperGirl" property="name" value="${param.name}"/>

      <jsp:setPropertyname="SuperGirl" property="age"  value="${param.age}"/>

      <jsp:setPropertyname="SuperGirl" property="city" value="${param.city}"/>

      <tableborder="1">   <% //把設定輸出出來 %>

        <tr><td>姓名:</td>

            <td>${SuperGirl.name}</td></tr>

        <tr><td>年齡:</td>

            <td>${SuperGirl.age}</td></tr> 

        <tr><td>城市:</td>

            <td>${SuperGirl.city}</td></tr> 

      </table>

  

    2)範圍物件

      <% pageContext.setAttribute("name", "page");

        request.setAttribute("name","request");

        session.setAttribute("name","session");

        application.setAttribute("name","application"); %>

  

      ${name}   // pageContext -> request -> session->application

      ${pageScope.name}

      ${requestScope.name}

      ${sessionScope.name}

      ${applicationScope.name}

  

    3)paramValues

      在enroll.html加入: 興趣

        <table>

      <inputtype="checkbox" name="habit" value="Reading"/>讀書

      <inputtype="checkbox" name="habit" value="Game"/>遊戲

      <inputtype="checkbox" name="habit" value="Music"/>音樂

        </table>

      //提交後,獲取輸入內容

      ${paramValues.habit[0]}

      ${paramValues.habit[1]}

      ${paramValues.habit[2]}

  

    4)initParam

      web.xml

      ...

      <context-param>

        <param-name>server</param-name>

        <param-value>Tomcat5.5</param-value>

      </context-param>

      ...

      ${initParam.server}

  

    5)header

      ${header["host"]}

      ${header["accept"]}

      ${header["user-agent"]}

  

 

 7.可以自由設定是否支援表示式語言

   <%@pageisELIgnored="false"%> : default:false  可以使用EL,改成 true 之後,寫EL就會報錯

  

   配置web.xml也可達到同樣的效果(同時存在,那種起作用?)

   (禁用指令碼和EL)  預設都是false

   ...

   <jsp-config>

     <jsp-property-group>

       <url-pattern>*.jsp</url-pattern>

       <el-ignored>true</el-ignored>              //設定成所有jsp檔案都禁用EL

       <scripting-invalid>true</scripting-invalid>//設定成禁用指令碼

     </jsp-property-group>

   </jsp-config>

   ....

   頁面的page指令設定isELIgnored屬性的優先順序比web.xml中<el-ignored>設定的高(當然是範圍小的生效)

  

 

***************************************************************************************

二、JSTL(JSP Standard Tag Library )

 減少java程式碼,簡化頁面編寫;功能封裝,提高可重用性

 1.如何使用JSTL

   1)對於Java EE之前(即J2EE規範1.4及之前版本)

     a、複製jstl的jar包(jstl.jar,standard.jar)到/WEB-INF/lib

     b、在使用jstl功能的jsp頁面中增加指令

        <%@taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  //核心標籤庫

        <%@taglibprefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>   

        <%@taglibprefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

        <%@taglibprefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> //資料庫標籤庫

        <%@taglibprefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

        //prefix表字首(可改,但通常按這寫的用); uri 指向標籤庫的入口

   2)Java EE規範把jstl作為規範的一部分

     所以現在的jstl-1.2已經包含了原來的jstl.jar , standard.jar

  

 2.core:核心標籤庫

   一般用途

   在JSTL中,一般用途的標籤主要是指具有輸出,設定變數,和錯誤處理等功能的標籤,他們在jsp中使用比較頻繁,它們有:

  -----------

  |a、<c:set>|

  -----------

   語法:<c:set value="value" var="varName" [scope="{page|request|session|application}"]/ >

        <c:set value="value" target="target" property="propertyName"/ >

   這個標籤用於在某個範圍(page,request,session,application)裡面設定特定的值

   (預設為page),或者設定某個已經存在的javabean的屬性。

   例子:

     <c:set var="counter" value="200"/>

     ${counter}//輸出

      

     <c:set var="tarena">Tarena It Traning Ltd.</c:set>

     ${tarena}

  

   可以指定範圍,預設是page

    <c:set value="20" var="maxIdelTime" scope="session"/>

    ${maxIdelTime}

  

   設定JavaBean的值

    <jsp:useBeanid="girl" class="vo.SuperGirl"/>

    <c:set value="Shirly" target="${girl}" property="name"/>

    <td>girl.name</td>

    <td>${girl.name}</td>

  

  --------------

  |b、<c:remove>|

  --------------

  語法:

    <c:removevar="varName" [scope="{page|request|session|application}"]/ >

    它的作用是刪除某個變數或者屬性。

  例子:

    <c:set value="10000" var="maxUser" scope="application"/>

    <c:set value="10" var="count" scope="session"/>

    <c:set value="10" var="count"/>

    ${maxUser}

    ${count}

    <c:removevar="maxUser" scope="application"/>

    <c:removevar="count" scope="session"/>

    ${maxUser}

    ${count}

  

  -----------

  |c、<c:out>|

  -----------

  語法:<c:out value="value" [escapeXml]="{true|false}" [default="defaultValue"]/>

  注意:escapeXml的作用是是否將程式碼交給xml解析器解釋,true為交給xml解析器解釋(預設),false為交給瀏覽器解釋。

      default 定義預設值。

  

  例子:

    <c:set var="sessionZhang3" value="zhang3-s" scope="session"/>

    <c:set var="table" value="<table><tr><td>sessionZhang</td></tr></table>" scope="page"/>

    <c:set var="requestZhang3" value="zhang3-r" scope="request"/>

    <c:out value="以下輸出前面設定的屬性<br>" escapeXml="false"/>

  

    <td colspan=2>

        <c:out value="${sessionZhang3}"/><br>

        <c:out value="${table}" escapeXml="false" /><br>//輸出表格;escapeXml="true"時只顯示字串

        <c:out value="${requestZhang3}"/><br>

        <c:out value="${nodefined}" default="沒有nodefined這個變數"/>

    </td>

  

  -------------

  |d、<c:catch>|

  -------------

  它的作用是捕捉由巢狀在它裡面的標籤所丟擲來的異常。類似於<%try{}catch{}%>

  語法:<c:catch [var="varName"]>nestedactions</c:catch>

  例子:

    <c:catch var="error"><% Integer.parseInt("abc");%></c:catch>

    <% try{Integer.parseInt("abc"); }catch(Exception error) {  } %> //等價

  

     <c:out value="${error}"/>

     <c:out value="${error.message}"/>

     <c:out value="${error.cause}"/>

  

 

  控制語句:

  -----------

  |a、 <c:if>| 

  -----------

  語法:

    <c:if test="testCondition" var="varName"

    [scope="{page|request|session|application}"]>

       Body內容

    </c:if>  // 注:沒有 else

  例子:

     <c:set var="age" value="16"/>

     <c:if test="${age<18}">

        <h1align=center>您尚未成年,不能進入遊戲中心!</h1>

     </c:if>

  

  --------------

  |b、<c:choose>|

  --------------

  例子:

    <c:set var="tax" value="5000" />

    <c:choose>

         <c:whentest="${tax <=0}">

              您今年沒有納稅!

         </c:when>

         <c:whentest="${tax<=1000&&tax>0}">

           您今年繳納的稅款為${tax},加油!

         </c:when>

         <c:whentest="${tax<=3000&&tax>1000}">

           您今年繳納的稅款為${tax},再接再勵哦!

         </c:when>

         <c:otherwise>

           您今年納稅超過了3000元,多謝您為國家的繁榮富強作出了貢獻!

         </c:otherwise>

     </c:choose>

  

  ---------------

  |c、<c:forEach>| 迴圈

  ---------------

  語法: <c:forEach [var="varName"]items="collection"  [varStatus="varStatusName"]

         [begin="begin"][end="end"] [step="step"]>

           Body內容

        </c:forEach>

   items:需要迭代的集合;var:迭代時取集合裡的值;

  例子:

    <%  List aList=new ArrayList();

        aList.add("You");      aList.add("are");   aList.add("a");

        aList.add("beautiful");aList.add("girl"); 

        request.setAttribute("aList",aList); %>

    <center> <tableborder=1>

       <c:forEachvar="word" items="${aList}">

         <tr><td>${word}</td></tr>

       </c:forEach>

    </table> </center>

  

    <c:forEachitems='${header}' var='h'>

       <tr>

         <td><li>Headername:<c:out value="${h.key}"/></li></td>

         <td><li>Headervalue:<c:out value="${h.value}"/></li></td>

       </tr>

    </c:forEach>

  

  另外一種用法: (類似 for 迴圈)

   <c:forEach var="count" begin="10" end="100" step="10">

       <tr><td>

         <c:out value="${count}"/><br>

       </td></tr>

   </c:forEach>

  

 

  URL

  ---------------

  |a、<c:import> |

  ---------------

  相當於<jsp:include>

   <c:importurl="footer.jsp" charEncoding="GBK">

      <c:paramname="name" value="Java"/>

   </c:import>

  

  -----------

  |b、<c:url>|

  -----------

  用於構造URL,主要的用途是URL的重寫。

    <c:urlvar="footer1" value="footer.jsp"/>

    <c:urlvar="footer2" value="footer.jsp" scope="page">

        <c:paramname="name" value="Sofie"/>

    </c:url>

    <c:out value="${footer1}"/>

    <c:out value="${footer2}"/>

  

    <c:url var="next" value="next.jsp"/>

    <ahref="${next}">next</a><br>

       等價於

    <a href="<c:urlvalue='next.jsp'/>">next</a> //在 Html 裡可巢狀 JSTL

  

  ----------------

  |c、<c:redirect>|

  ----------------

   //等價於 <jsp:forward>

    <c:redirect url="${footer2}"/>

  例如:

    <c:url var="next" value="next.jsp"/>

    <c:redirecturl="${next}"/>

  

 3.SQL

   <sql:setDataSource>

   <sql:query>

   <sql:update>

   <sql:param>

  

    <!-- 設定資料來源 -->

    <%@pagecontentType="text/html; charset=GBK"%>

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

    <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

      <sql:setDataSource  var="ds"  driver="com.mysql.jdbc.Driver"

       url="jdbc:mysql://localhost:3306/tarena"

       user="root" password="11111111" />

  

  a、查詢

    <sql:queryvar="rs" dataSource="${ds}" sql="select* from users" ></sql:query>

    <c:forEachvar="user" items="${rs.rows}">

        <tr>

          <td>${user.userid}</td>

          <td>${user.username}</td>

          <td>${user.password}</td>

          <td>${user.role}</td>

        </tr>

    </c:forEach>

  

  b、插入記錄

    <sql:updatedataSource="${ds}" sql="insert into usersvalues(101,'maxwell','123','admin')"

     var="i"></sql:update>

    <hr>插入${i}條記錄.

  

  c、更新記錄

    <sql:updatedataSource="${ds}"

     sql="UPDATE usersSET username='Gavin King' WHERE userid=101" var="i"></sql:update>

    <hr>更新${i}條記錄.

  

 <sql:param>

  作用:設定sql語句中"?"表示的佔位符號的值。

 <sql:update dataSource="${ds}" sql="UPDATE users SET username=? WHERE userid=?" var="i">

    <sql:param value="RodJohnson" /> //設第一個問號

    <sql:paramvalue="100" />        //設第二個問號

  </sql:update>

  引數等價於

  //pstmt.setString(1,"RodJohnson");

  //pstmt.setInt(2,100); 


相關文章