JSP腳本中的9個內置對象:
JSP腳本中包含了9個內置對象,這9個內置對象都是Servlet API接口的實例(可以直接使用)。
JSP內置對象的實質:他們要么是_jspService()方法的形參,要么是_jspService()方法的局部變量,所以在
JSP腳本中調用這些對象,無須創建它們。
application 對象
application是javax.servlet.ServletContext的實例。代表JSP所屬的Web應用本身,可用於JSP頁面,或者
在Servlet之間交換數據。
對於application通常有如下兩個作用:
>在整個Web應用的多個JSP、Servlet之間共享數據。
>訪問Web應用的配置參數。
1、讓多個JSP、Servlet共享數據
application 通過 setAttribute(String attrName , Object value)方法將一個值設置成application的attrName屬性
該屬性的值對整個Web應用有效,該Web應用的每個JSP頁面或Servlet都可以通過getAttribute(String attrName)來訪問
該屬性。
實例:
View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>application_setAttribute test</title>
</head>
<body>
<%!
int i ;
%>
<%
application.setAttribute("count", String.valueOf(++i)) ;
%>
<%= i %>
</body>
</html>
View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>application_getAttribute test</title>
</head>
<body>
<%=application.getAttribute("count") %>
</body>
</html>
application不僅可以用於兩個JSP頁面之間的共享數據,還可以用於JSP和Servlet之間共享數據。
注意:不要僅為了JSP、Servlet共享數據就將數據庫放入application中,通常只應該把Web應用的狀態數據放入application里。
2、獲得Web應用配置參數。
application還可以獲取Web應用的配置參數。如下代碼:
View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>application test</title>
</head>
<body>
<%
// 從配置中獲取參數
String driver = application.getInitParameter("driver") ;
String url = application.getInitParameter("url") ;
String user = application.getInitParameter("user") ;
String pass = application.getInitParameter("pass") ;
// 注冊驅動
Class.forName(driver) ;
// 連接數據庫
Connection conn = DriverManager.getConnection(url, user, pass) ;
Statement stmt = conn.createStatement() ;
ResultSet rs = stmt.executeQuery("select * from student_table ") ;
%>
<table bgcolor = "yellow" border = "1" width = "500">
<!-- 遍歷結果 -->
<%
while(rs.next())
{
%>
<tr>
<td><%=rs.getString("student_id") %></td>
<td><%=rs.getString("student_name") %></td>
<td><%=rs.getString("java_teacher") %></td>
</tr>
<%
}
%>
</table>
</body>
</html>
使用application的getInitParameter(String paramName) 來獲取Web應用的配置參數,這些參數應該在web.xml文件中。
同時web.xml文件中使用context-param元素配置,每一個<context-param.../>元素配置一個參數。該元素有如下兩個子元素。
>param-name:配置Web參數名。
>param-value:配置Web參數值。
格式如下:
<context-param>
<param-name> driver </param-name>
<param-value> com.mysql.jdbc.Driver </param-value>
</context-param>
config 對象:
config 是javax.servlet.ServletConfig的實例,該實例代表JSP的配置信息。常用的方法有:
getInitParameter(String paramName)和getInitParameternames() 等。由於JSP頁面通常無須配置,因此也就不存在配置信息。
所以在JSP頁面中較少使用,但在Servlet中則用處相對較大。
exception對象:
exception是Throwable的實例,代表JSP腳本中產生的異常和錯誤,是JSP頁面異常機制的一部分。
exception對象僅在異常處理頁面才有效,即isErrorPage為true時。
out對象:
out對象代表一個頁面的輸出流,通常用於在頁面上輸出變量值及常量。
View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>application test</title>
</head>
<body>
<%
// 從配置中獲取參數
String driver = application.getInitParameter("driver") ;
String url = application.getInitParameter("url") ;
String user = application.getInitParameter("user") ;
String pass = application.getInitParameter("pass") ;
// 注冊驅動
Class.forName(driver) ;
// 連接數據庫
Connection conn = DriverManager.getConnection(url, user, pass) ;
Statement stmt = conn.createStatement() ;
ResultSet rs = stmt.executeQuery("select * from student_table ") ;
%>
<table bgcolor = "yellow" border = "1" width = "500">
<!-- 遍歷結果 -->
<%
while(rs.next())
{
//輸出表格行
out.println("<tr>") ;
out.println("<td>") ;
out.println(rs.getString("student_id")) ;
out.println("</td>") ;
out.println("</tr>") ;
}
%>
</table>
</body>
</html>
out負責輸出頁面表格及所有內容。
注意:所有使用out的地方,都可使用輸出表達式來代替。<%=...%>的本質就是out.write(...)。
pageContext對象:
pageContext是javax.servlet.jsx.PageContext的實例,這個對象代表頁面上的上下行,
該對象主要用於訪問JSP之間的共享數據。使用pageContext()可以訪問page、request、session、application范圍的變量。
它提供了如下兩個方法來訪問變量:
>getAttribute(String name) :取得page范圍內的name屬性。
>getAttribute(String name , int scope):取得指定范圍內的name屬性,
其中scope可以是下面幾個值。
> PageContext.PAGE_SCOPE :對應與page范圍。
> PageContext.REQUEST_SCOPE :對應與request范圍。
> PageContext.SESSION_SCOPE :對應與session范圍。
> PageContext.APPLICATION_SCOPE :對應與application范圍。
與getAttribute()方法相對應,PageContext也提供了兩個setAttribute()方法。用於將指定變量放入四個范圍內。
pageContext還可用於獲取其他內置對象,pageContext對象包含如下方法
> ServletRequest getRequest() :獲取request對象。
> ServletResponse getResponse() :獲取response對象。
> ServletConfig getServletConfig() :獲取application對象。
> ServletContext getServletContext() : 獲取application對象。
> HttpSession getSession() : 獲取session對象。
request對象:
每一個request對象封裝着一次用戶的請求,並且所有的請求參數都被封裝在request對象中,因此request對象是獲取
請求參數的重要途徑。
1、獲取請求頭/請求參數
(web應用是請求/響應架構的應用,瀏覽器發送請求時通常會附帶一些請求,還可能包含一些請求參數發送給服務器,
服務器端負責解析請求頭/請求參數的就是JSP或Servlet,而JSP和Servlet取得請求參數的途徑就是request。)
request是HttpServletRequest接口的實例,它提供了如下的幾個方法來獲取請求參數。
>String getParameter(String paramName) :獲取paramName請求參數的值。
>Map getParameterMap() : 獲取所有請求參數名和參數值組成Map對象。
>Enumeration getParameterNames() :獲取所有請求參數名所組成的Enumeration對象。
>String[] getParameterValues(String name) :paramName請求參數的值,當參數有多個值的時候,該參數方法返回多個參數值。
HttpServletRequest提供了如下方法來訪問請求頭:
>String getHeader(String name):根據指定請求頭的值。
>Enumeration<STring> getHearderNames() :獲取所有請求頭的名稱。
>Enumeration<STring> getHearders(String name) :獲取請求頭的多個值。
>int getIntHeader(String name):獲取指定請求頭的值,並將該值轉化為整數值。
客戶端發送參數通常分為兩種情況:
GET方式請求:GET方式的請求會將請求參數的名和值轉換成字符串,並附加在原URL之后,且GET請求傳送的數據量比較小。
POST方式請求:通常使用提交表單的方式來發送,且需要在form元素的method屬性設置為post。POST請求傳輸的數據量總
GET傳輸的數據量大。
View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>收集參數</title>
</head>
<body>
<form id = "form_1" method = "post" action = "requestTest_1.jsp">
姓名:<br/>
<input type = "text" name = "name" ><hr/>
性別:<br/>
男:<input type = "radio" name = "gender" value = "男">
女:<input type = "radio" name = "gender" value = "女"><hr/>
年齡:<br>
<input type = "text" name = "age"><hr>
最喜歡的顏色:<br>
紅:<input type = "checkbox" name = "color" value = "紅" >
綠:<input type = "checkbox" name = "color" value = "綠" >
藍:<input type = "checkbox" name = "color" value = "藍" ><hr>
博客:<br>
<input type = "text" name = "blog"><hr>
來自的國家:<br>
<select name = "country">
<option value = "中國">中國</option>
<option value = "美國">美國</option>
</select><hr>
<input type = "submit" value = "提交">
<input type = "reset" value = "重置">
</form>
</body>
</html>
View Code
<!--requestTest_1.jsp-->
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>獲取請求參數/請求頭</title>
</head>
<body>
<%
//獲取所有請求頭的名稱:
Enumeration<String> headerNames = request.getHeaderNames() ;
while (headerNames.hasMoreElements())
{
String headerName = headerNames.nextElement() ;
//獲取每個請求、以及其對應的值
out.println(headerName + "-->" + request.getHeader(headerName)+"<br>") ;
}
out.println("<hr>") ;
//設置解碼方式
request.setCharacterEncoding("UTF-8") ;
//下面一次獲取表的單體值
String name = request.getParameter("name") ;
String gender = request.getParameter("gender") ;
String age =request.getParameter("age") ;
//如果某個參數有多個值,將使用該方法獲取多個值
String[] color = request.getParameterValues("color") ;
String blog = request.getParameter("blog") ;
String national = request.getParameter("country") ;
%>
<!-- 下面一次輸出參數值 -->
名字:<%=name %><hr>
性別:<%=gender %><hr>
年齡:<%=age %><hr>
blog:<%=blog %><hr>
喜歡的顏色:<%for (String c : color){out.println(c + " ");} %><hr>
國家:<%=national %><hr>
</body>
</html>
2、操作request范圍的屬性
HttpServletRequset還包含如下兩個方法,用於設置和獲取request范圍的屬性。
>setAttribute(String serName , Object attValue): 將attValue設置成request范圍的值。
>Object getAttribute(String attName) : 獲取request范圍的屬性。
當forward用戶請求時,請求的參數和請求屬性都不會丟失,即forward動作還是原來的請求,並沒有在此向服務器發送請求。
3、執行forward或include
request還有一個共能就是執行forward和include,也就是代替JSP所提供的forward和include動作指令。
HttpServletRequest類提供了一個getRequestDispatcher(String path)方法,其中path就是forward或者include的目標路徑。
該方法返回RequestDispatcher,該對象提供了如下的兩個方法。
>forward(ServletRequest request , ServletResponse respone) ; 執行forward 。
>include(ServletRequest request , ServletResponse respone) ; 執行include .
例子: getRequestDispatcher("/a.jsp").include(request, response) ;
注意:使用request的getRequestDispathcher(String path)方法時,path字符串必須以斜線開頭。
response對象:
response 代表服務器對客戶端的響應。大部分時候,程序無須使用respone來響應客戶端請求,
因為有個更簡單的響應對象——out,代表頁面的輸出流。
由於out無法輸出非字符串(out是JspWriter的實例,JspWriter是Writer的子類,Writer是字符流),所以當需要在JSP頁面中動態的
生成一幅位圖、或者輸出一個PDF文檔,則必須使用response作為響應輸出。
1、response響應生成非字符串響應。
img.jsp:
View Code
<%-- 通過contentType 指定響應的數據是圖片 --%>
<%@ page language="java" contentType="image/jpeg" %>
<%@ page import = "java.io.*,java.awt.*,javax.imageio.*,java.awt.image.*" %>
<%
//建立一個BufferedImage對象
BufferedImage image = new BufferedImage(340,160,BufferedImage.TYPE_INT_RGB) ;
//通過Image對象獲得一個Graphics對象
Graphics graphics = image.getGraphics();
//使用Graphics畫圖,所畫的圖像,將會出現在image對象中。
graphics.fillRect(0,0,400,400) ;
//設置成紅色
graphics.setColor(new Color(255,0,0)) ;
/*
畫弧線
public abstract void fillArc(int x,
int y,
int width,
int height,
int startAngle,
int arcAngle)
參數:
x - 要填充弧的左上角的 x 坐標。
y - 要填充弧的左上角的 y 坐標。
width - 要填充弧的寬度。
height - 要填充弧的高度。
startAngle - 開始角度。
arcAngle - 相對於開始角度而言,弧跨越的角度。
*/
graphics.fillArc(20,20,100,100,30,120) ;
//設置成綠色
graphics.setColor(new Color(0,255,0)) ;
graphics.fillArc(20,20,100,100,150,120) ;
//設置成藍色
graphics.setColor(new Color(0,0,255));
graphics.fillArc(20,20,100,100,270,120) ;
//設置成黑色
graphics.setColor(new Color(0,0,0)) ;
/*
設置字體。
public abstract void setFont(Font font)
將此圖形上下文的字體設置為指定字體。使用此圖形上下文的所有后續文本操作均使用此字體。
Font(String name, int style, int size)
根據指定名稱、樣式和磅值大小,創建一個新 Font。
*/
graphics.setFont(new Font("Arial Black" , Font.PLAIN , 16)) ;
//畫出三個字符串
graphics.drawString("red", 50,50);
graphics.drawString("green", 20,80);
graphics.drawString("blue", 80,80);
graphics.dispose() ;
//將圖象輸出到頁面的響應
ImageIO.write(image, "jpg", response.getOutputStream()) ;
%>
在標簽中使用<img src = "img.jsp"> 便可以顯示出上面代碼的圖片。實例:網頁上的圖形驗證碼功能。同時使用response生成PDF文件、Excel文件等等。
2、重定向
重定向是response的另外一個用處,與forward不同的是,重定向會丟失所有的請求數據,包括request范圍的屬性。
HttpServletRespone提供了一個sendRedirect(String path)方法,重定向到path資源,即重新向path資源發送請求。
其中,與forward的區別如下:
| 轉發(forward) | 重定向(redirect) |
| 執行forward后依然是上次請求。 |
執行redirect后是第二次請求。 |
| forward的目標頁面可以訪問原請求的請求參數,因為依然是同一次 請求,所有原請求的請求參數、request范圍的屬性全部都存在。 |
全部丟失。 |
| 地址中的URL不會改變 | 改變 |
3、增加Cookie
response對象提供了如下方法來增加Cookie。
void addCookie(Cookie cookie):增加Cookie。
增加Cookie之前,必須創建Cookie對象。增加步驟如下:
1、創建Cookie實例,Cookie的構造器為Cookie(String name , String value).
2、設置Cookie的生命期限。
3、向客戶端寫Cookie。
View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>增加Cookie</title>
</head>
<body>
<%
//獲取請求參數
String name = request.getParameter("name") ;
//以獲取的請求參數為值,創建一個Cookie對象
Cookie cookie = new Cookie("useName" , name) ;
//設置Cookie的生存期限
cookie.setMaxAge(24*3600) ;
//向客戶端增加Cookie對象
response.addCookie(cookie) ;
%>
</body>
</html>
訪問客戶端Cookie使用request對象,request對象使用了getCookie()方法,該方法將返回客戶端機器上所有Cookie組成數組,
遍歷該數組的每一個元素,找到希望可以訪問的Cookie即可。
session對象:
session是javax.servlet.http.HttpSession 的實例 , 該對象代表一次會話。當客戶端瀏覽器與站點建立連接時,會話開始;當客戶端
關閉瀏覽器時,會話結束。
session通常用於跟蹤用戶的會話信息,session范圍內的屬性可以在多個頁面的跳轉之間共存。
>setAttribute(String attName , Object attValue) :設置session 范圍內attName屬性的值為attValue 。
>getAttribute(String attName):返回session范圍內attName屬性的值。
View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>商品列表</title>
</head>
<body>
<!-- 建立一個表,列舉出商品 -->
<form method = "post" action="processBuy.jsp">
書籍:<input type = "checkbox" name = "item" value = "book" /><br>
電腦:<input type = "checkbox" name = "item" value = "compute"/><br>
<input type = "submit" value = "buy" >
</form>
</body>
</html>
View Code
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "java.util.*" %>
<%
//取出session范圍的ItemMap屬性
Map<String , Integer> itemMap = (Map<String , Integer>)session.getAttribute("itemMap");
//如果Map對象為空,則初始化Map對象
if(itemMap == null)
{
itemMap = new HashMap<String , Integer>() ;
itemMap.put("書籍", 0) ;
itemMap.put("電腦", 0) ;
}
//獲取上一個頁面的請求參數
String[] buys = request.getParameterValues("item") ;
//遍歷數組的各元素
for(String item : buys)
{
if(item.equals("book"))
{
int num = itemMap.get("書籍").intValue() ;
itemMap.put("書籍", num + 1) ;
}
else if(item.equals("compute"))
{
int num = itemMap.get("電腦").intValue() ;
itemMap.put("電腦", num + 1) ;
}
}
//將itemMap對象放到設置成session范圍的itemMap屬性
session.setAttribute("itemMap", itemMap) ;
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>購物車</title>
</head>
<body>
您購買的商品:<br>
書籍:<%=itemMap.get("書籍") %>本<br>
電腦:<%=itemMap.get("電腦") %>台<br>
<p><a href = "shop.jsp">再次購買</a></p>
</body>
</html>
