JAVADREAM

          hackiller
          數(shù)據(jù)加載中……
          J2EE復(fù)習(xí)(五)JSP基礎(chǔ)
          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

          一、JSP簡(jiǎn)介
          JSP (Java Server Pages)是服務(wù)器端的腳本語(yǔ)言,是一種在HTML頁(yè)面中加入Java語(yǔ)言而生成動(dòng)態(tài)頁(yè)面的技術(shù):加入了新的標(biāo)簽(<%,%>,…)。
          JSP是以Java和Servlet為基礎(chǔ)開發(fā)而成的動(dòng)態(tài)網(wǎng)頁(yè)生成技術(shù),它的底層實(shí)現(xiàn)是Java Servlet。
          JSP頁(yè)面由HTML代碼和嵌入其中的Java代碼所組成。服務(wù)器在頁(yè)面被客戶端所請(qǐng)求以后對(duì)這些Java代碼進(jìn)行處理,然后將生成的HTML頁(yè)面返回給客戶端的瀏覽器。

          二、JSP的執(zhí)行過程
          客戶端請(qǐng)求JSP頁(yè)面——>JSP Parser解析*.jsp編譯為*.java——>javac命令編譯成*.class——>執(zhí)行class文件——>響應(yīng)返回結(jié)果給客戶端
          JSP代碼中包含JSP元素和Template data兩類。Template data指的是JSP引擎不處理的部分,就是JSP引擎會(huì)把除在標(biāo)記<%...%>以外的部分直接傳遞出去而不進(jìn)行任何處理。
          JSP在第一次或修改JSP文件后執(zhí)行都會(huì)調(diào)用JSP Parser將*.jsp文件編譯成servlet程序,所以會(huì)比較慢。

          三、JSP基本語(yǔ)法
          1. 兩種注釋類型
          (1)HTML注釋
          可以在JSP代碼中添加一段HTML格式的注釋,此注釋發(fā)生到客戶端,但不在頁(yè)面上顯示,語(yǔ)法如下:
          <!-- HTML格式的注釋,在客戶端查看源代碼時(shí)可見 -->
          <!-- 此注釋由<%=programmer%>添加-->

          如果programmer為hackiller,則在客戶端返回的注釋是<!-- 此注釋由hackiller添加-->
          (2)JSP注釋
          寫在JSP代碼中,但不發(fā)送到客戶端。
          <%-- JSP注釋,該注釋會(huì)在JSP編譯時(shí)被忽略掉 --%>
          <%-- /*Scriptlet中的多行注釋*/ --%>
          <%-- /**Scriptlet中的多行注釋,可以用javadoc從java文件中提取出來(lái)*/ --%>
          <%-- JSP的單行注釋 --%>

          2. 3個(gè)腳本元素
          (1)聲明(Declaration)全局變量
          <%! int i=0; String str="Hello World!"; %>
          (2)表達(dá)式(Expression)
          在JSP代碼中,經(jīng)常使用表達(dá)式來(lái)輸出變量的值,可以在任何地方
          <%! int a=1; int b=2; String str="Hello World!"; %>
          <%=a+b%>  <%=str>

          PS:不能用“;”號(hào)來(lái)作為表達(dá)式的結(jié)束符。但同樣的表達(dá)式在Scriptlet中必須以分號(hào)來(lái)結(jié)尾。
          (3)腳本段(Scriptlet)
          腳本段用來(lái)包含一個(gè)有效地Java程序段
          <% int b=3; %>局部變量

          3. 3個(gè)指令元素
          (1)page指令

          <%@ page contentType="text/html;charset=utf-8"%>

          定義JSP文件的全局屬性,屬性包括:language、extends、import、session、buffer、autoflush、isThreadSafe、info、errorPage、isErrorPage、contentType(服務(wù)端到客戶端的輸出格式)
          其位置可以在頁(yè)面的任何位置,但推薦放在頁(yè)首。
          language:聲明腳本語(yǔ)言的種類,目前只能用"java"。
          extends:標(biāo)明JSP編譯時(shí)需要加入的Java Class的全名,它會(huì)限制JSP的編譯能力,慎用!
          import:需要導(dǎo)入的java包列表。
          session:設(shè)定客戶是否需要HTTP Session。默認(rèn)為true。
          buffer:buffer的大小被out對(duì)象用于處理執(zhí)行后的JSP對(duì)客戶瀏覽器的輸出。默認(rèn)值為8Kb。
          autoFlush:設(shè)置如果buffer溢出,是否要強(qiáng)制輸出,如果定義其為true(默認(rèn)值),輸出正常;如果定義為false,會(huì)導(dǎo)致一個(gè)意外錯(cuò)誤的發(fā)生。
          isThreadSafe:設(shè)置JSP文件是否能多線程使用。默認(rèn)為true。
          info:文本信息。能夠使用Servlet.getServletInfo()方法取回。
          errorPage:設(shè)置處理異常事件的JSP文件
          sErrorPage:設(shè)置此頁(yè)是否為處理異常事件的頁(yè)面,如果設(shè)置為true,就能使用exception對(duì)象。
          contentType:設(shè)置MIME類型和字符編碼集。MIME類型默認(rèn)為text/html,字符集默認(rèn)為charset=ISO-8859-1

          可以在一個(gè)頁(yè)面中使用多個(gè)<%@page %>指令,但是除了import屬性,其他的屬性只能使用一次。
          JSP缺省引入的包,下面這些包在JSP編譯時(shí)已經(jīng)導(dǎo)入了,所以在JSP文件中無(wú)需再用page指令引入:
          java.lang.*
          javax.servlet.*
          javax.servlet.jsp.*
          javax.servlet.http.*

          (2)include指令

          <%@ include file = "相對(duì)路徑" %>

          使用include指令可以在JSP中包含一個(gè)靜態(tài)的文件,同時(shí)解析這個(gè)文件中JSP語(yǔ)句。
          如果路徑以“/”開頭,那么此路徑主要是參照jsp應(yīng)用的上下文關(guān)系路徑。
          如果路徑以文件名或文件目錄開通,那么此路徑就是正在使用的JSP文件的當(dāng)前路徑。

          (3)taglib指令

          <%@ taglib uri = "TagLibrary" prefix = "mypfx" %>

          是用taglib指令定義一個(gè)標(biāo)簽庫(kù)及其自定義的前綴。
          uri:Uniform Resource Identifier根據(jù)標(biāo)簽的前綴對(duì)自定義的標(biāo)簽進(jìn)行唯一的命名,可以是一個(gè)相對(duì)或絕對(duì)的路徑
          prefix:自定義標(biāo)簽的前綴。不要使用jsp、jspx、java、javax、servlet、sun、sunw作為前綴,這些已被Sun公司聲明保留。

          4. 8個(gè)動(dòng)作指令
          (1)頁(yè)面跳轉(zhuǎn):<jsp:forward>
          <jsp:forward>標(biāo)簽從一個(gè)jsp文件向另外一個(gè)文件傳遞一個(gè)包含用戶請(qǐng)求的request對(duì)象。
          共包含2個(gè)屬性
          page屬性是一個(gè)表達(dá)式或是一個(gè)字符串用于說明將要定向的文件或URL。
          <jsp:param>向一個(gè)動(dòng)態(tài)文件發(fā)送一個(gè)或多個(gè)參數(shù)。如果使用了<jsp:param>標(biāo)簽,目標(biāo)文件必須是動(dòng)態(tài)的文件(如Servlet或者JSP等)

          <jsp:forward page=test.jsp>
           
          <jsp:param name="username" value="<%=user%>"/>
           
          <jsp:param name="password" value="12345678"/>
          </jsp:forward>

          通過request.getParameter("username")獲取用戶名
          (2)包含頁(yè)面:<jsp:include>
          <jsp:include>允許包含靜態(tài)和動(dòng)態(tài)Web資源,這兩種包含的結(jié)果是不同的。
          如果包含的僅是靜態(tài)文件,那么這種包含僅僅是把包含文件的內(nèi)容加到JSP文件中去,類似于<%@include%>;
          如果包含的是動(dòng)態(tài)web資源,那么這個(gè)被包含的文件也會(huì)被JSP編譯器執(zhí)行。
          如果這個(gè)包含文件是動(dòng)態(tài)的,那么還可以使用<jsp:param》傳遞參數(shù)和參數(shù)值。

          (3)創(chuàng)建Bean:<jsp:useBean>
          創(chuàng)建一個(gè)Bean實(shí)例并指定她的名字和作用范圍。

          <jsp:useBean id="beanInstanceName" scope="page|request|session|application" class="package.className"/>

          包含5個(gè)屬性。
          id:在所定義的范圍中確認(rèn)Bean的變量,程序中用id來(lái)使用此Bean實(shí)例。id的值對(duì)大小寫敏感。
          scope:Bean存在的范圍及id變量名的有效范圍。默認(rèn)值為page。
          class:使用new關(guān)鍵字及class構(gòu)造器從一個(gè)class中實(shí)例一個(gè)bean。這個(gè)class不能是抽象的,并且必須有一個(gè)公用的,沒有參數(shù)的構(gòu)造器。
          type:如果這個(gè)Bean已經(jīng)指定范圍中存在,使用type將賦予這個(gè)Bean一個(gè)數(shù)據(jù)類型。如果使用type的同時(shí)沒有使用class或beanName,Bean將不會(huì)被實(shí)例化。
          beanName:beanName可以是字符串的package.class,也可以是jsp表達(dá)式,它的值會(huì)傳遞給Beans.instantiate方法。type的值可以與beanName相同也可以是它的基類,或者是它所實(shí)現(xiàn)的接口。

          (4)設(shè)置Bean屬性:<jsp:setProperty>

          <jsp:setProperty name="beanInstanceName" property="*"|property="propertyName" value="string|<%=expression%>"
          |param
          ="parameterName"/>

          name:表示已經(jīng)在<jsp:useBean>中創(chuàng)建的Bean實(shí)例的名字,即id。
          property:匹配Bean中的屬性
          param:指request對(duì)象中的參數(shù)名,將對(duì)應(yīng)的值設(shè)定給Bean的屬性。
          value:使用指定的值來(lái)設(shè)定Bean屬性。這個(gè)值可以是字符串,也可以是表達(dá)式。如果是字符串,那么就會(huì)被轉(zhuǎn)換成Bean屬性的類型(如"0.98"會(huì)轉(zhuǎn)化成double類型0.98)。如果是表達(dá)式,則要求它的類型與Bean屬性的類型一致。
          PS:在同一個(gè)<jsp:setProperty>中不能同時(shí)使用param屬性和value屬性

          (5)取得Bean屬性:<jsp:getProperty>
          獲取已經(jīng)存在的Bean對(duì)象中的屬性值,在頁(yè)面中顯示。

          <jsp:getProperty name="beanInstanceName property="propertyName"/>

          name:與存在的對(duì)象實(shí)例的名字相同。
          property:對(duì)象中屬性名

          (6)使用Applet插件:<jsp:plugin>
          使用<jsp:plugin>插入一個(gè)applet或Bean,必要的話還要下載一個(gè)Java插件用于執(zhí)行它。

          1  <jsp:plugin type="applet" code="MeidaPlay.class" codebase="../classes">
          2   <jsp:parmas>
          3    <jsp:param name="way" value="Hall"/>
          4   </jsp:params>
          5   <jsp:fallback>
          6    <p>Unable to load applet!</p>
          7   </fallback>
          8  </jsp:plugin>

          (7)定義參數(shù):<jsp:param>
          可以在<jsp:include>、<jsp:forward>、<jsp:plugin>中使用。

          (8)插件錯(cuò)誤提示:<jsp:fallback>
          當(dāng)<jsp:plugin>插件不能夠正常顯示時(shí)顯示提示信息。

          三、JSP內(nèi)置對(duì)象
          1. Request:請(qǐng)求對(duì)象
          該對(duì)象封裝了用戶提交的信息,通過調(diào)用該對(duì)象相應(yīng)方法可以獲取封裝的信息。
          當(dāng)request對(duì)象獲取客戶提交的漢字字符是,會(huì)出現(xiàn)亂碼,必須進(jìn)行特殊處理。
          常用方法:
          getParameter(String parameterName):獲取表單提交的信息。
          getProtocol():獲取客戶使用的協(xié)議。
          getServletPath():獲取客戶提交信息的頁(yè)面。
          getMethod():獲取客戶提交信息的方式。
          getHeader(String str):獲取HTTP頭文件中的accept、accept-encoding和Host的值。
          getRermoteHost():獲取客戶的IP地址。
          getServerName:獲取服務(wù)器名稱。
          getServerPort:獲取服務(wù)器的端口號(hào)。
          getParameterNames():獲取客戶段提交的所有參數(shù)的名字。

          2. Response:響應(yīng)對(duì)象
          對(duì)客戶的請(qǐng)求做出動(dòng)態(tài)的響應(yīng),向客戶端發(fā)生數(shù)據(jù)。
          (1)動(dòng)態(tài)響應(yīng)contentType屬性
          用page指令靜態(tài)地設(shè)置頁(yè)面的contentType屬性,動(dòng)態(tài)設(shè)置這個(gè)屬性時(shí)使用response.setContextType("text/html;charset=utf-8");
          (2)Response重定向
          response.sendRedirect("index.jsp");

          3. Session:會(huì)話對(duì)象
          (1)什么是Session對(duì)象?
          Session對(duì)象在第一個(gè)JSP頁(yè)面被裝載時(shí)自動(dòng)創(chuàng)建,完成會(huì)話期管理。
          從一個(gè)客戶打開瀏覽器并連接到服務(wù)器開始,到客戶關(guān)閉瀏覽器離開這個(gè)服務(wù)器結(jié)束,被稱為一個(gè)會(huì)話。
          (2)Session對(duì)象的ID
          當(dāng)一個(gè)客戶首次訪問服務(wù)器上的一個(gè)JSP頁(yè)面時(shí),JSP引擎產(chǎn)生一個(gè)Session對(duì)象,同時(shí)分配一個(gè)String類型的ID號(hào),JSP引擎同時(shí)將這個(gè)ID號(hào)發(fā)送到客戶端,存放在Cookie中,這樣Session對(duì)象,直到客戶關(guān)閉瀏覽器后服務(wù)器端改該客戶的Session對(duì)象才取消,并且和客戶的會(huì)話對(duì)應(yīng)關(guān)系消失。
          (3)常用方法
          public String getId():獲取Session對(duì)象的編號(hào)。
          public void setAttribute(String str,Object obj):將參數(shù)對(duì)象添加到Session對(duì)象中。
          public Object getAttribute():根據(jù)屬性名獲取在Session對(duì)象中的屬性。
          public boolean isNew():判斷是否是一個(gè)新的客戶。

          4. Application:應(yīng)用程序?qū)ο?
          (1)什么是Application對(duì)象?
          在服務(wù)器啟動(dòng)后就產(chǎn)生了這個(gè)Application對(duì)象,當(dāng)客戶在所訪問的網(wǎng)站的各個(gè)頁(yè)面之間瀏覽時(shí),這個(gè)Appliaction對(duì)象都是同一個(gè),所有的客戶共享這個(gè)內(nèi)置的Application對(duì)象。
          (2)常用方法
          setAttribute(String key,Object obj):將參數(shù)對(duì)象添加到Application對(duì)象中。
          getAttibute(String key):根據(jù)屬性名獲取Application對(duì)象中的屬性

          5. Out:輸出對(duì)象
          out對(duì)象是一個(gè)輸出流,用來(lái)向客戶輸出數(shù)據(jù)。
          out.print():輸出各種類型數(shù)據(jù)。
          out.newLine():輸出一個(gè)換行符。
          out.close():關(guān)閉流。

          6. Config:配置對(duì)象
          一般我們使用Config對(duì)象獲取一些初始化配置信息,常用的方法有g(shù)etInitParameter和getInitParameterNames,以獲得Servlet初始化時(shí)的參數(shù)。

          7.Page:頁(yè)面對(duì)象
          page對(duì)象代表了正在運(yùn)行的由JSP文件產(chǎn)生的類對(duì)象,不建議一般讀者使用。

          8.PageContext:頁(yè)面上下文對(duì)象
          JSP引入的PageContext的類,通過它可以訪問頁(yè)面的許多屬性。pageContext變量存儲(chǔ)與當(dāng)前頁(yè)面相關(guān)聯(lián)的PageContext對(duì)象的值。PageContext類擁有g(shù)etRequest、getResponse、getOut、getSession等方法。

          9.Exception:例外對(duì)象
          exception對(duì)象代表了JSP文件運(yùn)行時(shí)所產(chǎn)生的例外對(duì)象,此對(duì)象不能在一般的JSP文件中直接使用,而只能在使用了
          <%@page isErrorPage="true"%>的JSP文件中使用。這是因?yàn)镴SP文件運(yùn)行時(shí)產(chǎn)生的錯(cuò)誤對(duì)象被向外拋出,只能被使用了
          <%@page isErrorPage="true"%>標(biāo)記從而具有攔截錯(cuò)誤對(duì)象功能的JSP所攔截。最常用的方法就是getMessage,用來(lái)獲取錯(cuò)誤信息。

          四、實(shí)例
          登陸頁(yè)面:index.jsp

            1<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
            2<html>
            3 <head>
            4  <title>系統(tǒng)登錄</title>
            5  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
            6  <link href="css/vbulletin.css" rel="stylesheet" type="text/css">
            7  <style type="text/css">
            8   .btn {
            9    font-family: "Tahoma", "宋體";
           10    font-size: 9pt;
           11    color: #001E3C;
           12    BORDER-BOTTOM: #6794BC 1px solid;
           13    BORDER-LEFT: #8BB8E0 1px solid;
           14    BORDER-RIGHT: #6794BC 1px solid;
           15    BORDER-TOP: #8BB8E0 1px solid;
           16    background-image: url(image/buttonbg.gif);
           17    CURSOR: hand;
           18    font-style: normal;
           19    padding-left: 3px;
           20    padding-right: 3px;
           21   }

           22  
          </style>  
           23  <script type="text/javascript">
           24   function doLogin(){
           25    var vform = document.loginform;
           26    if(!loginform.username.value){
           27     alert("請(qǐng)輸入用戶名!")
           28     return;
           29    }

           30     
           31    if(!loginform.password.value){
           32     alert("請(qǐng)輸入密碼!")
           33     return;
           34    }

           35   
           36    vform.submit();
           37    
           38   }

           39  
          </script>
           40 </head>
           41 <body topmargin="0" leftmargin="0" >
           42  <form action="receive.jsp" name="longinForm" method="post">
           43   <table width="100%" height="100%"> 
           44    <tr>
           45     <td align="center" valign="middle">
           46      <TABLE id="form1"    
           47       cellspacing="0" cellpadding="0" border="0" style="width: 500;">
           48       <CAPTION style="display: none">
           49       </CAPTION>
           50       <TR>
           51        <TD>
           52         <TABLE width="100%" height="100%" cellspacing="0" 
           53          cellpadding="0" border="0" style="table-layout: fixed">
           54          <TR>
           55           <TD valign="top">
           56            <FIELDSET id="form1_group0" style="width: 100%;">
           57             <LEGEND>系統(tǒng)登錄</LEGEND>
           58             <DIV>
           59              <DIV  style="width: 100%; height: 100%">
           60               <TABLE  width="100%" cellspacing="0"
           61                cellpadding="4" border="0" style="table-layout: fixed;">
           62                <COLGROUP>
           63                 <COL width="100"></COL>
           64                 <COL width="50%"></COL>
           65                 <COL width="100"></COL>
           66                 <COL width="50%"></COL>
           67                </COLGROUP>
           68                <TR>
           69                 <TD  align="right">
           70                  用戶名
           71                 </TD>
           72                 <TD class="InnerTableContentCell">
           73                  <input type="text" name="username"
           74                   style="width: 100%;">
           75                 </TD>
           76                 <TD  align="right">
           77                  密碼
           78                 </TD>
           79                 <TD>
           80                  <input type="password" name="password"
           81                   style="width: 100%;" />
           82                  <input type="hidden" name="action2" value="0">
           83                 </TD>
           84                </TR>
           85                <TR>
           86                 <TD colSpan="4"
           87                  align="right">
           88                  <input type="button" name="login" value="登錄" onclick="this.form.submit();"   class="btn"/>
           89                 </TD>
           90                </TR>
           91               </TABLE>
           92              </DIV>
           93             </DIV>
           94            </FIELDSET>
           95           </TD>
           96          </TR>
           97         </TABLE>
           98        </TD>
           99       </TR>
          100      </TABLE>
          101     </td>
          102    </tr>
          103   </table>
          104  </form>
          105 </body>
          106</html>

          接收數(shù)據(jù)頁(yè)面:receive.jsp

           1<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" info="動(dòng)作標(biāo)簽"%>
           2
           3<jsp:useBean id="userVo" class="exercise.vo.UserVo" scope="request">
           4  <jsp:setProperty name="userVo" property="name" param="username"/>
           5  <jsp:setProperty name="userVo" property="password" param="password"/>
           6</jsp:useBean>
           7
           8<html>
           9  <head>
          10    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" >
          11    <link href="css/vbulletin.css" rel="stylesheet" type="text/css">
          12  </head>
          13  
          14  <body> 
          15    This is my JSP page. <br>
          16    <hr>&lt;jsp:getProperty&gt;獲取表單中提交過來(lái)的值<br>
          17    name:<jsp:getProperty property="name" name="userVo"/><br>
          18    password:<jsp:getProperty property="password" name="userVo"/>
          19    <br><br><hr>
          20    <%
          21      out.println("從vo對(duì)象中直接獲取:<br> name:"+userVo.getName()+
          22      "<br>password:"+userVo.getPassword()+"<br>");
          23      String serviceName = request.getServerName();//1.jsp內(nèi)部的request對(duì)象
          24      out.println("<br><hr>服務(wù)器名: "+serviceName);
          25      out.println("<br>MIME類型: "+response.getContentType());//2.jsp內(nèi)部的response對(duì)象
          26      session.setAttribute("sessionName","jsp內(nèi)部的session對(duì)象");//3.jsp內(nèi)部的session對(duì)象
          27      out.println("<br>session對(duì)象: "+session.getAttribute("sessionName"));//4.jsp內(nèi)部的out對(duì)象
          28      pageContext.setAttribute("pageContext","上下文環(huán)境的引用");//5.jsp內(nèi)部的pageContext對(duì)象
          29     //6. application
          30     //7. config   ServletConfig的實(shí)例
          31     //8. page   java.lang.Object的實(shí)例
          32     //9. exception  必須在page指令中isErrorPage=true的頁(yè)面使用   java.lang.Throwable的一個(gè)實(shí)例
          33     String info = pageContext.getServletContext().getServerInfo();
          34     out.println("獲取page指令中的info屬性:"+info);
          35    
          %>
          36  </body>
          37</html>


           

          posted on 2009-04-12 20:51 hackiller 閱讀(1198) 評(píng)論(2)  編輯  收藏 所屬分類: J2EE第一次復(fù)習(xí)

          評(píng)論

          # re: J2EE復(fù)習(xí)(五)JSP基礎(chǔ) 2009-04-12 23:47 cbbs

          總結(jié)得不錯(cuò)!

          # re: J2EE復(fù)習(xí)(五)JSP基礎(chǔ) 2009-04-13 20:32 hackiller

          @cbbs
          謝謝,歡迎常來(lái)坐坐!
          主站蜘蛛池模板: 郎溪县| 郓城县| 杭锦后旗| 阳高县| 洪湖市| 东光县| 井研县| 贺兰县| 宁海县| 郴州市| 桂阳县| 甘德县| 门头沟区| 道真| 南投市| 拉孜县| 江油市| 依兰县| 伊宁县| 岳阳市| 阿拉善盟| 方城县| 二手房| 茌平县| 德州市| 两当县| 双鸭山市| 凉山| 本溪| 涿鹿县| 德州市| 云梦县| 南丰县| 德江县| 靖远县| 普兰店市| 当涂县| 寻乌县| 枞阳县| 永年县| 九龙县|