標籤:uil w3c asc 匹配 使用者輸入 共用 res attribute 表單
jsp
sun公司制定的一種伺服器端動態網頁面技術規範
產生動態網頁面
jsp其實是一個以.jsp為尾碼的檔案,該檔案的內容主要是html和少量的java代碼
容器會將jsp檔案自動轉換成一個servlet然後執行。
如何寫一個jsp檔案
1、建立一個以.jsp為尾碼的檔案
2、在檔案裡面添加如下的內容:
(1)html(css,js):直接寫。不用寫out.print
(2)java代碼:
a、java程式碼片段 <% java語句; %>
b、jsp運算式
<%= java運算式%>
在 service方法裡,使用out.print(java運算式)輸出
(3)隱含對象
在jsp檔案裡面,可以直接使用的對象,比如 out,request,response
為什麼可以直接使用這些隱含對象。
容器會自動產生獲得這些對象的代碼
但是容器在預設情況下只會預設匯入servlet的幾個包,要是想用其他的包,就要用到指令
指令:
通知容器在將jsp檔案轉換成servlet類時,做一些額外的處理,比如導包。
指令的文法:
<%@指令名稱 屬性=屬性值 %>
a、import屬性:導包
比如: <%@page import=”java.util.*”%>
要導多個包,可以用逗號隔開
代碼
hello.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>hello</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> date: <% Date date = new Date(); out.print("date:"+date); %> <br> <% for(int i=0;i<10;i++){ out.print("hello,Recar<br>"); } %> </body></html>
或者這麼寫
current time:<%= new Date() %><br>
就是寫個等於 後面就等於把等於後面的語句寫在out.print裡
叫做運算式
不是一個語句。所以最後都沒有寫分號
建立jsp檔案在webroot下。正常寫html。要寫java的時候外面套個<%%>就可以了
輸出的話還是 out.print( )
容器會幫我們把jsp轉換成servlet類~
對於jsp中html用out.write
對於java代碼直接照搬
然後容器調用servlet
這裡的可以直接用out,因為他會在轉成servlet的時候會幫你定義 out
當然也可以直接用request和response
這些個就叫做隱含對象
輸出中文
就是這句話
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
最後一個屬性就是編碼,我設定的是utf-8,不然預設是iso
pageEncoding屬性:告訴容器jsp檔案的編碼。有些容器,在讀取jsp檔案的內容時,預設為按照iso-8859-1去解碼,如果jsp檔案裡麵包含了中文,會出現亂碼
可以用標籤來引入css檔案
讓一個servlet處理多種請求
1、尾碼匹配 *.do
2、分析請求資源路徑
String uri = request.getRequestURI() 這個就是擷取請求資源路徑
可以把uri.substring()來截取字uri來分析請求資源路徑
比如第最後一個/最後一個.中間的
轉寄
一個web組件(servlet/jsp)將未完成的處理交給另外一個web組件繼續做。
比如,一個servlet將處理結果轉寄給一個jsp來展現
如何轉寄:1、綁定資料(處理結果)到request上request.setAttribute(String name ,Object obj)根據綁定名獲得綁定值Object request.getAttribute(String name)2、獲得轉寄站RequestDispatcher rd = request.getRequestDispatcher(String uri);uri: 轉寄的地址。3、轉寄:rd.forward(request,response)
執行個體:
在emplist servlet中把out.print都刪了加上轉寄,讓其查詢出來的List轉寄到jsp中。讓jsp作為顯示
EmployeeDAO dao = new EmployeeDAO(); List<Employee> employees = dao.findAll(); //使用轉寄,將處理轉交給emplist.jsp //1、綁定資料 request.setAttribute("emplist", employees); //2、獲得轉寄站.轉寄的目的地 RequestDispatcher rd = request.getRequestDispatcher("emplist.jsp"); //3、轉寄 rd.forward(request, response);
jsp就直接擷取就可以了。但是要注意轉換類型。
還有名字要寫對!!!
<% List<Employee> employees = (List<Employee>) request.getAttribute("emplist"); for(int i=0;i<employees.size();i++){ Employee e = employees.get(i); %>
最後訪問的是 emplist !!!!不是emplist.jsp
因為是訪問emplist,然後查詢出來的employees轉寄到emplist.jsp 然後用jsp把查詢的顯示出來。
轉寄的特點:
a、轉寄之後,瀏覽器地址欄的地址不變。
b、轉寄地址有限制(必須是同一個應用)
include指令
告訴容器,在將jsp檔案轉換成servlet類時,將file屬性指定的檔案的內容插入到該指令所在的位置
比如: <%@include file=”heard.jsp”%>
可以分開寫,方便更改
取消瀏覽器的預設行為,就是說,一般串連,點擊了或者表單點擊提交,瀏覽器都會處理。但是加個 onclick=”return false”就會禁止了。無論怎麼點都沒用
如果寫 return confirm(‘是否確定刪除,取消就相當於false,確定就是true’)
<a href="del?id=<%=e.getId() %> " onclick="return confirm(‘是否確定刪除<%=e.getName() %>‘)" >刪除</a>
jsp只是用來展示
servlet來處理,把處理得到的資料轉寄給jsp 就用到轉寄。
然後用到jsp的標籤等
處理servlet運行時產生的異常
1、編程式處理
a)捕獲異常
b)轉寄給一個jsp
比如:
request.setAttribute(“error_msg”,”系統繁忙,稍後重試”);request.getRequestDispatcher(“error.jsp”).forward(request,response);
2、聲明式處理(即交給容器來處理)
a)捕獲異常,然後拋出異常給容器
b)配置處理頁面
<error-page><exception-type> 異常類型</exception-type><location>顯示的異常頁面</location></error-page>
聲明式異常常用來處理系統異常(異常發送之後不能恢複,比如資料庫服務停止)。發生這類異常之後,提示使用者稍後重試即可
編程式異常(轉寄的方式)更靈活,可以用來處理應用異常(比如使用者輸入錯誤的密碼等。)
可以把所有servlet放在一個裡面
建立servlet
然後對請求資源路徑進行判斷做不同的操作,就把之前寫的servlet對應的每個判斷下寫。
轉寄與重新導向的比較
1、轉寄所涉及的各個web組件可以共用同一個rquest對象,重新導向不可以
容器收到請求之後會建立請求對象和響應對象,當響應發送完畢,容器會立即刪除request對象和response對象。也就是request對象和response對象的存留時間是一次請求和響應期間
重新導向是兩次請求
2、重新導向之後,瀏覽器地址欄的地址會變;轉寄不變。
3、重新導向地址是任意的,而轉寄地址必須是同一個應用
4、轉寄是一件事未完成,而重新導向是一件事已經完成。
路徑問題
串連地址,表單提交地址,重新導向,轉寄這四種情況下,如果填寫路徑。
<a href =””></a><form action=””>request.sendRedirect(“”);request.getRequestDispatcher(“”);
(1)相對路徑
不以”/”開頭的路徑
(2)絕對路徑
以”/”開頭的路徑
(3)如何去寫絕對路徑
連結地址,表單提交地址,重新導向從應用程式名稱開始寫;
轉寄從應用程式名稱之後開始寫
最好寫絕對路徑
String request.getContextPatch();
來獲得實際部署時的應用程式名稱
也就是說寫絕對路徑的時候,寫 request.getContextPatch(); 就可以當應用程式名稱了。
因為有可能會改變應用程式名稱
jsp初識、servlet轉寄、轉寄與重新導向的比較