開始編寫比較復雜的jsp啦。
全稱:javaserver pages
在傳統(tǒng)的網頁HTML文件(.htm,.html)中加入java程序片段(Scriptlet)和jsp標簽,就構成了jsp網頁。
1、因為可以嵌入java代碼,由此具備動態(tài)特性。
java程序段可以操縱數(shù)據(jù)庫、重新定向網頁以及發(fā)送E-mail等,實現(xiàn)建立動態(tài)網站所需要的功能。
2、所有程序操作都是在服務器端執(zhí)行,網絡上傳送給客戶端的僅是得到的結果,這樣大大降低了對客戶瀏覽器的要求,即使客戶瀏覽器端并不支持java也可以訪問jsp網頁。
3、在里面嵌入的標簽是<%%>
4、強大的組件(java Bean)支持功能。
比如下面就是在頁面循環(huán)輸出兩個你好。
<%
for(;i<2;) {
%>
你好</br>
<%
}
%>
jsp的一般執(zhí)行過程:接受request后,就先把jsp文件經過jsp parser轉換為java文件(即Servlet文件),然后該文件被被jsdk(Servlet分析器)編譯成class文件,然后被執(zhí)行,再response回客戶端。執(zhí)行過程都是在服務器上執(zhí)行的。

其中 查找jsp文件后還會發(fā)生以下檢查:jsp是否是修改或創(chuàng)建后的第一次調用。

jsp原始代碼包含jsp元素和模板(Template)Data兩類。
template data值得是jsp引擎不處理的部分,即<% %>以外的部分。例如代碼的HTML部分,這些數(shù)據(jù)會直接送到客戶端。
jsp元素是指<% %>部分。由jsp引擎直接處理,這部分必須符合java語法,否則會出現(xiàn)編譯錯誤。
jsp的語法:
1、編譯器指令(directive)
例如<%@page import = "java.io."%>
該指令無論在jsp的哪一個地方,它的作用范圍都是整個jsp文件。
編譯器指令包含“包含指令”,“頁指令”和“taglib指令”
他們包含在<%@ page [import] [pageEncoding]%>卷標里。
兩個主要的指令是page與include。
例:import = "java.io."
已經默認import了
java.lang.*
javax.serlet.jsp.*
javax.servlet.http.*
就是jsp中用的request、out等tomcat已經定義好了。內置了的。
taglib指令:
<%@taglib uri = "URITOTagLibrary" prefix="tagPrefix"%>
用于引入定制標簽庫。
2、腳本語法(scripting)
html注釋
(jsp)隱藏注釋<%--comments--%>
jsp表達式<%=comments%>
jsp聲明:<%!declaration,declaration%>
如:<%! int a = 3;%> 和<% int a = 3;%>這兩個是有差別的。轉換為servlet后編譯的class文件是不一樣的哦。
第一句話是把a聲明為成員變量額,而第二句話則是把定義 為_jspService方法里面的局部變量。
一般定義為腳本段,而不是聲明。。。。比較穩(wěn)。
因為Servlet是單實例的,單實例的,單實例。。。
包含:<%@include file="相對位置"%>
3、動作語法(Action)
例如<jsp:forwward>,<jsp:getProperty>,<jsp:include>
(1)<jsp: forward page={"relativeURL" | "<%=expression %>" } />
(2)<jsp:param name="paramterName" value="{parameterValue | <%= expression %> }" />
[ <jsp:param...../> ]
page屬性是指轉到某一個頁面中。
page=“value”,value可以i一個表達式或是一個字符串用于說明你將要定向的文件或者URL。這個文件可以是jsp,或者是程序段。
同時在轉時,可以發(fā)送多個參數(shù)。
[ <jsp:param...../> ]
例子:轉到forwardto.jsp,并傳去參數(shù)名為username的值為winney的參數(shù)。
<jsp:forward page="forwardto.jsp">
<jsp:param name="username" value="winney" />
</jsp:forward/>
注:轉到頁面后,原本的那個頁面剩下的代碼是不會被執(zhí)行的。因為頁面的流程都已經轉到另外一個頁面里去了。
本質原因: 在jsp被翻譯為class文件后的源碼是在轉頁面的代碼后直接加一個return語句。
(2)<jsp: include>
包含一個靜態(tài)或者動態(tài)文件
<jsp:include page="{relativeURL |<%=expression%>}" flush="true" />
<jsp:include page="{relativeURL |<%=expression%>}" flush="true" />
<jsp: param name="parameterName" value="{parameterValue} | <%= expression %/>" />
[<jsp: param.../>]指可以有多個“<jsp:param/>”標記、
param可以將參數(shù)傳到被包含的靜態(tài)或者動態(tài)文件中。
關于servlet:
Servlet的框架是由兩個java包組成的:
javax.servlet包:定義了所有的Servlet類都必須實現(xiàn)或拓展的通用接口類。
javax.servlet.http包:定義了采用HTTP協(xié)議通信的HttpServlet類。
每一個servlet都必須實現(xiàn)javax.servlet.Servlet接口,GenericServlet是個通用的,不特定于任何協(xié)議的Servlet,它實現(xiàn)了Servlet接口,而HttpServlet繼承于GenericServlet,因此HttpServlet也實現(xiàn)了servlet接口,因此我們定義的servlet只需要繼承HttpServlet父類即可。
Servlet接口中定義了service方法,HttpServlet對該方法進行實現(xiàn):
將servletRequest和ServletReaponse轉換為HttpServletRequest和HttpServletResponse。
轉換完畢后,會調用HttpServlet自己定義的service方法;
在service方法中,首先獲得請求方法名,然后根據(jù)方法名調用對應的Do方法。
在HttpServlet類中調用的doGet、doPost方法都是返回錯誤信息,所以我們自定義的servlet要override HttpServlet里面的doGet、doPost方法。

Servlet的啟動:
在下列時刻Servlet容器裝載Servlet:
--Servlet容器啟動時自動裝載某些Servlet
--在Servlet容器啟動后,客戶首次向Servlet發(fā)出請求
--Servlet的類文件被更新后,重新裝載Servlet
Servlet被裝載后,Servlet容器創(chuàng)建一個Servlet實例并且調用Servlet的init()方法進行初始化。在Servlet的整個生命周期中,init方法只會被調用一次。