一,用jsp腳本元素調用java代碼css
1,jsp表達式的應用html
jsp表達式將值直接插入到輸出中:java
<%= Java Expression %> 表明一個值ios
隱式對象,在使用jsp表達式的時候:express
<%= request.getParameter("testParam") %>服務器
<%= session.getId() %>session
<%= application.getServerInfo() %>app
request,session,application都是隱式對象dom
XML程序設計者可使用下列的語法替代jsp表達式jsp
<jsp:expression>Java Expression</jsp:expression>
2,編寫scriptlet(有效java代碼段)
<% Java Code %>
能夠完成單獨使用表達式不能完成的任務,例如設置響應報頭和狀態,循環語句等
XML形式:
<jsp:scriptlet>Java Code</jsp:scriptlet>
1)一個示例:
<%
String bgColor = request.getParameter("bgColor");
if ((bgColor == null) || (bgColor.trim().equals(""))) {
bgColor = "WHITE";
}
%>
2)使用scriptlet將jsp頁面的某些部分條件話
//用一個隨機數將輸出條件話
//html語句和java代碼穿插混合,java語句用<% %>包含起來!!
<% if (Math.random() < 0.5) { %>
<H1>Have a <I>nice</I> day!</H1>
<% } else { %>
<H1>Have a <I>lousy</I> day!</H1>
<% } %>
能夠看出,這樣的使用方式不利於代碼的閱讀,通常只將少許java代碼與html代碼混合,不然可讀性很差。
3,使用聲明
<%! Field or Method Definition %>
jsp聲明能夠將方法或字段的定義放在servlet類定義之中,_jspService方法以外!!!
如下列一小段jsp片斷爲例,
1 <H1>Some Heading</H1>
2 //jsp聲明
3 <%!
4 private String randomHeading() {
5 return("<H2>" + Math.random() + "</H2>");
6 }
7 %>
8 <%= randomHeading() %>
這段jsp生成的servlet就可能會是下列片斷:(注意jsp轉化爲servlet後聲明的位置--servlet類定義之中,_jspService方法以外)
1 public class xxxx implements HttpJspPage {
2
3 //jsp生成servlet後聲明的位置
4 private String randomHeading() {
5 return("<H2>" + Math.random() + "</H2>");
6 }
7
8 //servlet的輸出在此方法執行
9 public void _jspService(HttpServletRequest request,
10 HttpServletResponse response)
11 throws ServletException, IOException {
12 response.setContentType("text/html");
13 HttpSession session = request.getSession();
14 JspWriter out = response.getWriter();
15 out.println("<H1>Some Heading</H1>");
16 out.println(randomHeading());//能夠在此調用上述聲明
17 ...
18 }
19 ...
20 }
XML形式:
<jsp:declaration>Field or Method Definition</jsp:declaration>
聲明的例子:
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2 <HTML>
3 <HEAD>
4 <TITLE>JSP Declarations</TITLE>
5 <LINK REL=STYLESHEET
6 HREF="JSP-Styles.css"
7 TYPE="text/css">
8 </HEAD>
9 <BODY>
10 <H1>JSP Declarations</H1>
11 <%! private int accessCount = 0; %>//聲明,沒必要聲明爲static
12 <H2>Accesses to page since server reboot:
13 <%= ++accessCount %></H2>
14 </BODY></HTML>
客戶對同一servlet的多個請求只會產生多個線程,每個線程調用單一servlet的service方法,所以上述不用聲明爲static,每次訪問共享變量
二,控制所生成的servlet的結構:jsp page指令
jsp指令影響由jsp頁面生成的servlet的總體結構。
在jsp中,主要有三種類型的指令:page,include,taglib
page指令能夠放在文檔的任何地方,魚訊咱們經過類的導入,servlet超類的定製,內容類型的設定以及諸如此類的事務來控制servlet的結構。
include指令應該放置在文檔中但願插入文件的地方
taglib定義自定義的標記標籤,將在第二冊高級技術裏面講解
這一章來看page指令:
page指定能夠定義下面這些屬性(按使用頻度高低):import, contentType,pageEncoding, session, isELIgnored (JSP 2.0 only), buffer, autoFlush,info, errorPage, isErrorPage, isThreadSafe, language, extends
1,import屬性
指定jsp頁面轉換成servlet應該輸入的包()
<%@ page import="package.class1,...,package.classN" %>
import是page的屬性中惟一能夠在同一文檔中屢次出現的屬性。
2,contentType屬性和pageEncoding屬性
contentType屬性設置content-Type響應報頭,標明發送到客戶程序的文檔的MIME類型
<%@ page contentType="MIME-Type" %>
例如:<%@ page contentType="application/vnd.ms-excel" %>
一樣的,用下列方法也能夠設置MIME類型:<% response.setContentType("application/vnd.ms-excel"); %>
二者是有區別的,前者只用到jsp語法,然後者用到明確的java代碼;另外後者可以有條件的執行,而page指令不行(response.setContentType做爲java語句能夠放在條件中,根據條件來決定設置什麼樣的mime類型)
pageEncoding屬性設置字符集;
3,session屬性
控制頁面是否參與HTTP會話:
<%@ page session="true" %> <%-- 默認狀況是參與 --%>
<%@ page session="false" %>
對於高流量網站,使用session屬性能夠節省大量的服務器內存。
4,isELIgnored屬性
是否忽略jsp2.0表達式語言(jsp2.0 引入一種間接地表達式語言,後面將介紹)
<%@ page isELIgnored="false" %>
<%@ page isELIgnored="true" %>
5,buffer和autoFlush屬性
buffer屬性指定out變量使用的緩衝區大小:
<%@ page buffer="32kb" %>
<%@ page buffer="none" %>
aotoFlush屬性控制當緩衝區充滿以後,應該自動清空緩衝區(默認)仍是在緩衝區溢出後拋出異常:
<%@ page autoFlush="true" %> <%-- Default --%>
<%@ page autoFlush="false" %>
6,info屬性
定義一個能夠再servlet中經過getServletInfo方法獲取的字符串:
<%@ page info="Some Message" %>
7,errorPage屬性和isErrorPage屬性
errorPage屬性指定一個jsp頁面,該頁面處理當前頁面拋出但未被捕獲的任何異常:
<%@ page errorPage="Relative URL" %>
指定的頁面能夠由Exception變量訪問拋出的異常
isErrorPage表示當前頁是否能夠做爲其餘jsp頁面的錯誤頁面:(默認不能夠)
<%@ page isErrorPage="true" %>
<%@ page isErrorPage="false" %> <%-- Default --%>
8,isThreadSafe屬性
通常不用,顯式同步具體的代碼段便可
9,extends屬性
指定jsp頁面生成的servlet的超類:
保留使用
10,language屬性
指定頁面使用的腳本語言
<%@ page language="java" %>
目前來講java是默認選擇也是惟一選擇
11,指令對應的XML語法
<jsp:directive.directiveType attribute="value" />
例如:<%@ page import="java.util.*" %>
的XML等價形式:
<jsp:directive.page import="java.util.*" />
三,在jsp頁面中包含文件和applet
在jsp中,主要有3種功能能夠將外部內容包含到jsp文檔:
jsp:include 動做:在請求期間將其餘頁面的輸出包含進來,它包含次級頁面的輸出,而非次級頁面的實際代碼。
include指令。 在主頁面轉換成servlet以前,將jsp代碼插入其中。
jsp:plugin動做。將java插件的applet插入到jsp頁面中。
1,在請求期間包含頁面:jsp:include動做
1)假定你有一系列的頁面,每個擁有相同的導航欄,聯繫信息或者腳註,一般的解決防範是使用某種服務器端包含機制,在頁面請求時將公共塊插入到其中。
用page屬性來指定jsp:include動做包含的頁面的路徑:
<jsp:include page="bios/cheng-yinghua.jsp" />
jsp:include動做只有上述的XML語法形式,沒有對應的jsp語法
2)flush屬性
jsp:include動做還有一個次級屬性,指定在將頁面包含進來以前是否清空主頁面的輸出流(默認是false)
<jsp:include page="relative-path-to-resource" flush="true" />
3)jsp:include動做的例子
例如以前作過的招辦系統左側導航目錄,在每一個頁面中都會出現,能夠寫一個次級頁面
4)jsp:param元素:增長請求參數
被包含的頁面與最初請求的頁面使用相同的請求對象,若是你想看到的請求參數與主頁不一樣,增長或者替換原來主頁中的參數,能夠在 jsp:include動做中使用這個元素:
<jsp:include page="/fragments/StandardHeading.jsp">
//在次級頁面中添加新的元素或者替換主頁的元素
<jsp:param name="bgColor" value="YELLOW" />
</jsp:include>
這樣,若是原頁面沒有背景顏色,你能夠在次級頁面裏面添加,就跟主頁面獲得不同的結果了
2,在頁面跳轉期間包含文件:include指令
<%@ include file="Relative URL" %>
XML形式:
<jsp:directive.include file="..." />
區別部分截圖:
include指令帶來的維護問題---它會影響主頁面,它容許包含的文件中含有影響主頁面的jsp代碼
一個應用,在下列例子中,咱們會用include指令來代替include動做:
假定有這樣一個jsp頁面,它含有訪問計數和對當前頁面最近訪問的相關信息。再次,有好幾個主頁面都要使用這種類型的腳註,咱們但願每一個使用這個腳 注頁面的主頁面都維護各自獨立的訪問計數,咱們不但願腳註的jsp成爲一個單獨的servlet,而但願它成爲主頁面的產生的servlet的一部分,因 此須要include指令。
1 //腳註jsp
2 <%@ page import="java.util.Date" %>
3 <%-- The following become fields in each servlet that
4 results from a JSP page that includes this file. --%>
5 <%!
6 private int accessCount = 0;
7 private Date accessDate = new Date();
8 private String accessHost = "<I>No previous access</I>";
9 %>
10 <P>
11 <HR>
12 This page © 2003
13 <A HREF="http//www.my-company.com/">my-company.com</A>.
14 This page has been accessed <%= ++accessCount %>
15 times since server reboot. It was most recently accessed from
16 <%= accessHost %> at <%= accessDate %>.
17 <% accessHost = request.getRemoteHost(); %>
18 <% accessDate = new Date(); %>
主頁面:
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2 <HTML>
3 <HEAD>
4 <TITLE>Some Random Page</TITLE>
5 <META NAME="author" CONTENT="J. Random Hacker">
6 <META NAME="keywords"
7 CONTENT="foo,bar,baz,quux">
8 <META NAME="description"
9 CONTENT="Some random Web page.">
10 <LINK REL=STYLESHEET
11 HREF="JSP-Styles.css"
12 TYPE="text/css">
13 </HEAD>
14 <BODY>
15 <TABLE BORDER=5 ALIGN="CENTER">
16 <TR><TH CLASS="TITLE">
17 Some Random Page</TABLE>
18 <P>
19 Information about our products and services.
20 <P>
21 Blah, blah, blah.
22 <P>
23 Yadda, yadda, yadda.
24 <%@ include file="/WEB-INF/ContactSection.jsp" %>//include指令
25 </BODY></HTML>
下面的腳註是主頁面servlet的一部分,被獨立維護,(若是有另外一個主頁面也引用這個腳註的話,互不影響)3,包含使用java插件的applet