JSP/Servlet(三)


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>



  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM