SP:Java Server Pages。JSP是一種網頁的編碼格式,不同于HTML的是JSP中是由 HTML中的標簽指令 和 Java邏輯代碼 拼湊而成, 其中的Java代碼類似于JavaScript中的邏輯代碼, 但相對比來說JSP中的Java代碼更方便閱讀和書寫.
當JSP頁面被運行時,WEB容器會把請求交給JSP引擎處理,會將JSP翻譯成一個_jspServlet,然后按照Servlet的調用方式來進行調用,
瀏覽器向服務器發請求,不管訪問的是什么資源,其實都是在訪問Servlet,所以當訪問一個jsp頁面時,其實也是在訪問一個Servlet,服務器在執行jsp的時候,首先把jsp翻譯成一個Servlet,所以我們訪問jsp時,其實不是在訪問jsp,而是在訪問jsp翻譯過后的那個Servlet,
Tomcat在Web中的作用:
Tomcat是Web中的容器,
當客戶在Web服務器中輸入請求的時候, 如果請求的動態頁面, 那么Web服務器會創建一個Servlet來處理, Servlet就是Java代碼, 只是在服務器端的Java代碼, Servlet通過配置文件來攔截客戶所發出的請求, 并進行相應的處理, 最后反饋到客戶端.
在這一系列的請求中,Web服務器是如何創建出Servlet來對請求進行處理? 而Tomcat的作用就是幫助Web服務器來創建Servlet的
Tomcat是應用(java)服務器,它只是一個Servlet容器,是Apache的擴展,處理動態頁面的部分
Tomcat各個文件夾的含義
當我們通過瀏覽器訪問index.jsp時,服務器首先將index.jsp翻譯成一個index_jsp.class,在Tomcat服務的work\Catalina\localhost\項目名\org\apache\jsp 目錄下可以看到index_jsp.class的源代碼文件index_jsp.java,
index_jsp這個類是繼承 org.apache.jasper.runtime.HttpJspBase這個類的,通過查看Tomcat服務器的源代碼,可以知道在apache-tomcat-6.0.20-src\java\org\apache\jasper\runtime目錄下存HttpJspBase這個類的源代碼文件
HttpJspBase 類是繼承 HttpServlet 的,所以 HttpJspBase 類是一個 Servlet ,而 index_jsp 又是繼承 HttpJspBase類的,所以index_jsp類也是一個Servlet,所以當瀏覽器訪問服務器上的index.jsp頁面時,其實就是在訪問index_jsp這個Servlet,index_jsp這個Servlet使用_jspService這個方法處理請求。
1:jsp中的代碼是由 Java代碼 和 HTML 代碼組成的 但是兩種不同的代碼是如何實現他們的作用的?
在客戶端發出請求時(請求的是動態代碼) 但是客戶端卻只能看到HTML代碼, Java代碼是客戶端看不到的
原因是: 請求的JSP頁面中,所有的代碼是通過了Web服務器(在Tomcat下)編譯后的Servlet代碼, 在jsp中編寫的java代碼和html代碼都會被翻譯到_jspService方法中去,在jsp中編寫的java代碼會原封不動地翻譯成java代碼,如<%out.print("HelloJsp");%>直接翻譯成out.print("Hello Jsp");,而HTML代碼則會翻譯成使用out.write("<html標簽>\r\n");的形式輸出到瀏覽器。在jsp頁面中編寫的html排版標簽都是以out.write("<html標簽>\r\n");的形式輸出到瀏覽器,瀏覽器拿到html代碼后才能夠解析執行html代碼。
當執行_jspService方法處理請求時,就會執行在jsp編寫的java代碼了,所以Jsp頁面中的java代碼服務器是通過調用_jspService方法處理請求時執行的。(_jspService中的Java代碼是實現動態頁面的邏輯基礎)
JavaBean是特殊的Java類,使用J ava語言書寫,并且遵守JavaBean API規范。
接下來給出的是JavaBean與其它Java類相比而言獨一無二的特征:
提供一個默認的無參構造函數。
需要被序列化并且實現了Serializable接口。
可能有一系列可讀寫屬性。
可能有一系列的"getter"或"setter"方法。
JavaBean屬性
一個JavaBean對象的屬性應該是可訪問的。這個屬性可以是任意合法的Java數據類型,包括自定義Java類。
一個JavaBean對象的屬性可以是可讀寫,或只讀,或只寫。JavaBean對象的屬性通過JavaBean實現類中提供的兩個方法來訪問:
方法 | 描述 |
---|---|
getPropertyName() | 舉例來說,如果屬性的名稱為myName,那么這個方法的名字就要寫成getMyName()來讀取這個屬性。這個方法也稱為訪問器。 |
setPropertyName() | 舉例來說,如果屬性的名稱為myName,那么這個方法的名字就要寫成setMyName()來寫入這個屬性。這個方法也稱為寫入器。 |
一個只讀的屬性只提供getPropertyName()方法,一個只寫的屬性只提供setPropertyName()方法。
JavaBean 程序示例
這是StudentBean.java文件:
package com.runoob;
public class StudentsBean implements java.io.Serializable
{
private String firstName = null;
private String lastName = null;
private int age = 0;
public StudentsBean() {
}
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
public int getAge(){
return age;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public void setAge(int age) {
this.age = age;
}
}
編譯 StudentBean.java 文件(最后一個實例會用到):
$ javac StudentsBean.java
編譯后獲得 StudentBean.class 文件,將其拷貝到 <JSP 項目>/WebContent/WEB-INF/classes/com/runoob,如下圖所示:
訪問JavaBean
<jsp:useBean> 標簽可以在JSP中聲明一個JavaBean,然后使用。聲明后,JavaBean對象就成了腳本變量,可以通過腳本元素或其他自定義標簽來訪問。<jsp:useBean>標簽的語法格式如下:
<jsp:useBean id="bean 的名字" scope="bean 的作用域" typeSpec/>
其中,根據具體情況,scope的值可以是page,request,session或application。id值可任意只要不和同一JSP文件中其它<jsp:useBean>中id值一樣就行了。
接下來給出的是 <jsp:useBean> 標簽的一個簡單的用法:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>useBean 實例</title>
</head>
<body>
<jsp:useBean id="date" class="java.util.Date" />
<p>日期為:<%= date %>
</body>
</html>
它將會產生如下結果:
日期為:Tue Jun 28 15:22:24 CST 2016
訪問 JavaBean 對象的屬性
在 <jsp:useBean> 標簽主體中使用 <jsp:getProperty/> 標簽來調用 getter 方法,使用 <jsp:setProperty/> 標簽來調用 setter 方法,語法格式如下:
<jsp:useBean id="id" class="bean 編譯的類" scope="bean 作用域">
<jsp:setProperty name="bean 的 id" property="屬性名"
value="value"/>
<jsp:getProperty name="bean 的 id" property="屬性名"/>
...........
</jsp:useBean>
name屬性指的是Bean的id屬性。property屬性指的是想要調用的getter或setter方法。
接下來給出使用以上語法進行屬性訪問的一個簡單例子:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<title>get 和 set 屬性實例</title>
</head>
<body>
<jsp:useBean id="students"
class="com.runoob.StudentsBean">
<jsp:setProperty name="students" property="firstName"
value="小強"/>
<jsp:setProperty name="students" property="lastName"
value="王"/>
<jsp:setProperty name="students" property="age"
value="10"/>
</jsp:useBean>
<p>學生名字:
<jsp:getProperty name="students" property="firstName"/>
</p>
<p>學生姓氏:
<jsp:getProperty name="students" property="lastName"/>
</p>
<p>學生年齡:
<jsp:getProperty name="students" property="age"/>
</p>
</body>
</html>
訪問以上 JSP,運行結果如下:
學生名字: 小強
學生姓氏: 王
學生年齡: 10
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
ookie是存儲在客戶機的文本文件,它們保存了大量軌跡信息。在servlet技術基礎上,JSP顯然能夠提供對HTTP cookie的支持。
通常有三個步驟來識別回頭客:
服務器腳本發送一系列cookie至瀏覽器。比如名字,年齡,ID號碼等等。
瀏覽器在本地機中存儲這些信息,以備不時之需。
當下一次瀏覽器發送任何請求至服務器時,它會同時將這些cookie信息發送給服務器,然后服務器使用這些信息來識別用戶或者干些其它事情。
如何去設置或重設cookie的方法,還有如何訪問它們及如何刪除它們。
JSP Cookie 處理需要對中文進行編碼與解碼,方法如下:
String str = java.net.URLEncoder.encode("中文","UTF-8"); //編碼String str = java.net.URLDecoder.decode("編碼后的字符串","UTF-8"); // 解碼
Cookie 剖析
Cookie通常在HTTP信息頭中設置(雖然JavaScript能夠直接在瀏覽器中設置cookie)。在JSP中,設置一個cookie需要發送如下的信息頭給服務器:
HTTP/1.1 200 OKDate: Fri, 04 Feb 2015 21:03:38 GMTServer: Apache/1.3.9 (UNIX) PHP/4.0b3Set-Cookie: name=runoob; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=runoob.comConnection: closeContent-Type: text/html
正如您所見,Set-Cookie信息頭包含一個鍵值對,一個GMT(格林尼治標準)時間,一個路徑,一個域名。鍵值對會被編碼為URL。有效期域是個指令,告訴瀏覽器在什么時候之后就可以清除這個cookie。
如果瀏覽器被配置成可存儲cookie,那么它將會保存這些信息直到過期。如果用戶訪問的任何頁面匹配了cookie中的路徑和域名,那么瀏覽器將會重新將這個cookie發回給服務器。瀏覽器端的信息頭長得就像下面這樣:
GET / HTTP/1.0Connection: Keep-AliveUser-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)Host: zink.demon.co.uk:1126Accept: image/gif, */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1,*,utf-8 Cookie: name=xyz
JSP腳本通過request對象中的getCookies()方法來訪問這些cookie,這個方法會返回一個Cookie對象的數組。
Servlet Cookie 方法
下表列出了Cookie對象中常用的方法:
序號 | 方法 & 描述 |
---|---|
1 | public void setDomain(String pattern)設置cookie的域名,比如 runoob.com |
2 | public String getDomain()獲取cookie的域名,比如 runoob.com |
3 | public void setMaxAge(int expiry)設置cookie有效期,以秒為單位,默認有效期為當前session的存活時間 |
4 | public int getMaxAge()獲取cookie有效期,以秒為單位,默認為-1 ,表明cookie會活到瀏覽器關閉為止 |
5 | public String getName()返回 cookie的名稱,名稱創建后將不能被修改 |
6 | public void setValue(String newValue)設置 cookie的值 |
7 | public String getValue()獲取cookie的值 |
8 | public void setPath(String uri)設置cookie 的路徑,默認為當前頁面目錄下的所有URL,還有此目錄下的所有子目錄 |
9 | public String getPath()獲取cookie 的路徑 |
10 | public void setSecure(boolean flag)指明cookie是否要加密傳輸 |
11 | public void setComment(String purpose)設置注釋描述 cookie的目的。當瀏覽器將cookie展現給用戶時,注釋將會變得非常有用 |
12 | public String getComment()返回描述cookie目的的注釋,若沒有則返回null |
使用JSP設置Cookie
使用JSP設置cookie包含三個步驟:
(1)創建一個Cookie對象: 調用Cookie的構造函數,使用一個cookie名稱和值做參數,它們都是字符串。
Cookie cookie = new Cookie("key","value");
請務必牢記,名稱和值中都不能包含空格或者如下的字符:
[ ] ( ) = , " / ? @ : ;
(2) 設置有效期:調用setMaxAge()函數表明cookie在多長時間(以秒為單位)內有效。下面的操作將有效期設為了24小時。
cookie.setMaxAge(60*60*24);
(3) 將cookie發送至HTTP響應頭中:調用response.addCookie()函數來向HTTP響應頭中添加cookie。
response.addCookie(cookie);
實例演示
main.jsp 文件代碼如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ page import="java.net.*" %><% // 編碼,解決中文亂碼 String str = URLEncoder.encode(request.getParameter("name"),"utf-8"); // 設置 name 和 url cookie Cookie name = new Cookie("name", str); Cookie url = new Cookie("url", request.getParameter("url")); // 設置cookie過期時間為24小時。 name.setMaxAge(60*60*24); url.setMaxAge(60*60*24); // 在響應頭部添加cookie response.addCookie( name ); response.addCookie( url );%><html><head><title>設置 Cookie</title></head><body><h1>設置 Cookie</h1><ul><li><p><b>網站名:</b> <%= request.getParameter("name")%></p></li><li><p><b>網址:</b> <%= request.getParameter("url")%></p></li></ul></body></html>
以下是一個簡單的 HTML 表單通過GET方法將客戶端數據提交到 main.jsp 文件中,并設置 cookie:
<!DOCTYPE html><html><head><meta charset="utf-8"><title>我愛學習(run.com)</title></head><body><form action="main.jsp" method=GET>站點名: <input type="text" name="name"><br />網址: <input type="text" name="url" /><input type="submit" value="提交" /></form></body></html>
將以上HTML代碼保存到test.htm文件中。
將該文件放置于當前jsp項目的 WebContent 目錄下(與 main.jsp 同一個目錄)。
通過訪問 http://localhost:8080/testjsp/test.html 提交表單數據到 main.jsp 文件,試著輸入 "站點名" 和 "網址",然后點擊提交按鈕,它將會在您的屏幕中顯示 "站點名" 和 "網址",并且設置 "站點名" 和 "網址" 的兩個 cookie。
使用 JSP 讀取 Cookie
想要讀取cookie,您就需要調用request.getCookies()方法來獲得一個javax.servlet.http.Cookie對象的數組,然后遍歷這個數組,使用getName()方法和getValue()方法來獲取每一個cookie的名稱和值。
<h3實例演示< h3="" data-filtered="filtered" style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", "WenQuanYi Micro Hei", Arial, sans-serif; font-size: 12px; white-space: normal;">
讓我們來讀取上個例子中的cookie, 以下為 cookie.jsp 文件代碼:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ page import="java.net.*" %><!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>獲取 Cookie</title></head><body><% Cookie cookie = null; Cookie[] cookies = null; // 獲取cookies的數據,是一個數組 cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> 查找 Cookie 名與值</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; out.print("參數名 : " + cookie.getName()); out.print("<br>"); out.print("參數值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br>"); out.print("------------------------------------<br>"); } }else{ out.println("<h2>沒有發現 Cookie</h2>"); }%></body></html>
使用JSP刪除Cookie
刪除cookie非常簡單。如果您想要刪除一個cookie,按照下面給的步驟來做就行了:
獲取一個已經存在的cookie然后存儲在Cookie對象中。
將cookie的有效期設置為0。
將這個cookie重新添加進響應頭中。
實例演示
下面的程序刪除一個名為"name"的cookie,當您第二次運行cookie.jsp時,name 將會為 null。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ page import="java.net.*" %><!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>獲取 Cookie</title></head><body><% Cookie cookie = null; Cookie[] cookies = null; // 獲取當前域名下的cookies,是一個數組 cookies = request.getCookies(); if( cookies != null ){ out.println("<h2> 查找 Cookie 名與值</h2>"); for (int i = 0; i < cookies.length; i++){ cookie = cookies[i]; if((cookie.getName( )).compareTo("name") == 0 ){ cookie.setMaxAge(0); response.addCookie(cookie); out.print("刪除 Cookie: " + cookie.getName( ) + "<br/>"); } out.print("參數名 : " + cookie.getName()); out.print("<br>"); out.print("參數值: " + URLDecoder.decode(cookie.getValue(), "utf-8") +" <br>"); out.print("------------------------------------<br>"); } }else{ out.println("<h2>沒有發現 Cookie</h2>"); }%></body></html>
再次訪問 http://localhost:8080/testjsp/cookie.jsp,將會得到如下結果:
可以看到名為"name" 的 cookie 已經不見了。
您也可以手動在瀏覽器中刪除 cookie。IE 瀏覽器通過點擊Tools菜單項,然后選擇Internet Options,點擊 Delete Cookies,就能刪除所有 cookie 。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。