【聲明】
歡迎轉載,但請保留文章原始出處→_→
生命壹號:http://www.49028c.com/smyhvae/
文章來源:http://www.49028c.com/smyhvae/p/4065790.html
聯系方式:smyhvae@163.com
【系列】JSP學習系列文章:(持續更新)
JavaWeb學習(一)----JSP簡介及入門(含Tomcat的使用)
JavaWeb學習(二)----JSP腳本元素、指令元素、動作元素
JavaWeb學習(三)----JSP內置對象詳解
【正文】
呼~~~花了一下午的時間,終于把JSP的內置對象的內容學完了,并做好了筆記,方便以后回顧。
今天是10月的最后一天,小小地總結一下吧,這個月共發表博客25篇(排版好麻煩的說),所有內容均由生命壹號本人敲鍵盤碼起?;臼且惶煲黄?,包括國慶的時候也是獨霸教研室在學習,學習的大致內容也是和數據庫、JavaWeb有關。畢竟以后搞開發不可能是單機吧,網絡的部分是多么的重要。下個月要提高學習效率,學習任務要加大,爭取早日進入工程實踐,嘿嘿~~~
菜鳥加油,恩,說我自己呢!
騷年矜持,恩,在說你咧!
一、內置對象介紹
JSP內置對象:可以不用聲明和創建,就可以直接在JSP頁面腳本(Java程序片和Java表達式)中使用的成員變量。
那為什么不用生命和創建就可以直接使用呢?這是因為,內置對象必須由支持JSP的容器去創建。例如Tomcat就是一個容器。
JSP共有以下9大內置對象:
前四個是重點,后五個了解即可。這九個內置對象中,有四個作用域:request、session、application、page。作用域即這個對象的生命周期的范圍。
二、內置對象out
類型:Javax.servlet.jsp.JspWriter
作用:主要用來向客戶端輸出數據
作用域:page。也就是說,每個頁面都有一個自己的out對象。
重要方法:PRint()/println()/write() 向客戶端頁面輸出數據
舉例:
out.write("文字內容");
我們再到D:/apache-tomcat-8.0.14/work/Catalina/localhost目錄中去看一下生成的Java源代碼:
完整版代碼如下:
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/8.0.14 * Generated at: 2014-10-31 11:14:54 UTC * Note: The last modified time of this file was set to * the last modified time of the source file after * generation to assist with modification tracking. */package org.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public void _jspInit() { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } public void _jspDestroy() { } public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {final java.lang.String _jspx_method = request.getMethod();if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");return;} final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; try { response.setContentType("text/html; charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("/r/n"); out.write("<!DOCTYPE html PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/" /"http://www.w3.org/TR/html4/loose.dtd/">/r/n"); out.write("<html>/r/n"); out.write("<head>/r/n"); out.write("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/">/r/n"); out.write("<title>Insert title here</title>/r/n"); out.write("</head>/r/n"); out.write("<body>/r/n"); out.println("文字內容"); out.write("/r/n"); out.write("</body>/r/n"); out.write("</html>"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { out.clearBuffer(); } } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } }}View Code
在這里,我們可以這樣理解,一個Jsp文件編譯之后就是一個類,而out就對應一個頁面對象。
三、內置對象request
類型:Javax.servlet.http.HttpServletRequest
描述:來自客戶端的請求經Servlet容器處理后,由request對象進行封裝。注:客戶端和服務器的一次通信就是一次請求(發送請求或得到相應)。
作用域:request。說明,這次請求結束后,它的生命周期 就結束了。
重要方法:
getParameter(key) 獲取提交表單的數據getParameterValues(key) 獲取提交表單的一組數據request.getRequestDispatcher("list.jsp").forward(request,response) 轉發(通過代碼的方式進行轉發)request.setAttribute(key,object) 設置請求對象的屬性request.gettAttribute(key) 獲取請求對象的屬性request.setCharacterEncoding("UTF-8") 對請求數據重新編碼
我們接下來將每個方法都介紹一下。
(1)getParameterValues(key) 獲取提交表單的數據
舉例:輸入用戶名密碼,并驗證正確性。
新建JavaWeb工程Test04,新建request.jsp文件,代碼如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 <form action="request-receiver.jsp">11 username:<input type="text" name="user"/><br/>12 passWord:<input type="password" name="pwd"/><br/>13 14 <input type="submit" name="登陸"/> 15 </form>16 </body>17 </html>
10至15行:添加表單,在里面輸入用戶名密碼,然后將數據發送至request-receiver.jsp頁面來處理(第10行的action里面的內容)。
新建request-receiver.jsp文件:
1 <% 2 //獲取請求數據 3 String name = request.getParameter("user"); 4 String pwd = request.getParameter("pwd"); 5 System.out.println(name+","+pwd); 6 7 if("smyh".equals(name) && "007".equals(pwd)) { 8 out.println("登陸成功"); 9 }else{10 out.println("errors");11 }12 %>
像request-receiver.jsp這樣的頁面,如果不需要顯示在網頁上,可以把自動生成的html代碼全部刪除。
整個過程是這樣的:
運行程序,當我們在網頁輸入正確的用戶名之后,效果如下:
然后點擊“提交”,效果如下:
【亂碼問題的解決】
顯然我們已經登錄成功了,但是這里出現了亂碼。原因是:Tomcat默認編碼為:iso8859-1。request.jsp頁面發出去的數據是UTF-8編碼,經過tomcat服務器后,變成了iso8859-1編碼,所以需要在request-receiver.jsp將數據再轉回來,變成UTF-8編碼(這個問題涉及到另外一個內置對象,稍后再講)。
另外一個問題是,如果我們輸入的是中文的用戶名,也可能出現亂碼,可以在request-receiver.jsp文件里,加一句代碼讓用戶名、密碼在控制臺輸出顯示,看一下就知道了。
為解決亂碼的問題,我們需要在request-receiver.jsp文件中加一句話:
//設置請求方式的編碼
request.setCharacterEncoding("UTF-8");
這樣的話,就將獲取到的數據改為了UTF-8編碼。
此時,如果在控制臺輸出的用戶名還出現亂碼,是因為還涉及到了另外一個問題:在request.jsp中發送請求,默認是采用get方式,這個時候,參數就會作為url的一部分一起發給服務器(見上方圖片中的url地址),而url的編碼很顯然不是UTF-8。所以,我們需要將其改為post方式。總而言之,完整版代碼如下:
request.jsp:輸入用戶名密碼,并提交給request-receiver.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 <form action="request-receiver.jsp" method="post">11 username:<input type="text" name="user"/><br/>12 password:<input type="password" name="pwd"/><br/>13 14 <input type="submit" name="登陸"/> 15 16 </form>17 </body>18 </html>
第10行,將提交方式改為post,而非默認的get方式。
request-receiver.jsp:驗證用戶名、密碼的正確性
1 <% 2 //獲取請求數據 3 //設置請求方式的編碼 4 request.setCharacterEncoding("UTF-8"); 5 String name = request.getParameter("user"); 6 String pwd = request.getParameter("pwd"); 7 System.out.println(name+","+pwd); 8 9 if("smyh".equals(name) && "007".equals(pwd)) {10 out.println("登陸成功"); 11 }else{12 out.println("errors");13 }14 %>
第4行,將獲取到的請求數據還原為UTF-8的方式。
(2)getParameterValues(key) 獲取提交表單的一組數據
我們現在往request.jsp中添加一組單選按鈕:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 <form action="request-receiver.jsp" method="post">11 username:<input type="text" name="user"/><br/>12 password:<input type="password" name="pwd"/><br/>13 <input type="checkbox" name="likes" value="羽毛球">羽毛球14 <input type="checkbox" name="likes" value="攝影">攝影15 <input type="checkbox" name="likes" value="音樂">音樂16 <br/>17 18 <input type="submit" name="登陸"/> 19 20 </form>21 </body>22 </html>
13至15行是添加的三個單選按鈕,構成了數組“likes”。
然后在request-receiver.jsp中獲取這個數組,并在控制臺輸出:
1 <% 2 //獲取請求數據 3 //設置請求方式的編碼 4 request.setCharacterEncoding("UTF-8"); 5 String name = request.getParameter("user"); 6 String pwd = request.getParameter("pwd"); 7 System.out.println(name+","+pwd); 8 9 String[] likes = request.getParameterValues("likes");10 for(int i =0;i<likes.length;i++) {11 System.out.println(likes[i]);12 }13 14 if("smyh".equals(name) && "007".equals(pwd)) {15 out.println("登陸成功"); 16 }else{17 out.println("errors");18 }19 %>
運行后,輸入對應值:
后臺輸出如下:
(3)request.getRequestDispatcher("list.jsp").forward(request,response) 轉發(通過代碼的方式進行轉發)
(4)request.setAttribute(key,object) 設置請求對象的屬性
(5)request.gettAttribute(key) 獲取請求對象的屬性
現在的情形是,request.jsp負責發數據,request-receiver.jsp負責處理數據(判斷用戶名密碼的正確性),如果用戶名密碼正確,那我們就通過request.getRequestDispatcher(request-success.jsp),將請求轉發給request-success.jsp頁面,顯示出“登陸成功”的效果。
request.jsp代碼不變:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 <form action="request-receiver.jsp" method="post">11 username:<input type="text" name="user"/><br/>12 password:<input type="password" name="pwd"/><br/>13 14 <input type="submit" name="登陸"/> 15 16 </form>17 </body>18 </html>
request-receiver.jsp代碼如下:
1 <% 2 //獲取請求數據 3 //設置請求方式的編碼 4 request.setCharacterEncoding("UTF-8"); 5 String name = request.getParameter("user"); 6 String pwd = request.getParameter("pwd"); 7 System.out.println(name+","+pwd); 8 9 if("smyh".equals(name) && "007".equals(pwd)) {10 out.println("登陸成功"); 11 request.setAttribute("age", "22");12 request.getRequestDispatcher("request-success.jsp").forward(request, response);13 14 }else{15 out.println("errors");16 }17 %>
12行:如果用戶名密碼正確,就將這個請求轉發給"request-success.jsp"。forward(request, response)表示當前的請求對象和當前的響應對象。
11行:在轉發之前,我們可以給這個請求添加一些屬性,然后在request-success.jsp頁面中接收。
新建request-success.jsp,代碼如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 歡迎你,<%=request.getParameter("user") %> <br/>11 年齡:<%=request.getAttribute("age") %> 12 13 </body>14 </html>
10行:獲取之前的用戶名,顯示“歡迎你”,表示登陸成功。
11行:獲取獲取請求對象的屬性。
運行程序,輸入用戶名密碼后,提交,出現如下界面:(注意url)
如果在request-receiver.jsp中沒有加入第01、02行的編碼方式(即頁面的編碼方式),最終顯示的頁面將會出現亂碼:
四、內置對象resonpse
類型:Javax.servlet.http. HttpServletResponse
描述:它封閉了JSP 的響應,然后被發送到客戶端以響應客戶的請求。
作用域:page
重要方法:
response.sendRedirect("頁面"):頁面跳轉。注意,之前的forward是轉發,這里是跳轉,注意區分。response.setCharacterEncoding("gbk"):設置響應編碼
注意,response.sendRedirect("頁面")這個方法,是實現頁面跳轉,而不是轉發。
【舉例】現在需要做的是,如果登陸失敗,我們就跳到另外一個界面,而不再是轉發了。
request.jsp的代碼依然不變。
request-receiver.jsp的代碼如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 //獲取請求數據 5 //設置請求方式的編碼 6 request.setCharacterEncoding("UTF-8"); 7 String name = request.getParameter("user"); 8 String pwd = request.getParameter("pwd"); 9 System.out.println(name+","+pwd);10 11 12 if("smyh".equals(name) && "007".equals(pwd)) {13 out.println("登陸成功"); 14 request.setAttribute("age", "22歲");15 request.getRequestDispatcher("request-success.jsp").forward(request, response);16 17 }else{18 //out.println("errors");19 response.setCharacterEncoding("UTF-8"); //設置響應的編碼20 //設置響應內容的類型21 response.setContentType("text/html;charset=UTF-8");22 response.sendRedirect("response.jsp");23 }24 %>
19行至22行是添加的代碼:如果用戶名、密碼錯誤,就調到response.jsp頁面去。
新建response.jsp,代碼如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 不好意思,登陸失敗。11 </body>12 </html>
注意第06行的“content=text/html”,表示:指定服務器返回的數據類型。
運行程序,當輸入的用戶名、密碼錯誤后,效果如下:(注意url)
重定向和轉發:
重定向的意思是說,當頁面進行跳轉之后,request和response的生命周期已經結束,完全交給下一個頁面去處理了(連url都變了);而轉發的時候,還可以往request里面添加攜帶參數(url不變)。
五、session(會話)
類型:Javax.servlet.http.HttpSession
描述:表示一個會話,用來保存用戶信息,以便跟蹤每個用戶的狀態。(不要用來保存業務數據,request)
定義:是指在一段時間內客戶端和服務器之間的一連串的相關的交互過程。
作用域:session。
如果是第一次接觸“會話”這個概念,需要重復一下。說白了,客戶端與服務器之間可能需要不斷地進行數據交互(請求與相應),這個過程就可以理解為一段回話。Tomcat默認的會話時間為30分鐘,這段時間內如果沒有交互,會話結束;下次客戶端一旦發送請求,重新創建會話。當客戶端第一次發送請求的時候,才會創建一個會話。session的生命周期比request長
重要方法:
session.getid():取得session的id號.id由tomcat自動分配。session.isnew():判斷session時候是新建的session.setAttribute(key,object):往當前會話中設置一個屬性session.getAttribute(key):獲取當前會話中的一個屬性session.removeAttribute(key):刪除當前會話中的屬性session.setMaxInactiveInterval(1000*60*30):設置當前會話失效時間(ms) 。Tomcat默認的會話時間為30分鐘。session.invalidate():初始化當前會話對象(一般在推出的時候使用,可以刪除當前會話的數據)
會話結束的條件之一:
【舉例】為保持用戶登錄的狀態,我們可以把用戶的數據信息保存在session中。
request.jsp登錄表單的代碼如下:用戶登錄界面
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 <form action="session.jsp" method="post">11 username:<input type="text" name="user"/><br/>12 password:<input type="password" name="pwd"/><br/>13 14 <input type="submit" name="登陸"/> 15 </form>16 </body>17 </html>
session.jsp代碼如下:(核心代碼)
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <% 4 //獲取請求數據 5 //設置請求方式的編碼 6 request.setCharacterEncoding("UTF-8"); 7 String name = request.getParameter("user"); 8 String pwd = request.getParameter("pwd"); 9 10 if("smyh".equals(name) && "007".equals(pwd)) {11 //將用戶名、密碼保存到當前會話當中12 session.setAttribute("name", name);13 session.setAttribute("pwd", pwd);14 //如果登陸成功,就跳到session-success.jsp頁面15 response.sendRedirect("session-success.jsp"); 16 17 System.out.println(session.getId()); //獲取當前回話的id18 //session.setMaxInactiveInterval(1000*60*30); //設置當前session的有效時間19 //session.invalidate() //設置session重新初始化,在系統退出時使用20 }else{21 response.sendRedirect("fail.jsp");22 }23 %>
12、13行:將用戶名、密碼保存到當前會話當中,只要這段會話沒有結束,就可以從session中獲取值。
15行:如果用戶名密碼正確,就跳到session-success.jsp界面
18行:設置當前session的會話時間,不過一般不在代碼里設置,而是在web.index里設置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>Test04</display-name> 4 <welcome-file-list> 5 <welcome-file>index.html</welcome-file> 6 <welcome-file>index.htm</welcome-file> 7 <welcome-file>index.jsp</welcome-file> 8 <welcome-file>default.html</welcome-file> 9 <welcome-file>default.htm</welcome-file>10 <welcome-file>default.jsp</welcome-file>11 </welcome-file-list>12 13 <!-- 設置當前sessionn的有效時間(分鐘) -->14 <session-config>15 <session-timeout>30</session-timeout> 16 </session-config>17 </web-app>
14行至16行是我設置的會話時間,單位為min。
session-success.jsp代碼如下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 <%11 String name = (String)session.getAttribute("name");12 String pwd = (String)session.getAttribute("pwd"); 13 out.println("登陸成功");14 out.println(name+","+pwd);15 System.out.println(session.getId()); //獲取當前回話的id16 %>17 18 </body>19 </html>
15行:獲取當前會話的id,這個id和session.jsp中18行的id應該是同一個。
登錄失敗的界面fail.jsp的代碼我就不寫了。
運行程序,輸入用戶名密碼,提交,會跳到session-success.jsp:
因為是同一個會話,所以后臺輸出的id也是同一個:
現在我們明白了,request中可以存數據,session中也可以存數據。如果是保存用戶名信息等,可以存到session中;如果只需要傳遞數據(從這個頁面傳到另一個頁面),就可以放在request中轉發出去,避免內存浪費。
六、內置對象pageContext
類型:javax.servlet.jsp.PageContext
描述:本JSP的頁面上下文。
作用域:page
注:上下文的理解:上下文可以聯系到當前頁面所有的信息。
我們先來回顧一下原始的request.jsp代碼:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 <form action="session.jsp" method="post">11 username:<input type="text" name="user"/><br/>12 password:<input type="password" name="pwd"/><br/>13 14 <input type="submit" name="登陸"/> 15 </form>16 17 </body>18 </html>
現在將上面的代碼改成下面的這個樣子:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 <form action="<%=request.getContextPath()%>/session.jsp" method="post">11 username:<input type="text" name="user"/><br/>12 password:<input type="password" name="pwd"/><br/>13 14 <input type="submit" name="登陸"/> 15 </form>16 17 <h2>pageContext對象</h2>18 <%19 //通過PageContext上下文對象獲取當前頁面的其他內置對象20 pageContext.getRequest();21 pageContext.getResponse();22 pageContext.getSession();23 pageContext.getOut();24 String path = request.getContextPath();25 out.println("當前上下文的絕對路徑:"+path); 26 %>27 28 </body>29 </html>
20至23行:通過PageContext上下文對象獲取當前頁面的其他內置對象
24行:通過request.getContextPath()獲取當前文件的絕對路徑。此時,可以在第10行寫上session.jsp文件的絕對路徑(),以前都是用相對路徑寫的,是因為文件都在同一目錄下。如果jsp文件在其他的文件夾,通過request.getContextPath()來獲取路徑就相當方便了,避免書寫錯誤。程序運行后,效果如下:
七、內置對象application
類型:javax.servlet.ServletContext
描述:從servlet配置對象獲得的servlet上下文
作用域:application
這個對象的生命周期是最長的。服務器啟動的時候就會創建application對象。從服務器存在到服務器終止,都一直存在,且只保留一個對象,所有用戶共享一個application。不是很常用。
舉例:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 11 <h2>application對象</h2>12 <%13 //一個應用程序只有一個application對象14 //在服務器啟動時創建,到服務器關閉時銷毀15 //所有客戶端共享一份16 String serverPath = application.getContextPath();//獲取當前應用程序的路徑17 out.println(serverPath);18 //向application對象添加數據19 application.setAttribute("", "");20 21 %>22 23 </body>24 </html>
八、內置對象config
類型:javax.servlet.ServletConfig
描述:本JSP的 ServletConfig
作用域:page
注:代表配置對象,基本用不到。
九、內置對象page
類型:java.1ang.Object
描述:實現處理本頁當前請求的類的實例(javax.servlet.jsp.HttpJspPage),轉換后的Servlet類本身
作用域:page
十、內置對象exception
類型:java.lang.Exception
描述:本JSP頁面的異常對象
作用域:page
JSP常見錯誤狀態碼:
403:禁止訪問。比如IP地址被拒絕,站點訪問被拒絕等
404:找不到。沒有找到文件或目錄
500:服務器由于遇到錯誤而不能完成該請求,Web服務器太忙
舉例:
新建一個錯誤頁面error.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" isErrorPage="true"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 <h2>錯誤信息</h2>11 錯誤信息為:<%=exception%>12 </body>13 </html>
第02行:必須通過isErrorPage="true"指定此頁面為錯誤頁面,否則出現了第11行的exception,程序就會報錯。
新建另外一個頁面use-eception.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" errorPage="error.jsp" %> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body>10 <%11 int[] num = {9,2,3,2,8};12 for(int i =0;i<=num.length;i++){13 out.println(num[i]);14 }15 %>16 17 </body>18 </html>
我們故意在11至14行寫一段錯誤的代碼;
02行:命令 errorPage="error.jsp",表示指定錯誤頁面為error.jsp,如果本頁面發生錯誤,就會跳到error.jsp頁面中去。
程序運行后,效果如下:
不過,實際程序中,一般不這么寫,因為業務是寫在類里,如果發生錯誤,將采取其他的辦法來處理,那就以后再說咯~~~
新聞熱點
疑難解答