標籤:style blog http io color ar os 使用 java
一,JSP簡介
- JSP---Java Server Pages
- 擁有servlet的特性與優點(本身就是一個servlet)
- 直接在HTML中內嵌JSP代碼
- JSP程式由JSP Engine先將它轉換成Servlet代碼,接著將它編譯成類檔案載入執行
- 只有當用戶端第一次請求JSP時,才需要將其轉換、編譯
- 優點:
二,JSP基本文法
JSP傳統文法
- Declaration 聲明
- Scriptlet 小程式段
- Expression 運算式
- Comment 注釋
- Directives 指令
- Action 動作指令
- 內建對象
JSTL
JSF
1,JSP-Declaration
基本文法: <%! %> 說明:在此聲明的變數、方法都會被保留成唯一的一份,直到JSP程式停止執行
body> <%! int count=0; %>//成員變數,相當於全域變數,因為jsp會先轉換為servlet,servlet只new一個執行個體。可以定義方法 <% int count2=0; %>//局部變數,不能定義方法 <h> count:<%= ++count %><br> count2:<%= ++count2 %> </h> </body>
2,Scriptlet
基本文法: <%程式碼區%> 可以放入任何的Java程式碼
<!-- html注釋,用戶端源碼可以看見 --> <%-- jsp注釋 --%> <% // 注釋1 java注釋 /* 注釋2 */ String bgColor=request.getParameter("bgColor"); boolean hasColor; if(bgColor!=null){ hasColor=true; } else{ hasColor=false; bgColor="white"; } %> <body BGCOLOR=<%= bgColor %>> <% if(hasColor){ out.println("bgColor:"+bgColor); } else{ out.println("background is white"); } %> </body>
3,運算式
基本文法: <%=… …%> =後面必須是字串變數或者可以被轉換成字串的運算式 不需要以 ; 結束 只有一行例: <%=“hello world”%> <%=i+1%> <%=request.getParameter(“name”)%>
4,Derictive
- Directive(編譯指令)相當於在編譯期間的命令
- 格式:
- 常見的Directive:
a,Derictive-page指明與JSP Container 的溝通方式基本格式:
<%@page language=“script language”| extends=“className”| import=“importList”| buffer=“none|kb size”| --none:不緩衝,預設8k session=“true|false”| --是否可以使用session,預設true autoFlush=“true|false” --緩衝器是否自動清除,預設true isThreadSafe=“true|false”| --預設false(永遠不要設成true) info=“infoText”| --任何字元 errorPage=“errorPageUrl”| isErrorPage=“true|false”| contentType=“contentTyepInfo”| pageEncoding=“gb2312”%>
b,Directive--include 編譯期間的指令
- 將指定的JSP程式或者HTML檔案包含進來
- 格式:
- <%@include file=“fileURL%>
- JSP Engine會在JSP程式的轉換時期先把file屬性設定的檔案包含進來,然後開始執行轉換及編譯的工作。(原封不動的把檔案的代碼copy到該位置,然後進行轉換和編譯,只生 成一個java和class)
- 限制:
- 不能向fileURL中傳遞參數
- 不能abc.jsp?user=aaa
5,Action
Action(動作指令)在運行期間的命令常見的:
- jsp:useBean
- jsp:setProperty
- jsp:getProperty
- jsp:include
- jsp:forward
- jsp:plugin
a,jsp:include/jsp:param
- 用於動態包含JSP程式或HTML檔案等
- 除非這個指令會被執行到,否則它是不會被Tomcat等JSP Engine編譯。
- 格式:
- <jsp:include page=“URLSpec” flush=“true”/>
- <jsp:include page=“URLSpec” flush=“true”>
- <jsp:param name=“ParamName” value=“paramValue”/>
- </jsp:include>
- jsp:param用來設定include檔案時的參數和對應的值
- 和編譯指令include的區別
- include編譯指令是在JSP程式的轉換時期就將file屬性所指定的程式內容嵌入,然後再編譯執行;而include指令在轉換時期是不會被編譯的,只有在用戶端請求時期如果被執行到才會被動態編譯載入
- Include不能帶參數, 而<jsp:include>可以
b,jsp:forward / jsp:param
用於將一個jsp的內容傳送到page所指定的JSP程式或者Servlet中處理(URL)格式:<jsp:forward page=“urlSpec” flush=“true”/><jsp:forward page=“urlSpec”>
<jsp:param name=“paramName” value=“paramValue”/>
</jsp:forward>
<jsp:param>用於指定參數和其對應的值例如:test.jspforward.jsp / forforward.jsp
<jsp:forward page="forforward.jsp" />
forward1.jsp / forforward1.jsp(with parameters)
<jsp:forward page="forforward1.jsp"> <jsp:param name="name" value="m" /> <jsp:param name="oldName" value=‘<%=request.getParameter("name")%>‘ /> <jsp:param name="roles" value="manager" /></jsp:forward>
Forward的頁面和forward到的頁面用的是同一個request與此相對應的是 response.sendRedirect<jsp:forward>與response.sendRedirect的區別
使用同一個requestforward後的語句不會繼續發送給用戶端速度快伺服器內部轉換,可以傳參數
是不同的requestsend後的語句會繼續執行,除非return速度慢需要到用戶端的往返,可以轉到任何頁面可以傳參數,直接寫在url後面c,jsp:useBean
- 通過jsp:useBean,可以在JSP中使用定義好的Bean
- Bean的基本要素:
- 必須要有一個不帶參數的構造器。在JSP元素建立Bean時會調用空構造器
- Bean類應該沒有任何公用執行個體變數,也就是說,不允許直接存取執行個體變數,變數名稱首字母必需小寫
- 通過getter/setter方法來讀/寫變數的值,並且將對應的變數首字母改成大寫
- 基本用法:
- test.jsp/CounterBean.java 不要使用裸體類(規範要求)應該放在包裡面
<%@ page import="bean.*" %><%--<% //response.sendRedirect("../servlet/ShowRs"); %><% CounterBean cb = new CounterBean(); %><font color="red" size="5"> <%=cb.getCount()%></font>--%><jsp:useBean id="cb" class="bean.CounterBean"> <%-- 相當於 CounterBean cb = new CounterBean() --%></jsp:useBean><jsp:setProperty name="cb" property="count" value="23"/> <%-- 相當於 cb.setCount(Integer.parseInt("23")) --%><jsp:getProperty name="cb" property="count"/> <%-- 相當於 out.print(cb.getCount()) --%>
id:對象執行個體名稱 scope:Bean作用的範圍,預設為page,對整個jsp頁面有效 class:Bean類名稱(全名) type:Bean執行個體類型,可以是本類,或其父類,或實現的介面,預設為本類
page:僅涵蓋使用JavaBean的頁面,相當於局部變數 PageBean.jsp/CounterBean.java) request:有效範圍僅限於使用JavaBean的請求 (RequestBean.jsp/RequestBean2.jsp/CounterBean.java) session:有效範圍在使用者整個串連過程中(整個會話階段均有效) (SessionBean.jsp/Session2.jsp/CounterBean.java) application:有效範圍涵蓋整個應用程式。也就是對整個網站均有效 (Application.jsp/Application2.jsp/CounterBean.java)
<jsp:setProperty name=“beanName”
property=“propertyName” |property=“*”
value=“property value” |param=“paramName”/>
相當於beanName.setPropertyName(value)方法調用(setXxx()方法)
<jsp:getProperty name=“beanName” property=“propertyName”/> 相當於beanName.getPropertyName()方法調用(getXxx()方法)
通過param指定表單元素的名稱,通過perperty指定對應的Bean屬性名稱,由此建立這兩個變數的關聯 (SaleEntry.jsp/SaleEntry.java,用url傳遞參數)
<jsp:setProperty name="entry" property="numItems" param="numItems" /> //相當於<jsp:setProperty name="entry" property="numItems" numItems=<%=reuest.getParameter("numItems")%> />
通過*來設定所有屬性和輸入參數之間的關聯 (SayHelloBean.html/SayHelloBean.jsp/HelloBean.java)
- 在建立Bean屬性和表單參數之間的對應關係時,伺服器會將對應的參數自動轉換成和屬性類型匹配的資料
- 初步解釋編碼問題
- <%=new String(hello.getName().getBytes("ISO8859_1"),"GBK")%>
- request.setCharacterEncoding("gb2312");
三,JSP內建對象
JSP的內建對象 out request response pageContext à用的很少 session application config 用的很少 exception Page 用的很少
Out內建對象是一個緩衝的輸出資料流,用來給用戶端返回資訊。它是javax.servlet.jsp.JspWriter的一個執行個體 典型應用:向用戶端輸出內容 常用方法: println():向用戶端輸出各種類型資料 write() newLine():輸出一個分行符號 close():關閉輸出資料流 flush():輸出緩衝區裡的資料 clearBuffer():清除緩衝區裡的資料,同時把資料輸出到用戶端 clear():清除緩衝區裡的資料,但不把資料輸出到用戶端 getBufferSize():返回緩衝區的大小
request內建對象表示的是調用JSP頁面的請求。通常,request對象是javax.servlet.http.HttpServletRequest介面的一個執行個體 典型應用:通過request.getParameter(“paramName”)可以獲得Form提交過來的參數值 可以用此對象取得請求的Header、資訊(如瀏覽器版本、語言和編碼等)、請求的方式(get/post)、請求的參數名稱、參數值、用戶端的主機名稱等 常用方法: getMethod():返回用戶端向伺服器端傳送資料的方法 getParameter(String paramName):返回用戶端向伺服器端傳送的參數值,該參數由paramName指定 getParameterNames():獲得用戶端傳送給伺服器端的所有參數的名字,結果是一個枚舉類型資料(Enumeration) getParameterValues(String name):獲得指定參數的所有值,由name指定 getRequestURI():獲得發出請求字串的用戶端地址 getRemoteAddr():擷取用戶端的IP地址 getRemoteHost():擷取用戶端機器名稱 getServerName():擷取伺服器的名字 getServletName():用戶端所請求的指令檔路徑 getServerPort():擷取伺服器端的連接埠 對應類: javax.servlet.http.HttpServletRequest
表示的是返回給用戶端的響應 是javax.servlethttp.HttpServletResponse介面的一個執行個體 經常用於設定HTTP標題,添加cookie、設定響應內容的類型和狀態、發送HTTP重新導向和編碼URL 常用方法: addCookie(Cookie cookie):添加一個Cookie對象,用於在用戶端儲存特定的資訊 addHeader(String name,String value):添加HTTP頭資訊,該Header資訊將發送到用戶端 containsHeader(String name):判斷指定名字的HTTP檔案頭是否存在 sendError(int):向用戶端發送錯誤的資訊 sendRedirect(String url):重新導向JSP檔案 和<jsp:forward>的區別 sendRedirect通過用戶端發起二次申請,不同的request對象 Jsp:forward是同一個request,在伺服器內部轉寄 setContentType(String contentType):設定MIME類型與編碼方式
Http協議的無串連性要求出現一種儲存C/S間狀態的機制 Cookie:儲存到用戶端的一個文字檔,與特定客戶相關 Cookie以“名-值”對的形式儲存資料 通過getName和getValue的方式得到相應的名字和值
- JSP—session & application
<% @page session=“true”%>(預設)--表示session功能已經在jsp頁面中啟動 session常用方法: void setAttribute(String name,Object value) Object getAttribute(String name) boolean isNew() application ServletContext四,Servlet和JSP的通訊
- 從JSP調用Servlet可用<jsp:forward>
請求資訊自動傳遞到Servlet 或者通過sendRedirect
<jsp:forward page="/servlet/ServletToJSP" />
<%
response.sendRedirect("../servlet/ShowParameters?a=b");
%>
RequestDispatcher介面的forward(req, res)方法 請求資訊需要顯式傳遞(在req、res參數中) 或者通過sendRedirect
public class ServletToJSP extends HttpServlet { public void doGet (HttpServletRequest req,HttpServletResponse resp) { try { // 設定屬性並將它提交給ServletUseJsp.jsp resp.setContentType("text/html;charset=gb2312"); req.setAttribute ("servletName", "ServletToJsp"); getServletConfig().getServletContext().getRequestDispatcher ("/servlet_jsp/ServletUseJsp.jsp").forward(req, resp);
//.forward(req, resp)把servlet的請求發送到另一個頁面
//.include(req, resp)把另一個頁面的內容包含在response中
}catch (Exception e){ e.printStackTrace (); } }}
例如: FromJspToServlet.jsp / ServletToJsp.java / ServletUseJsp.jsp forward可以用”/” 路徑, 是指web app的根路徑, servlet forward jsp的時候一定要用“/”開頭 jspsendRedirect到servlet應該用相對路徑,因為這裡”/”指網站的根路徑 ,servlet sendRedirect jsp也是
JSP學習筆記