標籤:求和   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