創建測試數據
接下來我們在 MySQL 中創建 RUNOOB 數據庫,并創建 websites 數據表,表結構如下:
CREATE TABLE `websites` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL DEFAULT '' COMMENT '站點名稱',
`url` varchar(255) NOT NULL DEFAULT '',
`alexa` int(11) NOT NULL DEFAULT '0' COMMENT 'Alexa 排名',
`country` char(10) NOT NULL DEFAULT '' COMMENT '國家',
PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
插入一些數據:
INSERT INTO `websites` VALUES ('1', 'Google', 'https://www.google.cm/', '1', 'USA'), ('2', '淘寶', 'https://www.taobao.com/', '13', 'CN'), ('3', '菜鳥教程', 'http://www.runoob.com', '5892', ''), ('4', '微博', 'http://weibo.com/', '20', 'CN'), ('5', 'Facebook', 'https://www.facebook.com/', '3', 'USA');
數據表顯示如下:
SELECT操作
接下來的這個例子告訴我們如何使用JSTL SQL標簽來運行SQL SELECT語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*,java.sql.*"%><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<html><head><title>SELECT 操作</title></head><body><!--
JDBC 驅動名及數據庫 URL
數據庫的用戶名與密碼,需要根據自己的設置
useUnicode=true&characterEncoding=utf-8 防止中文亂碼
--><sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"
user="root" password="123456"/>
<sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數據庫實例 - 菜鳥教程</h1><table border="1" width="100%"><tr>
<th>ID</th>
<th>站點名</th>
<th>站點地址</th></tr><c:forEach var="row" items="${result.rows}"><tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.name}"/></td>
<td><c:out value="${row.url}"/></td></tr></c:forEach></table>
</body></html>
訪問這個JSP例子,運行結果如下:
INSERT操作
這個例子告訴我們如何使用JSTL SQL標簽來運行SQL INSERT語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*,java.sql.*"%><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<html><head><title>SELECT 操作</title></head><body><!--
JDBC 驅動名及數據庫 URL
數據庫的用戶名與密碼,需要根據自己的設置
useUnicode=true&characterEncoding=utf-8 防止中文亂碼
--><sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"
user="root" password="123456"/><!--
插入數據
--><sql:update dataSource="${snapshot}" var="result">INSERT INTO websites (name,url,alexa,country) VALUES ('菜鳥教程移動站', 'http://m.runoob.com', 5093, 'CN');</sql:update><sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數據庫實例 - 菜鳥教程</h1><table border="1" width="100%"><tr>
<th>ID</th>
<th>站點名</th>
<th>站點地址</th></tr><c:forEach var="row" items="${result.rows}"><tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.name}"/></td>
<td><c:out value="${row.url}"/></td></tr></c:forEach></table>
</body></html>
訪問這個JSP例子,運行結果如下:
DELETE操作
這個例子告訴我們如何使用JSTL SQL標簽來運行SQL DELETE語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*,java.sql.*"%><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<html><head><title>SELECT 操作</title></head><body><!--
JDBC 驅動名及數據庫 URL
數據庫的用戶名與密碼,需要根據自己的設置
useUnicode=true&characterEncoding=utf-8 防止中文亂碼
--><sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"
user="root" password="123456"/><!--
刪除 ID 為 11 的數據
--><sql:update dataSource="${snapshot}" var="count">
DELETE FROM websites WHERE Id=? <sql:param value="" /></sql:update><sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數據庫實例 - 菜鳥教程</h1><table border="1" width="100%"><tr>
<th>ID</th>
<th>站點名</th>
<th>站點地址</th></tr><c:forEach var="row" items="${result.rows}"><tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.name}"/></td>
<td><c:out value="${row.url}"/></td></tr></c:forEach></table>
</body></html>
訪問這個JSP例子,運行結果如下:
UPDATE操作
這個例子告訴我們如何使用JSTL SQL標簽來運行SQL UPDATE語句:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*,java.sql.*"%><%@ page import="javax.servlet.http.*,javax.servlet.*" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<html><head><title>SELECT 操作</title></head><body><!--
JDBC 驅動名及數據庫 URL
數據庫的用戶名與密碼,需要根據自己的設置
useUnicode=true&characterEncoding=utf-8 防止中文亂碼
--><sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"
user="root" password="123456"/><!--
修改 ID 為 3 的名字:菜鳥教程改為 RUNOOB
--><c:set var="SiteId" value="3"/>
<sql:update dataSource="${snapshot}" var="count">
UPDATE websites SET name='RUNOOB' WHERE Id=? <sql:param value="${SiteId}" /></sql:update><sql:query dataSource="${snapshot}" var="result">SELECT * from websites;</sql:query><h1>JSP 數據庫實例 - 菜鳥教程</h1><table border="1" width="100%"><tr>
<th>ID</th>
<th>站點名</th>
<th>站點地址</th></tr><c:forEach var="row" items="${result.rows}"><tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.name}"/></td>
<td><c:out value="${row.url}"/></td></tr></c:forEach></table>
</body></html>
訪問這個JSP例子,運行結果如下:
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
當瀏覽器請求一個網頁時,它會向網絡服務器發送一系列不能被直接讀取的信息,因為這些信息是作為HTTP信息頭的一部分來傳送的。您可以查閱HTTP協議來獲得更多的信息。
下表列出了瀏覽器端信息頭的一些重要內容,在以后的網絡編程中將會經常見到這些信息:
信息 | 描述 |
---|---|
Accept | 指定瀏覽器或其他客戶端可以處理的MIME類型。它的值通常為 image/png 或 image/jpeg |
Accept-Charset | 指定瀏覽器要使用的字符集。比如 ISO-8859-1 |
Accept-Encoding | 指定編碼類型。它的值通常為 gzip 或compress |
Accept-Language | 指定客戶端首選語言,servlet會優先返回以當前語言構成的結果集,如果servlet支持這種語言的話。比如 en,en-us,ru等等 |
Authorization | 在訪問受密碼保護的網頁時識別不同的用戶 |
Connection | 表明客戶端是否可以處理HTTP持久連接。持久連接允許客戶端或瀏覽器在一個請求中獲取多個文件。Keep-Alive 表示啟用持久連接 |
Content-Length | 僅適用于POST請求,表示 POST 數據的字節數 |
Cookie | 返回先前發送給瀏覽器的cookies至服務器 |
Host | 指出原始URL中的主機名和端口號 |
If-Modified-Since | 表明只有當網頁在指定的日期被修改后客戶端才需要這個網頁。 服務器發送304碼給客戶端,表示沒有更新的資源 |
If-Unmodified-Since | 與If-Modified-Since相反, 只有文檔在指定日期后仍未被修改過,操作才會成功 |
Referer | 標志著所引用頁面的URL。比如,如果你在頁面1,然后點了個鏈接至頁面2,那么頁面1的URL就會包含在瀏覽器請求頁面2的信息頭中 |
User-Agent | 用來區分不同瀏覽器或客戶端發送的請求,并對不同類型的瀏覽器返回不同的內容 |
HttpServletRequest類
request對象是javax.servlet.http.HttpServletRequest類的實例。每當客戶端請求一個頁面時,JSP引擎就會產生一個新的對象來代表這個請求。
request對象提供了一系列方法來獲取HTTP信息頭,包括表單數據,cookies,HTTP方法等等。
接下來將會介紹一些在JSP編程中常用的獲取HTTP信息頭的方法。詳細內容請見下表:
序號 | 方法& 描述 |
---|---|
1 | Cookie[] getCookies()返回客戶端所有的Cookie的數組 |
2 | Enumeration getAttributeNames()返回request對象的所有屬性名稱的集合 |
3 | Enumeration getHeaderNames()返回所有HTTP頭的名稱集合 |
4 | Enumeration getParameterNames()返回請求中所有參數的集合 |
5 | HttpSession getSession()返回request對應的session對象,如果沒有,則創建一個 |
6 | HttpSession getSession(boolean create)返回request對應的session對象,如果沒有并且參數create為true,則返回一個新的session對象 |
7 | Locale getLocale()返回當前頁的Locale對象,可以在response中設置 |
8 | Object getAttribute(String name)返回名稱為name的屬性值,如果不存在則返回null。 |
9 | ServletInputStream getInputStream()返回請求的輸入流 |
10 | String getAuthType()返回認證方案的名稱,用來保護servlet,比如 "BASIC" 或者 "SSL" 或 null 如果 JSP沒設置保護措施 |
11 | String getCharacterEncoding()返回request的字符編碼集名稱 |
12 | String getContentType()返回request主體的MIME類型,若未知則返回null |
13 | String getContextPath()返回request URI中指明的上下文路徑 |
14 | String getHeader(String name)返回name指定的信息頭 |
15 | String getMethod()返回此request中的HTTP方法,比如 GET,,POST,或PUT |
16 | String getParameter(String name)返回此request中name指定的參數,若不存在則返回null |
17 | String getPathInfo()返回任何額外的與此request URL相關的路徑 |
18 | String getProtocol()返回此request所使用的協議名和版本 |
19 | String getQueryString()返回此 request URL包含的查詢字符串 |
20 | String getRemoteAddr()返回客戶端的IP地址 |
21 | String getRemoteHost()返回客戶端的完整名稱 |
22 | String getRemoteUser()返回客戶端通過登錄認證的用戶,若用戶未認證則返回null |
23 | String getRequestURI()返回request的URI |
24 | String getRequestedSessionId()返回request指定的session ID |
25 | String getServletPath()返回所請求的servlet路徑 |
26 | String[] getParameterValues(String name)返回指定名稱的參數的所有值,若不存在則返回null |
27 | boolean isSecure()返回request是否使用了加密通道,比如HTTPS |
28 | int getContentLength()返回request主體所包含的字節數,若未知的返回-1 |
29 | int getIntHeader(String name)返回指定名稱的request信息頭的值 |
30 | int getServerPort()返回服務器端口號 |
HTTP信息頭示例
在這個例子中,我們會使用HttpServletRequest類的getHeaderNames()方法來讀取HTTP信息頭。這個方法以枚舉的形式返回當前HTTP請求的頭信息。
獲取Enumeration對象后,用標準的方式來遍歷Enumeration對象,用hasMoreElements()方法來確定什么時候停止,用nextElement()方法來獲得每個參數的名字。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*" %><!DOCTYPE html><html><head><meta charset="utf-8"><title>菜鳥教程(runoob.com)</title></head><body><h2>HTTP 頭部請求實例</h2><table width="100%" border="1" align="center"><tr bgcolor="#949494"><th>Header Name</th><th>Header Value(s)</th></tr><%
Enumeration headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName=(String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue=request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}%></table></body></html>
訪問main.jsp,將會得到以下結果:
您可以在上面代碼中嘗試HttpServletRequest類的其它方法。
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
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代碼是實現動態頁面的邏輯基礎)
*請認真填寫需求信息,我們會在24小時內與您取得聯系。