表現形式 | 所需技術 | |
靜態網頁 | 網頁內容固定,不會更新 | html,CSS |
動態網頁 | 網頁內容由程序動態顯示,自動更新 | html,css,DB,java/c#/php,javascript,xml,主流的動態網頁腳本(jsp,asp.net,php) |
jdk1.7+tomcat7.0+MyEclipse10。關于MyEclipse的安裝和配置請參見http://blog.sina.com.cn/s/blog_907043b301016jtp.html。Tomcat服務器是Apache Jakarta的開源項目,是Jsp/Servlet容器。安裝Tomcat只需要解壓zip包到指定目錄即可。新建一個環境變量CATALINA_HOME,變量的值是Tomcat的根目錄D:/PRogram Files (x86)/apache-tomcat-7.0.57。全部的環境變量如下:
變量名 | 變量值 |
JAVA_HOME | D:/Program Files (x86)/Java/jdk1.7.0_40 |
Path | C:/Program Files/Microsoft SQL Server/100/DTS/Binn/;%JAVA_HOME%/bin;D:/Program Files/Sublime Text 3;D:/Program Files/MySQL/MySQL Utilities 1.3.6/ |
classpath | .;%JAVA_HOME%/lib/rt.jar;%JAVA_HOME%/lib/tools.jar; |
CATALINA_HOME | D:/Program Files (x86)/apache-tomcat-7.0.57 |
之后我們測試一下Tomcat的首頁:
進入Tomcat服務器根目錄下面的bin目錄,以管理員方式運行startup.bat,如果運行結果如下就表示Tomcat服務器啟動成功。
注意:不要關閉這個窗口(關閉窗口就意味著關閉了Tomcat服務器,將其最小化)。
在瀏覽器地址欄輸入http://localhost:8080/回車得到如下頁面:
在項目文件夾中創建一個index.jsp:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>手工編寫的第一個java web項目</title> 6 </head> 7 <body> 8 <h1>這是手工編寫的第一個java web項目——jsp</h1> 9 <hr />10 </body>11 </html>
在項目目錄中創建一個WEB-INF目錄拷貝/webapps/examples/WEB-INFO/web.xm到自己項目的/myJspProject/WEB-INFO中,在/myJspProject/WEB-INFO中創建兩個文件夾:classes和lib。最后的項目目錄應該是這樣:
測試:瀏覽器輸入:http://localhost:8080/myJspProject/index.jsp回車,運行結果如下:
解決方法:更改瀏覽器編碼為指定編碼:
該目錄是java web應用的安全目錄。所謂安全目錄就是客戶端無法訪問只有服務端可以訪問的目錄。其中web.xml是項目部署文件,classes目錄:存放*.class文件,lib目錄存放需要的jar包。例如:我們在WEB-INF中創建一個test.html,下面我們通過瀏覽器訪問:
web.xml配置文件可以配置歡迎頁面默認的歡迎頁面是項目下面的index.jsp,加入我們需要將項目下的haha.jsp,在/WEB-INF/web.xml的web-app標記中添加以下代碼:
1 <welcome-file-list>2 <welcome-file>/haha.jsp</welcome-file>3</welcome-file-list>
運行結果:
注意:如果要使用Eclipse編寫java web應用應該使用Eclipse的J2EE版本。并在Eclipse中配置Tomcat服務器Window-Preference-Server-Runtime Environment-Add,然后在WebContent目錄下新建jsp文件,按下Ctrl+F11(或者在項目中右鍵-Run On Server)就可以使用內置瀏覽器訪問建立的網站。
1.7用MyEclipse編寫第一個web應用程序在新建項目之前首先在MyEclipse中配置jre和tomcat。步驟Window-Preference-Java-Install JREs-Add;Window-MyEclipse-Servers-Tomcat(注意設置tomcat的jre并將服務器設置為Enabled)。
接下來在MyEclipse中啟動Tomcat服務器:
測試首頁http://localhost:8080/證明Tomcat正常啟動,我們就可以在MyEclipse中啟動和發布Web應用程序了。
New一個WebProject會生成以下的目錄結構(默認在WebRoot目錄下有一個index.jsp)。
發布該WebApp。
該虛擬路徑是可以修改的項目上右鍵屬性-MyEclipse-Web?!?/p>
重新部署,瀏覽器需要使用使用http://localhost:8080/hello/index.jsp訪問了。
1.7修改Tomcat默認端口修改conf目錄下的server.xml的以下標記:
<Connector connectionTimeout="20000" port="8888" protocol="HTTP/1.1" redirectPort="8443"/>2.jsp語法基礎 2.1jsp簡介
jsp的全名是Java Server Page,是一個簡化的Servlet設計,它實現了在java當中使用html標記。jsp是一種動態網頁技術,符合J2EE標準。jsp和Servlet一樣也是在服務器端執行的。
2.2常見動態網站開發技術對比平臺 | 特點 |
jsp | 跨平臺,安全性高,適合開發大型的、企業級的Web應用、分布式應用(Hadoop)。例如:12306、10086.cn、網上銀行 |
asp.net | 簡單易學,安全性和跨平臺性差 |
php | 簡單、高效、成本低、開發周期短,適合中小型企業的Web應用開發(LAMP) |
page指令語法:
<%@ page 屬性1="屬性值" 屬性2="屬性值1,屬性值2" 屬性n="屬性值n"%>
屬性 | 描述 | 默認值 |
language | jsp頁面所使用的腳本語言 | java |
import | 引用腳本語言中所要使用的類文件 | 無 |
contentType | 指定jsp頁面的編碼 | text/html,ISO-8859-1 |
新建一個java web工程默認的jsp頁面開頭有一個page指令:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
默認的編碼是ISO-8859-1,不支持中文,這里建議使用另一個屬性contentType。將第一行改為如下:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
這樣就支持中文了。
page指令的全部屬性如下:
1 <%@page 2 [language="Java"] 3 [extends="package.class"] // 指定JSP頁面編譯所產生的Java類所繼承的父類,或所實現的接口。 4 [import="package.class│package.*,…"] 5 [session="true│false"] 6 [buffer="none│8kb│size kb"] 7 [autoFlush="true│false"] 8 [isThreadSafe="true│false"] 9 [info="text"]10 [errorPage="relativeURL"] // 指定錯誤處理頁面。因為JSP內建了異常機制支持,所以JSP可以不處理異常。11 [contentType="mimeType[;charset=characterSet]"│"text/html;charSet=ISO8859-1"]12 [isErrorPage="true│false"] // 設置本JSP頁面是否為錯誤處理程序。13 %>
注意:除page指令中的import屬性之外,其他屬性均只能設置一次。
2.4jsp注釋分為3種:html注釋,jsp注釋,jsp腳本注釋。語法:
1 <!-- html注釋 -->2 <%-- jsp注釋 --%>3 <%4 /*這里是jsp腳本注釋 有兩種*/5 6 //單行注釋7 8 /*多行注釋*/9 %>
例如:
1 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head>10 <base href="<%=basePath%>">11 12 <title>My JSP 'index.jsp' starting page</title>13 <meta http-equiv="pragma" content="no-cache">14 <meta http-equiv="cache-control" content="no-cache">15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keyWords" content="keyword1,keyword2,keyword3">17 <meta http-equiv="description" content="This is my page">18 <!--19 <link rel="stylesheet" type="text/css" href="styles.css">20 -->21 </head>22 23 <body>24 <h1>歡迎你</h1>25 <!-- 這是html注釋,客戶端可可見 -->26 <%-- 這是jsp注釋,客戶端不可見 --%>27 <%28 /*這里是jsp腳本注釋29 有兩種*/30 //單行注釋31 /*多行注釋*/32 %>33 </body>34 </html>
將項目部署到Tomcat,客戶端用瀏覽器查看源代碼:
在jsp頁面中執行的java代碼。語法:
<% java代碼 %>
1 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head>10 <base href="<%=basePath%>">11 12 <title>My JSP 'index.jsp' starting page</title>13 <meta http-equiv="pragma" content="no-cache">14 <meta http-equiv="cache-control" content="no-cache">15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">17 <meta http-equiv="description" content="This is my page">18 <!--19 <link rel="stylesheet" type="text/css" href="styles.css">20 -->21 </head>22 23 <body>24 <h1>歡迎你</h1>25 <hr>26 <%27 out.println("通過jsp內置對象out對象打印輸出");28 %>29 </body>30 </html>
jsp頁面中定義變量或者方法。語法:
<%! java代碼 %>
例如:
1 <%!2 String s = "張三"; //聲明一個String類型的變量3 int add(int x,int y){ //聲明一個返回值為int類型的方法4 return x+y;5 }6 %>2.7jsp表達式
jsp頁面中執行的表達式。語法(注意=緊挨著百分號,表達式末尾沒有分號):
<%=表達式 %>
1 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head>10 <base href="<%=basePath%>">11 12 <title>My JSP 'index.jsp' starting page</title>13 <meta http-equiv="pragma" content="no-cache">14 <meta http-equiv="cache-control" content="no-cache">15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">17 <meta http-equiv="description" content="This is my page">18 <!--19 <link rel="stylesheet" type="text/css" href="styles.css">20 -->21 </head>22 23 <body>24 <h1>歡迎你</h1>25 <hr>26 <!-- 這是html注釋,客戶端可可見 -->27 <%!28 String s = "張三"; //聲明一個String類型的變量29 int add(int x,int y){ //聲明一個返回值為int類型的方法30 return x+y;31 }32 %>33 你好:<%=s %><br>34 令x=10,y=5,則x+y = <%=add(10, 5) %>35 </body>36 </html>
運行結果:
jspService()方法被調用來處理客戶端的請求。對每一個請求,JSP引擎創建一個新的線程來處理該請求。如果有多個客戶端同時請求你該jsp文件,則jsp引擎會創建多個線程(每一個客戶端請求對應一個線程)。以多線程的方式執行可以大大降低對系統的資源需求,提高系統的并發量以及縮短服務器的響應時間——但是同時要注意多線程的同步問題。由于該Servlet常駐內存,所以響應是非??斓摹?/p>
當頁面沒有被訪問的時候work目錄下沒有相關的Servlet。如果頁面被訪問之后就會在work目錄的對應目錄生成響應的Servlet。如圖:
打開index_jsp.java會看到以下的初始化方法:
然后該Servlet常駐內存,創建線程處理每一個客戶端的請求。由每一個線程調用_jspService()方法來處理請求。
如果jsp頁面內容發生了改變,jsp引擎就需要重新編譯jsp頁面。我們修改index.jsp,用瀏覽器重新訪問,則:
1 <%@page import="java.io.IOException"%> 2 <%@ page language="java" import="java.util.*" 3 contentType="text/html; charset=utf-8"%> 4 <% 5 String path = request.getContextPath(); 6 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 7 %> 8 9 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">10 <html>11 <head>12 <base href="<%=basePath%>">13 14 <title>My JSP 'multiplicationTable.jsp' starting page</title>15 16 <meta http-equiv="pragma" content="no-cache">17 <meta http-equiv="cache-control" content="no-cache">18 <meta http-equiv="expires" content="0">19 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">20 <meta http-equiv="description" content="This is my page">21 22 23 </head>24 25 <body>26 <h1>九九乘法表</h1>27 <h2>表達式的方式打印乘法表</h2>28 <%!29 //聲明表達式30 String printMultiTable(){31 StringBuilder s = new StringBuilder();32 for(int i=1;i<=9;i++){33 for(int j=1;j<=i;j++){34 s.append(i+" * "+j+" = "+i*j+"/t");35 }36 s.append("<br />");//追加換行標記,注意不能使用/n37 }38 return s.toString();39 }40 %>41 <%=printMultiTable() //調用表達式42 %>43 44 <h2>使用腳本的方式打印九九乘法表</h2>45 <%!46 //jsp小腳本47 void printMultiTable2(JspWriter out) throws IOException{48 StringBuilder s = new StringBuilder();49 for(int i=1;i<=9;i++){50 for(int j =1;j<=i;j++){51 s.append(i+" * "+j+" = "+i*j+"/t");52 }53 s.append("<br />");54 }55 out.println(s.toString());56 }57 %>58 59 <%60 //調用腳本61 printMultiTable2(out);62 %>63 </body>64 </html>
運行結果:
JSP內置對象是Web容器創建的一組對象,不需要使用new關鍵字,JSP規范將它們完成了默認初始化(由JSP頁面對應Servlet的_jspService()方法來創建這些實例)。例如打印九九乘法表的jsp小腳本中使用的out對象就是jsp內置對象。
1 <%! 2 //jsp小腳本 3 void printMultiTable2(JspWriter out) throws IOException{ 4 StringBuilder s = new StringBuilder(); 5 for(int i=1;i<=9;i++){ 6 for(int j =1;j<=i;j++){ 7 s.append(i+" * "+j+" = "+i*j+"/t"); 8 } 9 s.append("<br />");10 }11 out.println(s.toString());//這里的out就是jsp內置對象12 }13 %>
JSP一共有9個內置對象,其中常用的內置對象有5個,如圖所示:
緩沖區(Buffer)就是內存中用來保存臨時數據的一塊區域。關于緩沖區有一個很形象的例子:比如我們煮好了飯放在鍋里,如果我們一粒一粒地來吃米飯就不知道吃到猴年馬月,拿來一個碗來一碗一碗吃,豈不快哉!這里的碗就充當了緩沖區的概念。其實IO的本質就是直接操作字節,但是效率太慢所以引入了緩沖區。
out對象是JspWriter類的一個實例——是向客戶端輸出內容的常用對象,該對象的常用方法:
1 void println(String message); // 向客戶端打印字符串2 void clear(); // 清除緩沖區內容,如果在flush之后調用會拋出異常3 void clearBuffer(); // 清除緩沖區內容,如果在flush之后調用不會拋出異常4 void flush(); // 將緩沖區的內容輸出到客戶端5 int getBufferSize(); // 返回緩沖區的大?。ㄗ止潱?,默認是06 int getRemaining(); // 返回緩沖區可用容量7 boolean isAutoFlush(); // 返回緩沖區滿的時候是自動清空還是拋出異常8 void close(); // 關閉輸出流
下面是一個簡單的示例:
1 <h1>JSP的out內置對象</h1> 2 <% 3 //jsp腳本 4 out.println("<h2>靜夜思</h2>"); 5 out.println("李白<br /><br />"); 6 out.println("窗前明月光,<br />"); 7 out.println("疑是地上霜。<br />"); 8 out.println("舉頭望明月,<br />"); 9 out.println("低頭思故鄉。<hr />");10 %>11 <!-- JSP表達式 -->12 緩沖區大小:<%=out.getBufferSize() %>字節。<br />13 剩余緩沖區(可用緩沖區):<%=out.getRemaining() %>字節。<br /> 14 是否自動清空緩沖區:<%=out.isAutoFlush() %><br />
運行結果:
1 <h1>JSP的out內置對象</h1> 2 <% 3 //jsp腳本 4 out.println("<h2>靜夜思</h2>"); 5 out.println("李白<br /><br />"); 6 out.println("窗前明月光,<br />"); 7 out.flush();//將緩沖區中的內容輸出到客戶端 8 out.println("疑是地上霜。<br />"); 9 out.println("舉頭望明月,<br />");10 out.println("低頭思故鄉。<hr />");11 %>12 <!-- JSP表達式 -->13 緩沖區大?。?lt;%=out.getBufferSize() %>字節。<br />14 剩余緩沖區(可用緩沖區):<%=out.getRemaining() %>字節。<br /> 15 是否自動清空緩沖區:<%=out.isAutoFlush() %><br />
如果在第7行強制刷新緩沖區,則輸出的頁面不會有任何變化,僅僅是可用緩沖區的數量變多了而已【因為flush清空了緩沖區】
1 <% 2 //jsp腳本 3 out.println("<h2>靜夜思</h2>"); 4 out.println("李白<br /><br />"); 5 out.println("窗前明月光,<br />"); 6 7 out.flush();//將緩沖區中的內容輸出到客戶端 8 out.clear();//在flush之后調用clear,將會拋出異常 9 10 out.println("疑是地上霜。<br />");11 out.println("舉頭望明月,<br />");12 out.println("低頭思故鄉。<hr />");13 %>
運行結果:
1 <% 2 //jsp腳本 3 out.println("<h2>靜夜思</h2>"); 4 out.println("李白<br /><br />"); 5 out.println("窗前明月光,<br />"); 6 7 out.flush();//將緩沖區中的內容輸出到客戶端 8 out.clearBuffer();//在flush之后調用clearBuffer不會拋出異常 9 10 out.println("疑是地上霜。<br />");11 out.println("舉頭望明月,<br />");12 out.println("低頭思故鄉。<hr />");13 %>
運行結果:
<form name="regForm" action="處理腳本" method="提交方式[post|get]"></form>
1 請輸入用戶名和密碼:2 <form name = "loginForm" action = "dologin.jsp" method = "get">3 用戶名:<input type="text" name="username" value="" maxlength = "15" /><br />4 密碼:<input type="password" name="password" maxlength="16" value="" /><br />5 <input type="submit" value="提交" />6 </form>
處理登錄的動作腳本dologin.jsp僅僅是顯示一句話"登錄成功"。
運行結果:
將用戶登錄表單的get方式改為post。
客戶端的請求被封裝在request對象中,通過它才能了解到客戶端的需求,然后做出響應。它是HttpServletRequest對象的實例。request對象具有請求域,即:完成客戶端的請求之前,該對象一直有效。常用方法如下:
/* 兩個比較常用的方法 */ 1 String getParameter(String name); // 返回name指定參數的參數值 2 String[] getParameterValues(String name); // 返回包含name的所有值的數組 3 void setAttribute(String,Object); // 存儲此請求中的屬性 4 String getContentType(); // 返回請求體的MIME類型 5 Stirng getProtocol(); // 返回請求所用的協議和版本號 6 String getServerName(); // 返回接受請求的服務器的主機名 7 int getServerPort(); // 返回服務器接受此請求所用的端口號 8 String getCharacterEncoding(); // 返回字符編碼方式【只能解決post方式的亂碼問題】 9 void setCharacterEncoding(); // 設置請求的字符編碼方式10 int getContentLength(); // 返回請求體的長度(字節)11 String getRemoteAddr(); // 返回發送此請求的客戶端IP12 String getRealPath(String path); // 返回虛擬路徑的真實路徑13 String request.getContextPath(); // 返回上下文路徑
以用戶注冊頁面為例(用戶在注冊頁reg.jsp完善信息后提交給request.jsp來處理):
用戶注冊頁reg.jsp
1 請輸入相關信息完成注冊<br /> 2 <form action="request.jsp" name="regForm" method="post"> 3 用戶名:<input type="text" name = "username" /><br /> 4 密碼:<input type="password" name = "password" /><br /> 5 愛好: 6 <input type="checkbox" name = "favorite" value="read"/>讀書 7 <input type="checkbox" name = "favorite" value="music"/>音樂 8 <input type="checkbox" name = "favorite" value="movie"/>電影 9 <input type="checkbox" name = "favorite" value="internet"/>上網<br />10 <input type="submit" value="提交" /> 11 </form>
處理用戶注冊頁的request.jsp
1 <h1>request內置對象</h1><br /> 2 3 用戶名:<%=request.getParameter("username") %><br /> 4 密碼:<%=request.getParameter("password") %><hr /> 5 愛好:<br /> 6 <% 7 String[]favorites = request.getParameterValues("favorite"); 8 for(String str:favorites){ 9 out.print(str+" ");10 }11 %>
運行結果:
但是以上頁面存在一個問題:假如我們在用戶名中輸入中文:
這時只要再request.jsp中設置字符集和reg.jsp一樣即可:
1 <h1>request內置對象</h1><br /> 2 <!-- 設置字符集,防止出現中文亂碼 --> 3 <% request.setCharacterEncoding("utf-8"); %> 4 用戶名:<%=request.getParameter("username") %><br /> 5 密碼:<%=request.getParameter("password") %><hr /> 6 愛好:<br /> 7 <% 8 String[]favorites = request.getParameterValues("favorite"); 9 for(String str:favorites){10 out.print(str+" ");11 }12 %>
除了可以使用表單的方式傳遞數據給request對象,也可以使用URL傳參的方式傳遞數據給request對象:
reg.jsp
<a href="request.jsp?username=root&password=toor&favorite=read&favorite=internet">測試URL傳參</a>
request.jsp(不變)
1 <h1>request內置對象</h1><br /> 2 <!-- 設置字符集,防止出現中文亂碼 --> 3 <% request.setCharacterEncoding("utf-8"); %> 4 用戶名:<%=request.getParameter("username") %><br /> 5 密碼:<%=request.getParameter("password") %><hr /> 6 愛好:<br /> 7 <% 8 String[]favorites; 9 if((favorites=request.getParameterValues("favorite"))!=null){10 for(String str:favorites){11 out.print(str+" ");12 }13 }14 %>
運行結果:
如果我們在URL傳參中傳入了中文數據,同樣會出現亂碼問題:
<a href="request.jsp?username=你好&password=toor&favorite=read&favorite=internet">測試URL傳參</a>
此時通過request.setCharacterEncoding()方法就無法解決亂碼問題了【一個良好的解決方案是修改tomcat的配置文件server.xml】
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>
向request對象中添加鍵值對:
reg.jsp:
1 請輸入相關信息完成注冊<br /> 2 <form action="request.jsp" name="regForm" method="post"> 3 用戶名:<input type="text" name = "username" /><br /> 4 密碼:<input type="password" name = "password" /><br /> 5 愛好: 6 <input type="checkbox" name = "favorite" value="read"/>讀書 7 <input type="checkbox" name = "favorite" value="music"/>音樂 8 <input type="checkbox" name = "favorite" value="movie"/>電影 9 <input type="checkbox" name = "favorite" value="internet"/>上網<br />10 <input type="submit" value="提交" /> 11 </form>
request.jsp
1 <h1>request內置對象</h1><br /> 2 <!-- 設置字符集,防止出現中文亂碼 --> 3 <% request.setCharacterEncoding("utf-8"); %> 4 <% 5 //在request對象中保存一個email屬性 6 request.setAttribute("email","io@Gmail.com"); 7 8 %> 9 用戶名:<%=request.getParameter("username") %><br />10 密碼:<%=request.getParameter("password") %><hr />11 愛好:<br />12 <%13 String[]favorites;14 if((favorites=request.getParameterValues("favorite"))!=null){15 for(String str:favorites){16 out.print(str+" ");17 }18 }19 %>20 <br />郵箱:<%=request.getAttribute("email") %>
運行結果:
1 <h1>request內置對象</h1><br /> 2 <!-- 設置字符集,防止出現中文亂碼 --> 3 <% request.setCharacterEncoding("utf-8"); %> 4 <% 5 //在request對象中保存一個email屬性 6 request.setAttribute("email","io@gmail.com"); 7 8 %> 9 用戶名:<%=request.getParameter("username") %><br />10 密碼:<%=request.getParameter("password") %><hr />11 愛好:<br />12 <%13 String[]favorites;14 if((favorites=request.getParameterValues("favorite"))!=null){15 for(String str:favorites){16 out.print(str+" ");17 }18 }19 %>20 <br />郵箱:<%=request.getAttribute("email") %> <hr />21 請求體的MIME類型:<%=request.getContentType() %><br />22 請求體的協議及版本號:<%=request.getProtocol() %><br />23 服務器主機名:<%=request.getServerName() %><br />24 服務器端口號:<%=request.getServerPort() %><br />25 請求的字符編碼:<%=request.getCharacterEncoding() %><br />26 請求的文件長度:<%=request.getContentLength() %>字節<br />27 請求的客戶端的IP:<%=request.getRemoteAddr() %><br />28 請求的真實路徑:<%=request.getRealPath("request.jsp") %><br />29 請求的上下文路徑:<%=request.getContextPath() %>
運行結果:
response對象包含了響應客戶請求的相關信息,但是在JSP中很少直接使用到它。它是HttpServletResponse類的實例。response對象具有頁面作用域——即:訪問一個頁面時,該頁面的response只對本次訪問有效,其他頁面的response對象對當前頁面無效。常用方法如下:
1 String getCharacterEncoding(); // 返回響應所用的編碼2 void setContentType(); // 設置響應的MIME類型3 PrintWriter getPrintWriter(); // 返回一個可以向客戶端輸出字符的對象【注意區別于out內置對象】4 sendRedirect(String location); // 重定向客戶端的請求
response.jsp
1 <%@page import="java.io.PrintWriter"%> 2 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> 3 <% 4 response.setContentType("text/html;charset=utf-8");//設置響應的MIME類型 5 6 out.println("<h1>response內置對象</h1><hr />"); 7 8 PrintWriter outer = response.getWriter();//獲得輸出流對象 9 outer.println("我是response對象生成的outter對象,在頁面中總是在前面輸出");10 %>
運行結果:
運行結果很是奇怪:明明out對象的輸出在代碼中位于前面。但是結果卻是PrintWriter的打印結果在前面,根本原因就是:PrintWriter的對象的輸出總是在最前面。如果我們需要讓標題先輸出,可以使用內置對象out的flush()方法強制刷新緩沖,向頁面輸出——保證標題出現在最前面。
請求重定向——當用戶請求response.jsp的時候馬上跳轉到login.jsp
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%><% response.sendRedirect("login.jsp"); // 請求重定向%>
3.7請求重定向與請求轉發的區別
如果我們在response.jsp中使用請求轉發:
1 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>2 <%3 //請求轉發4 request.getRequestDispatcher("request.jsp").forward(request, response);5 %>
運行結果:
Session客戶端與服務器的一次會話。Web中的Session表示用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所經過的這段時間——也就是用戶瀏覽這個網站所花費的時間。在服務器的內存中保存著不同用戶的Session。
session對象的常用方法:
1 long getCreationTime(); // 返回session的創建時間2 String getId(); // 返回session創建時JSP引擎為它設定的唯一ID號3 Object setAttribute(String name,Object value); // 使用指定名稱將對象綁定到此會話4 Object getAttribute(String name); // 返回此會話中的指定名稱綁定在一起的對象,如果沒有對象綁定在該名稱下則返回null5 String[] getValueNames(); // 返回一個包含此Session所有可用屬性的數組6 int getMaxInactiveInterval(); // 返回兩次請求間隔多長時間此session被取消【單位:秒】
sesseion_page1.jsp
1 <h1>session內置對象</h1> 2 <h2>session_page1.jsp</h2> 3 <% 4 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 5 String date = sdf.format(new Date(session.getCreationTime())); 6 out.print("session的創建時間:" + date); 7 session.setAttribute("username", "admin"); // 向session中設置屬性 8 %> 9 <br />Session的ID號:<%=session.getId() %><br />10 從session中獲取用戶名:<%=session.getAttribute("username") %>11 12 <a href="session_page2.jsp" target="_blank">以新窗口的方式打開session_page2.jsp</a>
session_page2.jsp
1 <h2>session_page2.jsp</h2>2 <% 3 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 4 String date = sdf.format(new Date(session.getCreationTime())); 5 out.print("session的創建時間:" + date); 6 %>7 <br />Session的ID號:<%=session.getId() %><br />8 從session中獲取用戶名:<%=session.getAttribute("username") %>
運行結果:
可以獲取session中保存的屬性集合以及設置session的有效期:
1 <% 2 session.setMaxInactiveInterval(5);//設置session的有效期為5s 3 4 session.setAttribute("username", "admin"); // 向session中設置屬性 5 session.setAttribute("password", "123456"); 6 session.setAttribute("age", 16); 7 %> 8 9 <%10 //獲取session中保存的屬性11 String[]names=session.getValueNames();12 if(names!=null){13 for(String str:names){14 out.print(str+"/t");15 }16 }17 %>Session的生命周期:
修改/conf/tomcat-user.xml為以下:
1 <?xml version="1.0" encoding="UTF-8"?>2 <tomcat-users>3 <role rolename="admin-gui"/>4 <role rolename="manager-gui"/>5 <user username="admin" password="admin" roles="admin-gui,manager-gui"></user>6 </tomcat-users>
在瀏覽器中打開session_page1.jsp然后通過session_page1.jsp的超鏈接打開session_page2.jsp在后臺管理系統中查看:
如果我們在session創建之后調用session.invalidate()方法,例如:我們在session_page1.jsp中這樣寫:
1 <h1>session內置對象</h1> 2 <h2>session_page1.jsp</h2> 3 <% 4 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 5 String date = sdf.format(new Date(session.getCreationTime())); 6 out.print("session的創建時間:" + date); 7 10 session.setAttribute("username", "admin"); // 向session中設置屬性11 session.setAttribute("password", "123456");12 session.setAttribute("age", 16);13 %>14 <br />Session的ID號:<%=session.getId() %><hr />15 session中保存的屬性有:<br />16 <%17 //獲取session中保存的屬性18 String[]names=session.getValueNames();19 if(names!=null){20 for(String str:names){21 out.print(str+"/t");22 }23 }24 session.invalidate();//銷毀session25 %>26 <a href = "session_page2.jsp" target = "_blank">點擊在新標簽頁中打開session_page2.jsp</a>
運行結果(不斷刷新瀏覽器):
Session默認session超時是30min設置session對象的超時有兩種方式:
<session-config> &
新聞熱點
疑難解答