2012年11月28日

JSP(7)_格式標籤庫


Formatting格式標籤庫

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


前綴已經設定為fmt
功能說明語法
fmt:formatNumber設定數字的格式<fmt:formatNumber value="" var=""/>
fmt:parseNumber設定字串的格式<fmt:parseNumber value="" var=""/>
fmt:formatDate設定日期格式<fmt:formatDate value="" var=""/>
fmt:parseDate設定字串的格式<fmt:parseDate value="" var=""/>
fmt:setLocale設定區域環境變數,參數部分參考i18n相關設定<fmt:setLocale value="" var=""/>
fmt:setBundle設定資料包的設定<fmt:setBundle value="" var=""/>
fmt:timeZone設定時間地區<fmt:timeZone value="" var=""/>
fmt:setTimeZone設定時間地區<fmt:setTimeZone value="" var=""/>
fmt:message設定輸出字串可以配合多國語言<fmt:message value="" var=""/>
fmt:requestEncoding使用多字元的編碼<fmt:requestEncoding value="" var=""/>
fmt:bundle設定資料包的設定<fmt:bundle value="" var=""/>


屬性說明:
(1)fmt:formatNumber
   會與核心標籤庫搭配使用,如果不熟請先參讀核心標籤庫(Core Tag)

屬性參數說明例子
value需要,數字內容值<c:set var="number" value="500.00"/>
<fmt:formatNumber value="${number}"/>
typeNUMBER(預設),、CURRENCY、 PERCENT參數使用<c:set var="number" value="500.00">
<fmt:formatNumber value="${number}" type="CURRENCY"/>
pattern數字格式客制化設定<fmt:formatNumber value="125.0000" pattern="NT: ###,###.000"/>
maxIntegerDigits最大整數位,超過會四捨五入<fmt:formatNumber value="125.0000" maxIntegerDigits="3" />
minIntegerDigits最小整數位
maxFractionDigits最大分數
minFractionDigits最小分數
scopepage|request|session|application<fmt:formatNumber var="newNumber" value="125.0000" scope="page" />
var賦予變數名稱<fmt:formatNumber var="newNumber" value="125.0000" />
groupingUsed不會做group number<fmt:formatNumber value="12500.000" groupingUsed="false" pattern="NT: ###,###.000" />
輸出: 12500.000

  • 樣式格式(pattern)
樣式敘述
0表示為一個數字
E表示exponential格式
#表示為一個數字,當有空缺已0去補滿
.為小數點
;分隔符號
-負數
%百分點
貨幣可以在前面加入字母來表示貨幣的值



(2)fmt:parseNumber
   會與核心標籤庫搭配使用,如果不熟請先參讀核心標籤庫(Core Tag)

屬性參數說明例子
value需要,數字內容值<c:set var="number" value="500.00"/>
<fmt:parseNumber  value="${number}" />
typeNUMBER(預設),、CURRENCY、 PERCENT參數使用<c:set var="number" value="500.00">
<fmt:parseNumber value="${number}" type="CURRENCY"/>
parseLocale區域設定
integerOnly是否只輸出整數部分預設為false<fmt:parseNumber var="newNumber" value="125.0000"  integerOnly="true" />
pattern客制化輸出<fmt:formatNumber value="125.0000" pattern="NT: ###,###.000"/>
timeZone輸出時間<fmt:parseNumber var="newNumber" value="125.0000"  />
var賦予變數名稱<fmt:parseNumber var="newNumber" value="125.0000" />
scope
page|request|session|application<fmt:parseNumber var="newNumber" value="125.0000" scope="page" />


(3)fmt:formatDate


屬性參數說明例子
value需要,日期內容值<c:set var="date" value=" new Date()"/>
<fmt:formatDate value="${date}" />
typeDATE(預設)、TIME、 BOTH使用<c:set var="date" value=" new Date()"/>
<fmt:formatDate value="${date}" type="DATE"/>
dateStyleFULL, LONG, MEDIUM, SHORT, or DEFAULT(預設)<c:set var="date" value="new Date()">
<fmt:formatDate value="${date}" type="DATE"/>
timeStyle是否只輸出整數部分預設為false<fmt:formatDate var="newNumber" value="125.0000"  integerOnly="true" />
pattern客制化輸出<fmt:formatDate value="125.0000" pattern="NT: ###,###.000"/>
timeZone輸出時間<fmt:formatDate var="newNumber" value="125.0000"  />
var賦予變數名稱<fmt:formatDate var="newNumber" value="125.0000" />
scope
page|request|session|application<fmt:formatDate var="newNumber" value="125.0000" scope="page" />



  • 樣式格式(pattern)
樣式敘述
y表示年
M
表示月
d表示日
h(12制)表示小時(12制)
H表示小時(24制)
m表示分
s表示秒
S表示毫秒(millisecond)
E
表示一星期的禮拜幾
a表示AM/PM
D表示一年中的第幾天

(4)fmt:parseDate


(5)fmt:setLocale
當我們要顯示國家的貨幣符號可以利用locale來完成,設定區域環境變數,參數部分參考i18n相關設定。 而下面例子我們美國為例:

====================程式片段=================================
<c:set var="money" value="500.00"/>
<fmt:setLocale value="en_US"/>
<fmt:formatNumber value="${money}" type="currency"/>

 輸出結果: $500.00

(6)fmt:timeZone 與 fmt:setTimeZone
    屬性: <fmt:timeZone value="地區參數" />


     <c:set var="day1" value="<%=new Date()%>"/>
    <fmt:setLocale value="zh_TW"/>
    <fmt:formatDate value="${day1}" timeStyle="long" dateStyle="long" />



(7)fmt:message
    通常作為

屬性參數說明例子
keykey值,通常將key設在properties中
bundle用於資源包定義key/value對,如果<fmt:bundle>有定義就不需用此標記
var字串變數名稱
scope
page|request|session|application

EX:多國語言的介面,我們可以利用fmt:bundle和fmt:message來完成

英文: app.properties
lastName=Last Name
firstName=First Name
personInfo=Personal Infomation
hobby=hobby
sport=sport
sport1=baseball
sport2=football
sport3=abadminton

中文: app_zh_TW.properties
lastName=\u59d3
firstName=\u540d
personInfo=\u500b\u4eba\u8868\u55ae
sport=\u904b\u52d5
sport1=\u68d2\u7403
sport2=\u8db3\u7403
sport3=\u7fbd\u7403
hobby=\u55dc\u597d

撰寫主畫面:main.jsp
<body>
  <c:url var="engURL" value="application.jsp">
  <c:param name="locale" value="en_US"/>

   </c:url>
   <a href="${engURL}" >English</a>
   <c:url var="chineseURL" value="application.jsp">
   <c:param name="locale" value="zh_TW" />

   </c:url>
    <a href="${chineseURL}" >chinese</a>
</body>


個人表單畫面:application.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Insert title here</title>
</head>
 <c:set var="loc" value="en_US"/>
    <c:if test="${! empty (param.locale)}">
       <c:set var="loc" value="${param.locale}"/>
    </c:if>
   
    <fmt:setLocale value="${loc}"/>  
<body>
 <fmt:bundle basename="app">
 <table width="800" border="1px">
 <tr><td colspan="2" style="text-align:center"><h1><fmt:message key="personInfo"></fmt:message> </h1></td></tr>
 <tr><td style="text-align:center"> <fmt:message key="lastName" /></td><td style="text-align:left"> <input type="text"  name="lastName" value=""/></td>
 <tr><td style="text-align:center"><fmt:message key="firstName" /></td><td style="text-align:left"> <input type="text"  name="firstName" value=""/></td>
 <tr><td style="text-align:center"><fmt:message key="hobby" />    </td><td style="text-align:left"> <input type="text"  name="hobby" value=""/></td>
 <tr><td style="text-align:center"><fmt:message  key="sport" /></td>
 <td style="text-align:left"> 
  <fmt:message  key="sport1" /><input type="checkbox" value="sport" value="baseball">
  <fmt:message  key="sport2" /><input type="checkbox" value="sport" value="football">
   <fmt:message key="sport3" /><input type="checkbox" value="sport" value="abadminton">
 </td>
 </fmt:bundle> 
 <br>
 <tr><td colspan="2" style="text-align:center"><input type="submit" value="submit" /></td></tr>
 </table>
   <input type="hidden" name="locale" vaule="${loc}" ><br>
</body>
</html>



 
 

(8)fmt:requestEncoding
   <fmt:requestEncoding value="UTF-8" />

(9)fmt:bundle 與 fmt:setbundle
   <fmt:bundle basename="資料包位址" prefix="" />

   <fmt:setbudle basename="資料包位址" var=" " scope =" " />
 




















2012年11月27日

JSP(7)_核心標籤庫

如果我們已經會建立JSTL的環境,接下來我們深入探討核心標籤庫:

<% taglib prefix="c" uri="java.sun.com/jsp/jstl/core" %>
前綴已經設定為c
功能前綴字語法
c:catch抓取錯誤事件。<c:catch var="抓取的變數名稱">
</c:catch>
c:choose等同於if(邏輯條件)<c:choose>
 <c:when test="邏輯條件1">值</c:when>
 <c:when test="邏輯條件2">值</c:when>
 <c:otherwise></c:otherwise>
</c:choose>
c:when等同於else if(邏輯條件)<c:when test="邏輯條件"></c:when>
c:otherwise等同於else<c:otherwise></c:otherwise>
c:if等同於if<c:if var="變數" test="邏輯條件1" [scope="page|request|session|application"]
c:import引入某個URL的頁面<c:import  url="URL位置" [var="變數名稱"] />
c:out引用jspWrite物件輸出1.<c:out />這是一個title
2.<c:out value="這是一個title" />
c:param加入參數到此網頁<c:param var="變數名稱" value="內容值"  [scope="page|request|session|application"] [property="屬性修改"] [target=""]
c:redirect專送到另外網頁位址<c:redirect url="URL位址" />
c:remove移除某一活動變數<c:remove var="變數名稱" [scope="page|request|session|application"] 
c:set設定單一活動變數或是屬性值<c:set></c:set>
c:urlURL連結,等同於href的內容值<c:if var="變數" test="邏輯條件1" [scope="page|request|session|application"]
c:foreach擷取出表單的陣列的資料(如:checkbox)<c:foreach var="變數值" items="表單欄位值" [begin="數字"] [end="終止值"] [step="累進值"]> </c:foreach>

EX:


Form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<title>Insert title here</title>
</head>
<body>
  <form action="processForm.jsp" name="form1" >
    <input type="radio" name="sex" value="male" />男
    <input type="radio" name="sex" value="famale" />女
    <br>
    運動:
    <input type="checkbox" name="sport" value="baseball" />baseball
    <input type="checkbox" name="sport" value="football" />football
    <input type="checkbox" name="sport" value="soccer" />soccer
    <input type="checkbox" name="sport" value="swimming" />swimming
    <input type="checkbox" name="sport" value="badminton" />badminton
    <br>
    <input type="submit" name="submit"/>
  </form>

</body>
</html>


processForm.jsp

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>

<body>
<c:choose>
  <c:when test="${param.sex=='male' }">男</c:when>
  <c:when test="${param.sex=='famale' }">女</c:when>
</c:choose>
<c:forEach var="aValue" items="${paramValues['sport']}">
  ${aValue}
</c:forEach>

</body>
</html>










2012年11月26日

JSTL環境建構

本文章主要介紹如何去建置標準的JSTL的標記,它主要可以分為五大類如下表所示:

功能分類前綴字URI
Core Tagchttp://java.sun.com/jsp/jstl/core 
Formatting Tagfmthttp://java.sun.com/jsp/jstl/fmt 
SQL Tagsqlhttp://java.sun.com/jsp/jstl/sql 
XML Tagxhttp://java.sun.com/jsp/jstl/x
JSTL Funciton 



我們開始建立這些標準的JSTL標記,我們會分為3步驟


  1. 下載標準JSL的JAR檔與tld檔
  2. 下載網址為:http://tomcat.apache.org/taglibs/standard/ 版本為JavaServer Pages 1.2 
     將standard.jar和jstl.jar的檔案複製到WEB-INF/lib/下面,順便也將eclips也import進去
     在WEB-INF/下面新增資料夾為tld,資料夾tld將它

  3. 編輯web.xml加入下列載入taglib的設定
  4.  <taglib>
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    <taglib-location>/WEB-INF/tld/c.tld</taglib-location>
    </taglib>    

  5. 編輯JSP網頁
  6. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <body>
     <c:set var="title">title:aaa</c:set>
    </body>    
如果沒有出現任何錯誤就是jsp可以順利轉成servlet檔,進行編譯與執行。
接下來學習進階JSTL
















2012年11月25日

JSP(4)_隱含物件



  • JSP隱含物件
         隱含物件主要用來方便抓取前一個作業所傳送的資料或是需要傳送資料,JSP頁面隱
         含這些物件方便我們使用。

隱含物件 類別與介面 說明
request javax.servlet.HttpServletRequest  取得用戶端的資料或是系統資料
respone javax.servlet.HttpServletResponse  回應伺服器處理的結果給用戶端
application javax.servlet.ServletContext
session javax.servlet.http.HttpSessionsession物件
config javax.servlet.ServletConfig JSP轉Servlet的資料
page java.lang.Object
pageContext javax.servlet.jsp.PageContext JSP頁面所儲存的資料,用此pageContext可以讀取到getException、getPage和
getSession
exception java.lang.Throwable處理例外事件的發生
out javax.servlet.jsp.JspWriter 為輸出的界面

(1) request物件
     HttpServletRequest物件用來收集使用者的請求,如name/value、屬性資料或是串流資料
     客戶端透過HTTP協定會將資料傳輸給伺服器端,而我們從客戶端所接受到的資料JSP頁
     面可以利用 request物件來接收。它提供一些重要的方法:取得伺服器IP位址、設定/取得
     屬性資料、或是取得請求的參數等等。


方法說明例子
Object getAttribute(String param)  取得物件的內容值,如果不存在會回傳null
String getParameter(String name)一般只能接收字串的物件
Object setAttribute(String name, Object value )  設定物件的內容值與名稱
Enumeration getParameterNames()回傳所有的參數名稱
String[] getParameterValues(String Name)回傳參數的字串陣列,通常會有陣列大多為checkbox或是多選下拉式選單等等
Enumeration getAttributeNames()回傳所有的
String getAuthType()身分認證方式,需要在伺服器端作環境設定才有能使用
int getContentLength()取得使用者所傳送資料的長度,以byte為單位計算
Cookie[] getCookie[]回傳用戶使用的cookie物件集合
String getHeader(String name)取的標頭內容值
Enueration getHeaderNames()回傳標頭名稱的集合
String getMethod()取得傳送用戶端資料的方法,Get、POST、PUT等等方法
String getProtocol()取得協定
String getRemoteAddr()取得代理伺服器的IP位址
String getServerName()取得網頁伺服器名稱
String getServerPort()取得網頁伺服器埠號
String getServerPath()取得網頁伺服器相對路徑與檔名
HttpSession getSession()取的session物件
boolean isSecure()Server的需求是否有透過安全通道,有用為true,沒有為否



getAttribute()和getParameter()之間不同:
getAttribute()與setAttribute()只會在web容器內部傳遞;而getParameter()需要透過get/post傳遞。而getParameter沒有對應的setParameter方法。

EX:


<html>
<Meta http-equiv="Content-Type" Content="text/html; Charset=UTF-8">
<head></head>
<body>
<form name="form1" action="./user/jsp/information.jsp">
 <label>姓名:</label><input type="text"  name="username" maxlength="10"  size="10" value="" /> <br/>
 <label>性別:</label><input type="radio"  name="sex" value="man" />男 <input type="radio" name="sex"  value="women" />女<br/>
 <label>興趣:</label><input type="checkbox" name="hobby" value="sport" />運動
<input type="checkbox" name="hobby" value="movice" />看電影
<input type="checkbox" name="hobby" value="music" />音樂
<input type="checkbox" name="hobby" value="book" />看書<br/>
 <label> </label> <input type="submit" name="submit" value="提交" />
</form>
</body>
</html>




information.jsp


<html>
<body>
       姓名:<% out.println(request.getParameter("username")); %>
<br>性別:<% out.println(request.getParameter("sex")); %>
<br>興趣:<% String hobbys[] = request.getParameterValues("hobby") ;
                     for(int i=0 ; i<hobbys.length;i++)
                     out.println(hobbys[i]+",");
              %>
</body>
</html>

 EX:印出標頭資訊


<table width="90%" border="1" >

<tr><td>標頭變數</td><td>內容值</td></tr>
<%
    Enumeration enuHeader  = request.getHeaderNames();
  while(enuHeader.hasMoreElements())
  {
  String strName = (String) enuHeader.nextElement() ;
  String value = (String) request.getHeader(strName) ;
  out.println("<tr><td>"+strName+"</td>");
  out.println("<td>"+value+"</td></tr>");
  }

%>


(2)respone物件
    HttpServletResponse介面用來回應使用者訊息用,包含傳送訊息到前端、重新轉送。


方法說明例子
boolean containsHeader(String name)指定標頭名稱是否存在
void addHeader(String name, String value)新增標頭內容值
void setHeader(String name, String value)設定物件的內容值與名稱
void addIntHeader(String name ,int value)新增標頭內容值
void setIntHeader(String name, String value)設定物件的內容值與名稱
String getCharacterEncoding()取得字元編碼方式
void setCharacterEncoding(String charset)設定字元編碼方式
String getContentType()

void setContentType(String type)

void sendRedirect(String location)重新導向至指定URL








HttpSession getSession()取的session物件
boolean isSecure()Server的需求是否有透過安全通道,有用為true,沒有為否



  sendRedirect重新導向:
 常見的應用在身分認證,當我們輸入帳密錯誤時,它會自動導到錯誤的畫面,或是當我們
 到未授權的網頁時,系統會先導向需要先輸入帳密。這些都是利用sendRedirect的功能。它
 一開始瀏覽器會送出請求給伺服器,伺服器接收到後會轉送請求,第二次才會傳送需要轉送的網頁位址給伺服器,收到後才會送出正確的網頁給客戶端。所以它與其他轉送函式的不同是他必須透過瀏覽器才可以完成轉送的程序。




 (3)Cookie處理
    cookie解決網頁程式設計師資料暫存問題,它可以保留使用者資料的訊息,例如: 線上採
    購商品的訊息、使用者上次登入時間等等,都可以存在Cookie中,我們主要利用response
    函式完成。
 
 
 先要宣告就建構子: Cookie cookie = new Cookie(String name , String value)
  需要利用response隱含物件來加入到瀏覽器的Cookie
方法說明例子
void addCookie()  加入Cookie物件
Cookie[] cookie =getCookie()得到Cookie物件





Cookie屬性
屬性說明例子
int getMaxAge()回傳cookie的存活時間(單位秒),無限期為-1,int maxAge =cookie.getMaxAge() ; 
void setMaxAge(int secound)設定cookie的時間,單位為秒int month= 60*60*24*30  ; //一個月
cookie.setMaxAge(month) ;
boolean getSecure()判斷是否有SSL協定,有為true,否為falseboolean  isSecure = getSecure()

void setSecure(boolean flag)設定SSL傳送cookie內容cookie.setSecute(true) ; 


(4)out物件
  out物件會去實作javax.servlet.jsp.JspWriter,主要這個有兩個功能:
  1.將資料輸出網頁畫面
  2.控制緩衝區: 每個JSP網頁都有固定的緩衝容量,當每一次out.println()時不會立即輸出網
     頁畫面,他會等到緩衝區滿或是手動response.flushBuffer()清理緩衝區,_才會輸出。

方法說明例子
void clear()清除緩衝區的內容,當緩衝區清空時,則丟出IOException例外
void clearBuffer()清除緩衝區的內容,若緩衝區已被清空,不丟出IOException例外
void close()

void flush()

int getBufferSize()取得緩衝區的大小KB
int getRemaining()取得緩衝區的剩餘大小KB
boolean isAutoFlush()是否會自動清除緩衝區。
void newLine()換行字元
void println(data)輸出資料自動換行
void print(data)輸出資料

(5)application物件
    系統層級的物件,此物件的生命週期為當我打開應用程式時就會生效直到應用程式關到
    才會消失。

方法說明例子
void setAttribute(String name , Object value)設定系統層級的變數內容,無值時會回傳null<%  application.setAttribute("superuser","root)"
%>
Object getAttribute(String name)取得系統層級物件內容<%
     application.getAttribute("superuser")
%>
void removeAttribute(Stirng name)移除系統層級的物件內容<%
application.removeAttribute("superuser")
%>
Enumeration getAttributeNames()取得在系統層級所有屬性的名稱陣列。<%
  Enumeration enumNames = application.getAttributeNames()
 while(enumNames.hasMoreElements())
 {
    String strName = (String)enumName.nextElement() l
 }
%>
void log(String msg)指定訊息寫入Servlet日誌檔





(6)session物件
    主要是實作javax.servlet.http.HttpSession介面,它跟cookie的不同session的資料位置在伺
    服器中,所以安全性會更高但是由於session存放在伺服器的數量有限,所以還是需要

方法說明例子
void setAttribute(String name , Object value)設定使用者層級的變數內容,無值時會回傳null<%  session.setAttribute("superuser","root)"
%>
Object getAttribute(String name)取得使用者層級物件內容<%
     session.getAttribute("superuser")
%>
void removeAttribute(Stirng name)移除使用者層級物件內容<%
session.removeAttribute("superuser")
%>
Enumeration getAttributeNames()取得在使用者層級所有屬性的名稱陣列。<%
  Enumeration enumNames = session.getAttributeNames()
while(enumNames.hasMoreElements())
 {
    String strName = (String)enumName.nextElement()
 }
%>
void invalidate()使session物件失效





(7) config物件
     此物件用來抓取web.xml中的servlet的初始值,常用的方法:

方法說明例子
String getInitParameter(String name)取得web.xml中servlet的初始值,需要做web例外作宣告
Enumeration getInitParameterNames()

ServletContext getServletContext()取得servletContext參照
String getServletName()取的servlet名稱



EX:取得初始值: getInitParameter()
      web.xml

(8) pageContext物件


方法說明例子
void setAttribute(String name , Object value)設定屬性變<%  pageContext.setAttribute("superuser","root)"
%>
void setAttribute(String name , Object value,int scope)設定屬性變數,並指定範圍
<%  pageContext.setAttribute("superuser","root)"
%>
Object getAttribute(String name)取得屬性變數<%
     pageContext.getAttribute("superuser")
%>
Object getAttribute(String name,int scope)取得屬性變數,並指定範圍
void forward(String url)相對路徑,轉送至另一個網頁
<%
     pageContext.forward("ex1.jsp")
%>






(9)exception物件
    exception物件需實作java.lang.Throwable類別,一般在jsp轉譯為servlet時,並不會去實作
    exception物件而是需要在下達<%@ page pageError="true" %>指令,exception物件才可以進
    行存取。 
    方法說明例子
    String getMessage()回傳錯誤訊息
    String toString()回傳錯誤訊息時,會加上類別名稱。






  • JSP網頁內物件的範圍與有效期間
        application:  當伺服器生效時,它就會生效直到伺服器關掉,才會使此Application變數結
                          束,此變數的範圍,可以不同網頁、不同的使用者都可以讀取到此變數。
        session     :  為用戶建立連線時,會同時建立session物件,單一使用者讀取。生命週期
                          當超過seesion設定的時間或是連線中斷。
        request     :  為有效生命週期為客戶一次請求。
        pageContext:只有在JSP網頁內才有效。
        
        application > session > request >pageContext

       










2012年11月23日

JSP(3)細談JSP語法

細談JSP語法

  • JSP語法

         JSP語法屬於內嵌式在HTML中,但是它會轉成Servlet Class檔,但是編譯器如何知道
         區分哪些是HTML語法,哪些是JSP語法。答案就是利用不同的標記去做辨識,基本  
         上web容器只認識 <% %>標籤內的語法並做轉換。以下會一一介紹這些語法的規範與
         應用。

JSP常用的語法整理
標記 說明 符號
註解
(Comment)
說明程式用,編譯器不會載入其內容 <%--  註解 --%>
宣告
(Declaration)
宣告變數名稱或是方法 <%! 宣告 %>
指令
(Directive)
載入JSP網頁之前需要使用載入的環境或是檔案 <%@ 指令%>
標記
(Scriptlet)
程式語法<% 程式碼 %>
運算式標記
(Expression)
運算式支援變數運算 <%=運算式%>


  • 註解:
    <%-- 註解 --%>編譯器看到這種標記,它會自動過濾掉不做編譯的動作,也不會再使用者   
    端看到註解內容。


  • 宣告:
     一般在此宣告的方法會在整個類別層級,提供該整個類別去做使用

    EX: <%! final String strHello="Hello,JSP">


  • 指令

    <%@ 指令 屬性="值" %>
EX :
<%@ page contentType="text/html;charset=ISO-8859-1" import="java." %>
<%@ page language="java" buffer="none" isThreadSafe="yes"  errorPage="/error.jsp" %>

屬性 說明
language JSP主要還是已支援java語言為主
<% page language="java"  %>
extends 使JSP可以繼承父類別的屬性或是方法
import JSP頁面上載入所需要的jar檔,提供後面方法使用。
<%@ page import = "java.util.*" %>
session value="true|false"如果為true就是能夠使JSP讀取到implicit session物件,預設為true
buffer value="none|10kb"指定緩衝區的容量,
autoFlush value="true| false" ,如果為true緩衝區會自動的flush,
isThreadSafe value="true|false",
errorPage 當發生錯誤時,可以導向到另外一個頁面。
<%@ page errorPage="error/myerror.jsp" %>
isErrorPage value="true|false",當發生錯誤時,是否會導向到另外一個JSP頁面做處理。
contentType value="text/html;charSet(網頁的字元集)=ISO-8859-1"

(1) info
利用info可以記載JSP文件的相關訊息,例如作者、版本以及版權宣告等等。
Ex: <%@ page info = "The web page , Copyright 1982 by Kevi Flynn." %>

(2)contextType屬性
設定Http回應的內容MIME,常設定有"text/html"、"text/xml"、"text/plain"等等,
Ex: <%@ page contextType= "text/html; charset=ISO-8859-1 "  %>

(3)pageEncoding
<%@ page pageEncoding="ISO-8859-1" %>

(4) extends
JSP轉譯為Servlet,希望該頁面可以繼承某個功能可以利用extends,如果使用HTTP協定需要實作javax.servlet.jsp.HttpJspPage介面,或是改用其他協定需要實作javax.servlet.jsp.JspPages介面

<%@ page extends="com.taglib.wdjsp.MyJspPage" %>

(5)import屬性
載入模組等於java import的敘述
Ex: <%@ page improt="java.util.list " %>

(6) buffer
控制緩衝區使用,緩衝區是可以保留前一個網頁的內容,不會因為錯誤或是意外而消失,建議使用<jsp:forward>或是errorPage屬性指定錯誤頁面時,都不要關閉緩衝區
<%@ page buffer="12Kb" %>
關閉緩衝處理: <%@ page buffer="none" %>

(7) autoFlush
當緩衝區已滿時,使否要將內容傳送出去頁面,預設為true,表示為送出頁面並清空。
<%@ page autoFlush = "true" %>
(8)isThreadSafe
是否可以安全處理多個用戶的請求,當你設定為false表示該JSP網頁不會讓多個執行緒去做處理,何時設為true或是false,當你連結資料庫,該頁面只可以被單一執行緒所去使用,所以該JSP頁面不可以同時處理多個要求,應將isThreadSafeˊ為false,但是若該資料連結可以做Connection Pooling時,表示後面的連結可以自動等待前面的回收後去做連結資料庫,所以isThreadSafeˊ為ture
  • include
         include指令用在我們可以載入其他檔案或是網頁(html、JSP),它在轉譯(translation
         time)階段就會將檔案做載入的動作。

     <%@ include file="header.html" %>
     <%@ include file="header.jsp" %>
屬性說明
file可以參考檔案或是URL做為載入的動作。
語法: file="檔案路徑"
  • taglib
        taglib為標記函式庫(tag library),它可以讓網頁開發者可以自訂自己的標記,當然SUN
        提供很標準的標記程式庫(JSTL,Java Standard Tag Library)。標記語法如下
        <%@ taglib prefix="標記" uri="標記程式庫.tld"  tagdir="標記目錄位址" %>


  • 宣告變數
<%! private int x=0 , y=0; private ......%>


  • JSP生命週期
執行JSP頁面 -> JSP容器初始化或是回收物件呼叫jspInit() ->  執行頁面 -> 回收JSP頁面jspDestory()
 這裡需要知道jspInit()和jspDestory()方法,


補充: uri一制性辨識子用來載入標記程式庫,TLD為XML的格式,用來定義標記的的結構。

(4)標記
     可以嵌入一般的java語法。
        

(5)運算式標記
       運算式標記格式;<%=expression %>
       運算式標記常用於顯示變數的值或是執行

隱含物件

隱含物件就是每個JSP的頁面,在web容器初始化時就會建立這些物件,所以不需要自行宣告,就可以使用。

物件名稱 類別或是介面 說明
page javax.servlet.jsp.HttpJspPage 表示該物件將JSP頁面可以轉換為Servlet的執行個體
config javax.servlet.ServletConfig JSP頁面可以轉換為Servlet的執行個體,該物件得ServletConfig的物件
request javax.servlet.http.HttpServletRequest 用戶端的物件的請求
response javax.servlet.http.HttpServletResponse 表示伺服器端的回應
out javax.servlet.jsp.JspWrite 表示為輸出串流
session javax.servlet.jsp.HttpSession 表示為seesion物件
application javax.servlet.ServletContext 長存在Web應用程式中,可以給所有JSP共用
pageContext javax.servlet.jsp.PageContext JSP的共同關聯資料
exception javax.lang.Throwable 代表沒有被截取一長


(1)page 物件



































2012年11月22日

JSP(2)_Servlet應用

  • Servlet

是利用JAVA語言來實現CGI的一種方式,通常實作方式就是implement或是繼承httpservlet類別,在eclips環境下必須先import開發網頁所需要的類別servlet-api.jar載入(位置:在Tomcat 目錄的lib 目錄中)。






  • HttpServlet類別

         HttpServlet為一個抽象類別,主要接收/回應web容器的資料,大概常用的方法有get和
         post兩種。

(1)doGet: 主要接收前端的get的傳送方法
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

}

(2)doPost:主要接收前端網頁的Post的傳送方法

    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {


    }


(3)service:主要接收前端網頁的get/Post的傳送方法


  protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
    throws ServletException, IOException {
    // TODO Auto-generated method stub
    super.service(arg0, arg1);
    }





  • servlet生命週期


  下圖是說明當我們建立好servlet物件時,web容器如何處理從前端接收到請求到servlet引擎
   執行後歸還資源。我們會一一說明之;

(1)載入Servlet類別: 當用戶喚起servlet物件時,他會將物件載入到web container中,而這樣類
                              別通常會在WEB-INF/classes下面。

(2)建立servlet實例:web.xml中定義的所有servlets實例都會建立自己的實例,當有很多需求進
                            來時,也只有一個servlet實例去做處理。

(3)呼叫init() :會先將web.xml所定義參數初始化,
(4)呼叫doPost()/doGet()方法:根據前端的需求去做處理,當有多個請求時,web容器會分配不
                                            同的執行緒做處理。
(5)摧毀servlet:當資源不夠或是應用程式關閉,JVM會自動的將實例回收。

  • MVC


早期因為JSP語法容易和前端HTML混在一起使用,而造成開發與維護上的困難與除錯難度高,所以漸漸衍生出MVC的軟體設計模式出現。MVC全名為Model-View-Controller,也就是說把一個系統分為檢視(View)、模型(Model)和控制器(Controller)。 下圖中可以說明了使用者與MVC架構之間的關係,當使用者一開始連線到伺服器時,出現預設的畫面,然後會根據使用者的想法,控制器會去做出使用者可預期的動作,例如:今天A君要輸出年度預算報表時,控制器會根據"這個需求"指派給預算模型去做計算並得到結果,再由控制器將結果回覆給前端的檢視介面。

模型       :   主要是負責商業邏輯的運算,具有高內聚的特性,當我設計系統時,商業領域
                  區分為多個模組去做各自任務與運算。這種方式方便複製到下一個專案開發所
                  需。

檢視介面:  負責使用者顯示的介面的方式(網頁、excel、視窗或是console介面等等)。

控制器   :   將使用者的請求需要做顯示或是商務模型(商業處理),你可以想像就是利用
                  servlet去做控制,這種方式可以減少顯示與程式之間的耦合度程度。



























JSP(1)_jsp與servlet的關係


JSP網頁Basic

JavaServer Page(JSP)介紹

JSP是一種網頁程式語言,內嵌於HTML網頁中,經由編譯器轉換成java的程式語言,如下圖所示,<% %>之間的內容為JSP的網頁語法,它會由JSP引擎編譯成java語法的檔案,丟給servlet處理

缺點:  與HTML網頁混合,維護不易。

  • Servlet介紹

Servlet主要用來接收客戶端的請求與回應,它是由單純的java語法組成,會去繼HttpServlet類別,會去實作HTTP的協定(Post,Get)來接收表單傳送過來的值。以下程式是實作網頁前端拋給servlet的方式。


  • JSP和Servlet的關係

當我們打開Browser時,我們輸入URL(例如:www.mysit.page.jsp)網址時,第一次呼叫時,Web容器的JSP網頁會由JSP引擎編譯成java servlet檔案,再由servlet引擎執行所要求的程序,


  • JSP生命週期
    JSP網頁也是Servlet的一種,當我們第一次拜訪jsp網頁時,它第一次執行的速度會很慢,
    因為它必須先 轉成Servlet檔案,而轉譯的過程它必須先繼承  
    org.apache.jasper.runtime.HttpJspBase介面並且實作JspSourceDependent。那要JSP第一次載
    入web容器需要做甚麼才可以使它動作。

     (1)JSP轉譯成Servlet : 當使用者登入時,JSP網頁會先轉譯成Servlet檔案,如果是使用To
                                       mcat會在work的目錄底下,它會是xxx_jsp.java檔案。
     (2)編輯Servlet為.Class: 會將xxx_jsp.java檔編譯成xxx_jsp.class才可以給JVM做執行
     (3)載入Servlet類別: Web容器會將Servlet類別(xxx_jsp.class)載入。
     (4)建立Servlet實例: 建立Servlet的實例,這時已經將該實例載入記憶體中
     (5)初始化呼叫jspInit()方法: 這時實例進行初始化,
     (6)呼叫_jspService() : 此方法跟servlet的Service()相同,接收web容器的需求,當同時有多
                                      個需求時,會分配多個執行去做 處理                          
     (7)回收資源jspDestory(): 當Servlet實例不再使用或是關閉web容器時,都會將資源釋放
                                           給回JVM系統中。



     

     




2012年11月21日

網頁技術初探


網頁技術初探(1)

網頁請求與回應

近幾年很流行的動態網頁,說明網頁即時回應的重要我們利用下圖去說明動態網頁的運作
,當我們打開瀏覽器時,我們會輸入URL來連結網頁的內容,這時會向網頁伺服器送出請求,根據使用者要求執行網頁程式(ASP、JSP和PHP)等等執行程式的程序,會將程式執行的結
果,再給網頁伺服器再回應給瀏覽器。在這過程中,網頁伺服器扮演著編譯器的角色,而望頁程式扮演的執行者的角色,網頁伺服器主要工作會把執行者執行的結果編譯成網頁格式(HTML),回傳給前端使用者。我們下面會一一解析它們扮演角色的重要性。


網頁伺服器:

一個網頁伺服器,主要會完成三項任務
  1. 它會提供服務
  2. 它提供空間放置網頁
  3. 它會提供HTTP協定與瀏覽器做溝通        

而要達到網頁伺服器必須建置網頁伺服器的程式,目前比較有名的網頁伺服器如下:
  • Apache軟體基金會的Apache HTTP伺服器
  • Microsoft的Internet Information Server(IIS)
  • Google的Google Web Server

網頁程式 :

網頁程式主要可以分為客戶端網頁程式與伺服器端網頁程式,主要的不同是伺服器端網頁程式是在伺服器端的網頁程式都需要編譯器去編譯程式才會執行,主要的工作例如:製作報表、商業邏輯、連結資料庫等等。比較不會因為客戶端的不同而去需要改變,但是當多人使用時,需要考慮到網路頻寬與伺服器硬體的問題。至於客戶端的網頁程式應用瀏覽器中,只要瀏覽器是以直譯的方式顯示,主要做一些網頁排版或是動態顯示等等,例如:身分證驗證、電子郵件驗證等等都是常看到的應用。

*客戶端網頁程式:  JavaScriptCSSVBScript
*伺服器端網頁程式 : PHP ASP JSPPerl

各種程式的優勢與劣勢


網頁程式 優點 缺點
PHP好學、有強大的函式庫
支援套件多

網頁語法與PHP程式會混在一起,維護不易
非物件導向程式語言不好做擴展
JSP 網頁顯示與程式可以分開
容易模組化
可以自訂開Tag
多種framwork可以使用
多平台使用
學習時間長
framework容易無法長期支援,而造成維護困難
ASPIDE整合環境好,開發快
網頁顯示與程式可以分開
使用者可以快速上手
很難學習到技術基礎
有些企業的需求無法滿足


待續....