第三章:jsp入門
第1節:jsp概述
知識點1:動態網頁的執行原理
1.容器初始化Servlet實例,根據請求方法,調用相應的doXXX方法,並初始化請求和響應對象,作爲doXXX方法的參數使用;
2.執行doXXX方法後,將響應對象中的數據流寫到客戶端;
3.客戶端瀏覽器將收到的數據進行解析,顯示給用戶;
知識點2: JSP的功能與特性
(一)什麼是jsp
**JSP(Java Server Pages)**java服務器端頁面,是JavaEE規範中的Web組件,用來編寫動態頁面.
(二)jsp的特點
1.JSP運行在服務器端,本質是Servlet
2.JSP文件以.jsp爲後綴,在工程目錄中存在WebContent目錄下
3.JSP文件可以直接在瀏覽器中訪問
4.JSP文件中的內容就是 HTML+Java代碼,靜態部分使用HTML和文本即可,動態部分使用Java代碼
知識點3: JSP的執行流程解析
(一)翻譯
Web服務器找到blank.jsp,對其進行翻譯,生成blank_jsp.java文件,就是Servlet;查看路徑: 工作空間E:\prj_eclipse_rs.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\0430-web\org\apache\jsp
翻譯的命名方式:
單詞.jsp->單詞_jsp.vava
數字.jsp->_數字_jsp.java
(二)編譯
服務器將blank_jsp.java編譯成類文件blank_jsp.class,翻譯和編譯的過程遵守Servlet規範,因此說JSP的本質也是Servlet;
(三)實例化
服務器實例化類blank_jsp.class
(四)提供服務:
調用類中的_jspService方法提供服務
總結:
1.爲什麼要使用JSP組件?
Servlet生成動態頁面比較繁瑣,使用JSP生成動態頁面比較便捷,因爲其中的靜態內容可以使用HTML生成
2.JSP執行的流程是什麼?
JSP的執行過程是:翻譯-編譯-實例化-提供服務
3.JSP的本質
JSP的本質就是Servlet,不過是服務器將JSP進行了翻譯和編譯;可以說,JSP也是一個Java類;
第2節:jsp基本元素
知識點1:腳本元素
(一)什麼是腳本元素
腳本元素可以用來包含任意Java代碼
(二)語法格式
<% Java代碼 %>
(三)特點
服務器翻譯腳本元素時,將把其中Java代碼直接翻譯到_jspService方法中,如果語法錯誤,將在瀏覽器中提示錯誤
<body>
blank.jsp<br/>
<%
System.out.println("Hello Jsp!");
%>
</body>
out.write("blank.jsp<br/>\r\n");
System.out.println("Hello Jsp!");
out.write("\r\n");
知識點2:表達式元素
(一)什麼是表達式元素
表達式元素用來向頁面輸出動態內容
(二)語法格式
<%= Java代碼 %>
(三)特點
服務器翻譯表達式元素時,將把其中Java代碼部分的返回值使用out.write語句輸出
<body>
<%=request.getRemoteAddr()%>
</body>
out.write("<body>\r\n");
out.print(request.getRemoteAddr());
out.write("\r\n");
out.write("</body>\r\n");
知識點3:模版元素
(一)什麼是模板元素
模板元素指JSP中靜態HTML或者XML內容
(二)模板元素
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv=*"Content-Type"* content=*"text/html; charset=UTF-8"*>
<title>Insert title here</title>
</head>
<body>
知識點4:註釋元素
在JSP中可以使用註釋元素,有三種情況
(一)JSP註釋
1.語法
格式爲<%–JSP註釋–%>;
2.特點
JSP的註釋只有在源代碼中可見,翻譯時已經忽略;
<body>
<%--JSP註釋 --%>
<%=request.getRemoteAddr()%>
</body>
out.write("</head>\r\n");
out.write("<body>\r\n");
out.print(request.getRemoteAddr());
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
(二)HTML註釋
1.語法
<!--HTML註釋-->
2.特點
在JSP中,除了使用JSP註釋外,還可以使用HTML註釋,
1.HTML註釋翻譯時會被翻譯成
out.write("<!-- HTML註釋 -->\r\n"),
2.會被返回到客戶端,
3.在網頁源代碼能看見
4.但是不顯示到頁面中;
<body>
<!-- HTML註釋 -->
<%=request.getRemoteAddr()%>
</body>
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<!-- HTML註釋 -->\r\n");
out.print(request.getRemoteAddr());
out.write("\r\n");
out.write("</body>\r\n");
3.Java註釋
(1)語法
單行://
多行:/**/
doc:/** */
(2)特點
JSP中的Java代碼部分,可以使用Java註釋;Java註釋會翻譯到.java文件中,但是編譯時忽略
知識點5:聲明元素
(一)什麼是聲明元素
在JSP文件中定義類的成員變量或方法的元素叫做聲明元素
(二)語法
<%!聲明語句%>
(三)特點
聲明元素被翻譯到Java類中,而不是_jspService方法中;
實際中使用不多;
知識點6:內置對象概念
(一)什麼是內置對象
內置對象指的是在JSP中可以直接使用的對象,不需要聲明,直接使用固定的名字使用即可;例如<%=request.getRemoteAddr()%>中的request就是內置對象;
(二)JSP的9大內置對象
1.分類
1.與輸入/輸出有關的對象: request、response、out
2.與屬性作用域有關的對象:session、application、pageContext
3.與Servlet 相關對象:page、config
4.與錯誤處理有關的:exception
2.4大作用域
作用域範圍從小到大順序:page---->request---->session---->application
page 當前頁面有效(頁面跳轉後無效)
request 同一次請求有效(請求轉發後有效,重定向後無效)
session 同一次對話有效(同一個瀏覽器在退出關閉之前都有效)
application 全局有效(整個項目)
第3節:Servlet與JSP的作用
知識點1:Servlet與JSP的作用總結
1.JSP的作用
Servlet和JSP都可以生成動態頁面;然而,顯然JSP更適合生成動態頁面,因爲其中的靜態部分可以直接使用HTML即可.
2.Servlet的作用
1.接收來自JSP的請求,
2.處理請求,
3.然後轉到JSP頁面把結果顯示給客戶端看
知識點2:Servlet與JSP之間跳轉的方式
1.響應重定向
響應接口中提供了該方法
(1)使用方法
response.sendRedirect(request.getContextPath()+”/xxx”);
(2)特點
1.實際是兩次HTTP請求,
2.服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的
3.瀏覽器地址欄發生變化,顯示的是第二次請求的地址
2.請求轉發
RequestDispatcher接口定義了請求轉發的方法
要使用forward方法,需要先獲得RequestDispatcher對象;請求接口中提供了獲得該對象的方法:
(1)使用方法
request.getRequestDispatcher(url).forward(request,response);
(2)特點
1.客戶端和瀏覽器只發出一次請求
2.請求轉發是在服務器內部進行轉發,
3.瀏覽器地址欄還是顯示第一次請求的URL,沒有發生變化
3.Servlet與JSP之間跳轉的方式練習
①創建登錄的login.jsp,用戶名和密碼,提交按鈕
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/0430-web/LoginServlet" method="post">
用戶名:<input type="text" name="username"/><br/>
密碼:<input type="password" name="password"/><br/>
<input type="submit" name="提交"/>
</form>
</body>
</html>
②創建LoginServlet,處理登錄的請求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到用戶名
String username = request.getParameter("username");
//得到密碼
String password = request.getParameter("password");
//判斷用戶名和密碼是否正確
//正確
if (username.equals("Tom") && password.equals("123")) {
//請求轉發到成功頁面
request.getRequestDispatcher("/success.jsp").forward(request, response);
}else {//錯誤
//重定向到錯誤頁面
response.sendRedirect(request.getContextPath()+"/error.jsp");
}
}
③創建success.jsp
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
success!!!
</body>
</html>
④創建error.jsp
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
error!!!
</body>
</html>
⑤測試
知識點3:請求屬性的使用
1.如果需要在Servlet,JSP之間跳轉時,同時把一些自定義的、或者通過數據庫查詢的、或者調用其他資源獲得的數據傳遞到下一個資源時,就可以把這些數據設置爲請求的屬性即可。
2.請求屬性可以是任意類型的對象,可以用setAttribute方法將對象作爲屬性存儲到請求對象中
3.請求參數是用戶提交請求時,自動封裝到請求對象中的一些輸入信息,都是String類型
1.向request作用域放值,使用請求轉發後在jsp頁面取值
①Servlet調用request.setAttribute(name,value)向請求作用域裏放值
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到用戶名
String username = request.getParameter("username");
//得到密碼
String password = request.getParameter("password");
//判斷用戶名和密碼是否正確
//正確
if (username.equals("Tom") && password.equals("123")) {
//向請求作用域放入數據,準備在頁面接收並顯示
request.setAttribute("username", username);
//請求轉發到成功頁面
request.getRequestDispatcher("/success.jsp").forward(request, response);
}else {//錯誤
//重定向到錯誤頁面
response.sendRedirect(request.getContextPath()+"/error.jsp");
}
}
②jsp使用request.getAttribute(name)取得值
<body>
success!!!
<%
String username=(String)request.getAttribute("username");
%>
<%=username%>
</body>
③測試