Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

3.6. JSP

3.6.1. 註釋

JSP頁面中的註釋有以下幾種樣式的註釋方法:

		
JSP頁面中的HTML註釋 
     <!-- 註釋內容 -->  

JSP頁面中的普通註釋,不會再瀏覽器中輸出
     
    <% // 註釋內容 %>    
    <% /* 註釋內容 */ %> 

JSP頁面中的隱藏註釋,不會再瀏覽器中輸出 
<%-- 註釋內容 --%>
		
		

3.6.2. pageContext

3.6.2.1. queryString

輸出?問號後面的變數

			
${pageContext.request.queryString}
<c:out value = "${pageContext.request.queryString}" />		
			
			

3.6.3. request

new URL(
	request.getScheme(), 
    request.getServerName(), 
    request.getServerPort(), 
    request.getContextPath()
    );		
		

獲取主機名

		
<%=request.getServerName() %>
		
		

3.6.3.1. Form

			
<%
   Enumeration paramNames = request.getParameterNames();

   while(paramNames.hasMoreElements()) {
      String paramName = (String)paramNames.nextElement();
      String paramValue = request.getParameter(paramName);
      out.println(paramName + ": " + paramValue + "<br/>\n");
   }
%>			
			
			
			
<%= request.getParameter("first_name")%>

<c:set var="UA" value="${param.first_name}" />
<c:out value="${param.first_name}"/>
			
			

3.6.4. 

3.6.4.1. sendRedirect

頁面跳轉

response.sendRedirect("/content/test.jsp");			
			

3.6.5. cookie

獲取 cookie 值

		
<html>
<head>
<title>Reading Cookies</title>
</head>
<body>
<center>
<h1>Reading Cookies</h1>
</center>
<%
   Cookie cookie = null;
   Cookie[] cookies = null;
   // Get an array of Cookies associated with this domain
   cookies = request.getCookies();
   if( cookies != null ){
      out.println("<h2> Found Cookies Name and Value</h2>");
      for (int i = 0; i < cookies.length; i++){
         cookie = cookies[i];
         out.print("Name : " + cookie.getName( ) + ",  ");
         out.print("Value: " + cookie.getValue( )+" <br/>");
      }
  }else{
      out.println("<h2>No cookies founds</h2>");
  }
%>
</body>
</html>
 		
		

3.6.6. session

獲取 Session 值

		
<% out.print(session.getAttribute("random")); %>
 		
		

3.6.7. page

		
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>		
		
		

3.6.7.1. Session

禁用Session

			
<% @page session="false" %>
			
			

啟用Session

			
<%@ page session="true" %>
			
			

3.6.8. trimDirectiveWhitespaces

刪除JSP編譯產生的空行

		
<%@ page trimDirectiveWhitespaces="true" %> 
				
		

3.6.9. include

		
<%@ include file="analytics.jsp" %>
		
		
		
<jsp:include page="telephone.jsp" />
<jsp:include page="address.jsp" flush="true"/> 
<jsp:include page="${request.getContentType()}/module/html.body.begin.html" flush="true" />

		
		

file 與 page 的區別是,file 將檔案包含進當前檔案,然後變成成servlet。 page 是運行的時候才會包含檔案輸出結果包含進當前檔案。

		
<pre>

<%@include file="inc.html" %>
=============
<%@include file="/inc.html" %>
=============
<jsp:include page="inc.html" />
=============
<jsp:include page="inc.html" flush="true" />
==============
<jsp:include page="/inc.html" flush="true" />
==============
<jsp:include page="${request.getContentType()}/inc.html" flush="true" />

</pre>
		
		

注意上麵包含結果相同,使用上略有差異。

3.6.10. jsp

3.6.10.1. jsp:forward

jsp:forward 只能跳轉到存在的物理頁面

			
<jsp:forward page="/test.jsp" />
			
			

3.6.11. error-page

在 web.xml 中配置 error-page

		
<error-page>
	<error-code>400</error-code>
	<location>/error.jsp</location>
</error-page>

<error-page>
	<error-code>404</error-code>
	<location>/error.jsp</location>
</error-page>

<error-page>
	<error-code>500</error-code>
	<location>/error.jsp</location>
</error-page>
<!-- java.lang.Exception異常錯誤,依據這個標記可定義多個類似錯誤提示 -->
<error-page>
	<exception-type>java.lang.Exception</exception-type>
	<location>/error.jsp</location>
</error-page>
<!-- java.lang.NullPointerException異常錯誤,依據這個標記可定義多個類似錯誤提示 -->
<error-page>
	<exception-type>java.lang.NullPointerException </exception-type>
	<location>/error.jsp</location>
</error-page>

<error-page>
	<exception-type>javax.servlet.ServletException</exception-type>
	<location>/error.jsp</location>
</error-page>
		
		

3.6.12. JSP 編程

3.6.12.1. 隨機數

			
<%= (int) (Math.random() * 1000) %>			
			
			

3.6.13. FAQ

3.6.13.1. http://www.netkiller.cn/test.html;jsessionid=7D25CE666FF437F2094AA945E97CEB37

URL經常會出現 jsessionid,這是因為當你使用c:url的時候,它會判斷當前域下是否已經創建jsessionid的cookie變數,如果沒有並且你連結的是靜態頁面,那麼c:url將傳遞jsessionid變數,迫使Tomcat為當前域創建jsessionid cookie。

當你使用 Apache Nginx 作為Tomcat前端是,由於Apache Nginx不識別;jsessionid=7D25CE666FF437F2094AA945E97CEB37這種URL,會跳出404頁面。

解決方案一,放棄使用c:url,如果你需要保持context 的 path 設置,可以使用下面方法

			
<a href="${pageContext.request.contextPath}/test.html">Netkiller Test</a>
						
			

方案二,使用rewrite截取jsessionid做忽略處理

Apache:

ReWriteRule ^/(\w+);jsessionid=\w+$ /$1 [L,R=301]
ReWriteRule ^/(\w+\.do);jsessionid=\w+$ /$1 [L,R=301]
			

Nginx:

rewrite ^(.*)\;jsessionid=(.*)$ $1 break;