JSP有九個內建對象:
- Request ——請求對象
- Response—— 響應對象
- PageContext ——頁面內容物件
- Session ——會話對象
- Application ——應用程式物件
- Out ——輸出對象
- Config ——設定物件
- Page ——頁面對象
- Exception ——異常對象
out內建對象有println方法,它是對產生的html原始碼換行,而不是瀏覽器顯示中的換行,瀏覽器頁面中的換行用<br>標籤
重點內建對象:request,session,application
1、request和response
“request”對象代表的是來自用戶端的請求,例如在form表單中填寫的資訊等,是最常使用的對象。它的方法使用較多的是getParameter、getParameterNames和getParameterValues,通過調用這幾個方法來擷取請求對象中所包含的參數的值。
“response”對象代表的是對用戶端的響應,也就是說可以通過“response”對象來組織發送到用戶端的資料。但是由於組織方式比較的底層,所以不建議普通讀者使用,需要向用戶端發送文字時直接使用“out”對象即可。
對於request,它的getParameter方法是getParameterValues方法的特例,表示請求的參數值只有一個,如果請求參數值有多個,請使用getParameterValues方法。在多選框的情況下,需要使用getParameterValues方法來擷取使用者所選擇的多個複選框的值。
對於如下的頁面:
<body> <form action="result.jsp" method="post"> username:<input type="text" name="username"><br> password:<input type="password" name="password"><br> age:<input type="text" name="age"> age1:<input type="text" name="age"> <input type="submit" value=" submit" > <input type="reset" value="reset" > </form> </body>
result.jsp中:
<body> <% String username = request.getParameter("username"); String password = request.getParameter("password"); out.println("username:" + username +"<br>"); out.println("password:" + password + "<br>"); String[] values = request.getParameterValues("age"); for(String value : values) { System.out.println(value); } String value1 = request.getParameter("age"); System.out.println(value1); %> </body>
values是一個字串數組,列印出age和age1的內容,value1隻列印出匹配的第一個值。
“response”對象代表的是對用戶端的響應,也就是說可以通過“response”對象來組織發送到用戶端的資料。但是由於組織的方式比較底層,所以不建議普通讀者使用,需要向用戶端發送文字時直接使用“out”對象即可。“response”一般是用在檔案下載。
2、session對象:“session”對象代表格服務器與用戶端所建立的會話,當需要在不同的JSP頁面中保留客戶資訊的情況下使用,比如線上購物、客戶軌跡跟蹤等。
- HTTP是無狀態(stateless)協議;、Web Server對每個用戶端請求都沒有曆史記憶;session用來儲存用戶端狀態資訊
三個jsp頁面示範session值的傳遞:
session1.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html> <head> <title>My JSP 'session1.jsp' starting page</title> </head> <body> <form action="session2.jsp"> 姓名:<input type="text" name="username"> <input type="submit" value="submit"> </form> </body></html>session2.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html> <head> <title>My JSP 'session2.jsp' starting page</title> </head> <body> <% String name = request.getParameter("username"); session.setAttribute("logName",name); %> 你的名字:<%= name %>已經寫入session<a href="session3.jsp">check</a> </body></html>session3.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html> <head> <title>My JSP 'session3.jsp' starting page</title> </head> <body> <% String yourName =(String) session.getAttribute("logName"); if(yourName == null) { %> 你還沒有登入 <% } else { %> "<%= yourName %>"已經登入 <% } %> </body></html>
3、application對象——負責提供應用程式在伺服器中運行時的一些全域資訊,常用的方法有getMimeType和getRealPath等
4、out:“out”對象代表了向用戶端發送資料的對象,與“response”對象不同,通過“out”對象發送的內容將是瀏覽器需要顯示的內容,是文本一級的,可以通過“out”對象直接向用戶端寫一個由程式動態產生HTML檔案。常用的方法除了print和println之外,還包括clear、clearBuffer、flush、getBufferSize和getRemaining,這是因為“out”對象內部包含了一個緩衝區,所以需要一些對緩衝區進行操作的方法。
5、config對象——提供一些配置資訊,常用的方法有getInitParameter和getInitParameterNames,以擷取Servlet初始化時的參數。
page對象——代表了正在啟動並執行由JSP檔案產生的類對象,不建議一般讀者使用。
exception對象——代表了JSP檔案運行時所產生的異常對象,此對象不能在一般JSP檔案中直接使用,而只能在使用了“<%@ page isErrorPage="true" %>”的JSP檔案中使用。
6、request、session、application比較
1)request請求對象:getAttribute,以對象形式返回特性名稱的屬性值。如果所給名稱的屬性不存在將返回空;setAttribute,設定
request1.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html> <head> <title>My JSP 'request1.jsp' starting page</title> </head> <body> <form action="request2.jsp"> username:<input type="text" name="username"> <input type="submit" value="submit"> </form> </body></html>request2.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html> <head> <title>My JSP 'request2.jsp' starting page</title> </head> <body> <% String username = request.getParameter("username"); %> username:<%= username %> <% request.setAttribute("username",username); %> <%-- <jsp:forward page="request3.jsp"></jsp:forward> --%> <a href="request3.jsp">request3.jsp</a> </body></html>request3.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html> <head> <title>My JSP 'request3.jsp' starting page</title> </head> <body> <% String username =(String) request.getAttribute("username"); %> <%= username %> </body></html>
對於request2.jsp,如果使用<a href="request3.jsp">則點選連結時,request3.jsp顯示null,如果request2.jsp使用<jsp:forward page="request3.jsp>這是請求轉寄,request3.jsp將顯示request1.jsp中輸入的名字。主要是看是不是在一次請求當中。
request的getParameter是用戶端的請求資訊,getAttribute則是伺服器端以前通過setAttribute設定的資訊,完全是伺服器端的事情。
getAttribute與setAttribute方法一般都是成對出現的,首先通過setAttribute方法設定屬性與屬性值,然後通過getAttribute方法根據屬性擷取到與該屬性對應的對象值(擷取後一般需要進行向下類型轉換,將屬性值轉換為真正地對象)。setAttribute與getAttribute方法都是在伺服器端內部執行的,用戶端不知道伺服器端是否執行過這兩個方法;
request的getParameter方法的作用是擷取到用戶端通過表單或url請求參數所發送過來的參數值,是用戶端與伺服器端之間的互動,伺服器端想要擷取到用戶端發送過來的資料,就需要使用getParameter方法擷取。沒有與getPArameter方法對應的setParameter方法。
request對象內資料的存活範圍就是在request對象的存活範圍內,當用戶端向伺服器端發送一個請求,伺服器端向用戶端返回一個響應,該請求對象就被銷毀了;之後在向伺服器端發送新的請求時,伺服器會建立新的request對象,該request對象與之前的request對象沒有任何關係,因此也無法獲得在之前的request對象中所存在的任何資料。
2)session對象也有getAttribute和setAttribute方法,session對象內資料的存活範圍就是session對話的存活範圍(只要瀏覽器不關閉,session對象就會一直存在),因此在同一個瀏覽器視窗中,無論向伺服器端發送多少請求,session對象只有一個
3)application對象也有getAttribute和setAttribute方法,application 應用對象:存活範圍最大的對象,只要伺服器沒有關閉,application對象中的資料就會一直存在,在整個伺服器運行過程中,application對象只有一個。
4)request、session以及application這3個對象的範圍是逐個增加的:request只在一個請求的範圍內;session是在瀏覽器視窗的範圍內;application則是在整個伺服器的運行過程中。
利用application編寫網頁計數器:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html> <head> <title>My JSP 'application.jsp' starting page</title> </head> <body> <% if(application.getAttribute("counter") == null) application.setAttribute("counter","1"); else { String strnum = null; strnum = application.getAttribute("counter").toString(); int icount = 0; icount = Integer.valueOf(strnum).intValue(); icount++; application.setAttribute("counter",Integer.toString(icount)); } %> 你是第<%= application.getAttribute("counter") %>位訪問者。 </body></html>
7、關於<jsp:formard>轉換為servlet,是使用了PageContext.forward方法來進行請求轉寄的
使用servlet來完成jsp:forward功能:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'myforward.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--> </head> <body> <form action="MyForwardServlet"> username<input type="text" name="username"> <input type="submit" value="submit"> </form> </body></html>
servlet
import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyForwardServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{String username = req.getParameter("username");req.setAttribute("username", username);RequestDispatcher rd = req.getRequestDispatcher("myResult.jsp");rd.forward(req, resp);}}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'myResult.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--> </head> <body> username:<%= request.getAttribute("username") %> </body></html>
servlet中使用setAttribute主要是設定通過用戶端傳來的參數然後查詢資料庫等獲得的資料,然後在傳遞到下一個頁面進行展示:
import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyForwardServlet extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{String username = req.getParameter("username");req.setAttribute("username", username);List<String> list = new ArrayList<String>();for(int i = 0;i < 100;i++){list.add(String.valueOf(i));}req.setAttribute("list", list);RequestDispatcher rd = req.getRequestDispatcher("myResult.jsp");rd.forward(req, resp);}}
8、application的一些方法(application是ServletContext的對象):getMajorVersion、getMinorVersion、getResource、getRealPath——用的比較多,返回資源的絕對路徑
9、關於<input type="hidden" >在進行不同網頁之間傳遞資訊時,通常使用hidden標籤,而不是使用session來儲存,因為session比較消耗記憶體。