標籤:求和 webapp 運算式 方式 str ace tomcat 指定 image
1、什麼是jsp,為什麼要使用jsp。
再使用idea建立完一個web工程後,在webapp目錄下會產生一個index.jsp
直接編譯運行,網站將自動開啟這樣一個網頁:
所以我們可以推測這個index.jsp就是決定這個項目的初始頁面的HTML編碼的,這裡的hello-world是部署Tomcat時設定的。
所以其實JSP就是用來編寫HTML編碼的一種解決方案,那為什麼需要額外的這樣一套解決方案呢?
這是我之前對Servlet簡單的使用:
PrintWriter writer = resp.getWriter(); writer.append("<!DOCTYPE html>\r\n") .append("<html >\r\n") .append(" <head>\r\n") .append(" <title>hello user application</title>\r\n") .append(" </head>\r\n") .append(" <body>\r\n") .append(" Hello, ").append(user).append("!<br/><br/>\r\n") .append(" <form action=\"first\" method=\"POST\">") .append(" Enter your name:<br/>\r\n") .append(" <input type=\"text\" name=\"user\"/><br/>\r\n") .append(" <input type=\"submit\" value=\"Submit\"/>\r\n") .append(" </form>\r\n") .append(" </body>\r\n") .append("</html>\r\n");
這是在像response添加本文,用於HTML的編碼,可以發現這裡HTML和Java結合得並不好,導致代碼很長還很亂,特別是引號需要轉義符。所以其實我們應該把這一塊HTML編碼獨立出去,所以就有了這樣一套名為JSP(JavaServerPages)的混合解決方案,它結合了Java代碼和HTML標籤,JSP包括了所有的HTML標籤,以及內建的JSP標籤、自訂的JSP標籤以及運算式語言。
2、JSP在運行時的處理
- 其實JSP只是一個精心設計的Servlet,JSP只是一種文法糖,在啟動並執行時候JSP代碼將由JSP編譯器進行轉換,它將解析出JSP代碼的特性並把它們轉換成Java代碼,由JSO建立得到的Java類都將實現Servlet,最後和其他Servlet一樣對請求做出響應。
- JSP和其他Servlet一樣有自己的生命週期,不同的Web容器不一樣,比如在Tomcat中JSP將在第一次請求到達之前被即時的轉換並編譯,對於之後的請求可以之間使用編譯好的JSP。而許多其他的容器則提供了在部署應用程式時先行編譯所有的JSP選項。
3、JSP指令
JSP指令用來設定整個JSP頁面相關的屬性,如網頁的編碼方式和指令碼語言。
- <%@ page ... %>提供了對JSP如何進行轉換、渲染和傳輸到用戶端的控制
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
其中language將告訴容器JSP使用的是那種指令碼語言,contentType和charset將設定JSP頁面的MIME類型和字元編碼,
page指令相關的屬性:
buffer |
指定out對象使用緩衝區的大小 |
autoFlush |
控制out對象的 緩衝區 |
contentType |
指定當前JSP頁面的MIME類型和字元編碼 |
errorPage |
指定當JSP頁面發生異常時需要轉向的錯誤處理頁面 |
isErrorPage |
指定當前頁面是否可以作為另一個JSP頁面的錯誤處理頁面 |
extends |
指定servlet從哪一個類繼承 |
import |
匯入要使用的Java類 |
info |
定義JSP頁面的描述資訊 |
isThreadSafe |
指定對JSP頁面的訪問是否為安全執行緒 |
language |
定義JSP頁面所用的指令碼語言,預設是Java |
session |
指定JSP頁面是否使用session |
isELIgnored |
指定是否執行EL運算式 |
isScriptingEnabled |
確定指令碼元素能否被使用 |
- JSP可以通過include指令來包含其他檔案。被包含的檔案可以是JSP檔案、HTML檔案或文字檔。包含的檔案就好像是該JSP檔案的一部分,會被同時編譯執行。
<%@ include file="檔案相對 url 地址" %>
<%@ taglib uri="uri" prefix="prefixOfTag" %>
4、在JSP中使用Java
jsp中寫java代碼有如下三種方式:
<%! %>,這裡面可以申明變數或方法,注意:這裡面申明的變數是全域的
<% %>,與上面的方法相比,這個方法的局部的
<%= %>,用於輸出運算式到瀏覽器,注意:這裡面的運算式不能跟分號
JSP檔案提供了幾個可以在指令碼和運算式中可以使用的隱式變數,這些變數不需要在任何位置定義即可使用它們,JSP規範要求JSP的轉換器和編譯器提供這些變數,名字也要完全相同。從一個編譯後的JSP檔案中可以看到這樣一些程式碼片段
1 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) 2 throws java.io.IOException, javax.servlet.ServletException { 3 4 final javax.servlet.jsp.PageContext pageContext; 5 javax.servlet.http.HttpSession session; 6 final javax.servlet.ServletContext application; 7 final javax.servlet.ServletConfig config; 8 javax.servlet.jsp.JspWriter out = null; 9 final java.lang.Object page = this;10 javax.servlet.jsp.JspWriter _jspx_out = null;11 javax.servlet.jsp.PageContext _jspx_page_context = null;12 13 try {14 response.setContentType("text/html; charset=UTF-8");15 pageContext = _jspxFactory.getPageContext(this, request, response,16 null, false, 8192, true);17 _jspx_page_context = pageContext;18 application = pageContext.getServletContext();19 config = pageContext.getServletConfig();20 out = pageContext.getOut();21 _jspx_out = out;22 }
這裡總共定義了8個隱式變數,分別是:
HttpServletRequest類和HttpServletResponse類的執行個體
PageContext類的執行個體,提供對JSP頁面所有對象以及命名空間的訪問
HttpSession類的執行個體,如果在page指令中的session特性設定為假那麼JSP中就沒有這個變數
ServletContext類的執行個體,與應用上下文有關
ServletConfig類的執行個體,可以使用該對象訪問JSP Servlet的配置,例如Servlet初始化參數
JspWriter類的執行個體,用於把結果輸出至網頁上
類似於Java類中的this關鍵字,提供了請求特性和回話特性值、訪問請求和響應、包含其他檔案、轉寄請求的幾個便利方法
最後還有一個exception這裡沒有出現,這個變數需要通過page指令的isErrorPage特性設定為真,表示該JSP的目的是用於處理錯誤,才會出現這個變數。
建立一個first.jsp檔案,添加以下的代碼
<%@ page language="java" contentType="text/html; charset=UTF-8" %><%! private static final String DEFAULT_USER = "Guest";%><% String user = request.getParameter("user"); if(user == null){ user = DEFAULT_USER; }%><!DOCTYPE html><html> <head> <title>first user application</title> </head> <body> hello, <%= user %> ! <br/><br/> <form action="first.jsp" method="post"> 輸入使用者名稱:<br/> <input type="text" name="user"/><br/> <input type="submit" value="Submit"/> </form> </body></html>
編譯運行,在瀏覽器中輸入http://localhost:8080/hello-world/first.jsp就可以得到下面這個網頁
這裡就實現了之前的Servlet,不過其實並不應該在JSP中使用Java
5、注釋
在JSP中實現代碼注釋的方法有四種:
<!-- 這是被注釋的內容 -->
但是這種類型的注釋將被發送到用戶端,瀏覽器將會忽略它,但是它會出現在響應的原始碼中注釋中的任何JSP代碼都將會被處理,
<!-- 這是被注釋的內容<%!private static final String DEFAULT_USER = "Guest";%> -->
這裡的java代碼就將會被執行。
- 傳統的java行注釋以及java塊注釋,也就是//...和/*...*/
<% String user = request.getParameter("user");// if(user == null){// user = DEFAULT_USER;// }/* String pwd = req.getParameter("pwd"); String sex = req.getParameter("sex"); */%>
<%-- JSP注釋掉的內容 --%>
6、結合使用Servlet和JSP
在空的web.xml檔案(只包含<display-name>)中,添加以下內容:
<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspf</url-pattern> <page-encoding>UTF-8</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude>/WEB-INF/jsp/base.jspf</include-prelude> <trim-directive-whitespaces>true</trim-directive-whitespaces> <default-content-type>text/html</default-content-type> </jsp-property-group> </jsp-config>
標籤<jsp-config>中可以包含任意數目的</jsp-property-group>標籤,這個屬性用於區分不同JSP組的屬性。例如為/WEB-ING/JSP/admin檔案夾中所有的JSP定義一組通用的屬性,為/WEB-ING/JSP//help定義另一組屬性,那麼需要通過定義<url-pattern>標籤來區分不同的屬性群組,其中一個被設定為<url-pattern>/WEB-ING/JSP/admin/*.jsp</url-pattern>,另一個則被設定為<url-pattern>/WEB-ING/JSP/help/*.jsp</url-pattern>。
JavaWeb——JSP開發1