6,不管是html還是jsp,其實都是在伺服器端的,差別是:用戶端通路時,html直接傳給用戶端,jsp需要先轉換為Serlvet,然後Servlet運作結果傳回給用戶端。當然其實我們都不用管,會用就行
好,貓哥整理邏輯之後,果然更亂了。其實不是貓哥整理的亂,而是因為JSP和Servlet能力太強,是以有時候啊,得有個上司給他們分分工,設定下各自的職責和目标,激發他們最大的能力。所謂的上司,當然是程式設計世界的上帝——程式猿和美麗的程式媛啦——哎哎,那誰誰,看到程式媛,眼都直了。
OK,按照業内比較流行的做法,就是JSP負責顯示的外觀和顯示的具體内容,Servlet負責根據需求提供擷取的内容冰處理業務邏輯。在這個過程中,涉及從前台網頁送出資料到Servlet,這個問題已做了詳細說明,此處不表。還涉及一個從Servlet将資料傳回給網頁顯示的問題,這個問題有以下處理方案:
方案1,Servlet處理後,跳轉到HTML頁面,因為HTML頁面是靜态的,是以無法實作輸出動态結果的功能。比如就無法輸出不同班級不同的學生清單。
方案2,Servlet處理後,使用out.print()輸出處理結果。這個方法可行,但是輸出的内容混雜着許多html标簽,導緻前端後端完全無法分離。
方案3,Servlet處理後,跳轉到JSP頁面,方法可行。但是需要将資料(比如學生清單)從Servlet傳遞到JSP頁面。
1
2
3
綜合方案1-3,方案3如果實作的好,可以在最大程度上實作前後端分離,邏輯清晰,是以方案3得到了大家的喜愛。同時大家完全不必擔心方案3中的資料傳輸問題,Servlet/JSP提供了内置對象 這樣的逆天神器——其實就是封裝好的對象,非常棒的解決了這個問題。
OK,本篇我們隻講最最常用的四個内置對象response、out、request、session。
先來看個例子
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {//response封裝了用戶端響應模型
//request封裝了用戶端請求的資訊
PrintWriter out = response.getWriter();//out用于輸出
4
我們知道,網頁送出請求到伺服器,然後伺服器響應請求輸出結果。這個過程從根本上講是資料包的傳遞,再根本上講是電壓等實體信号的傳遞。然而我們不管,在Servlet和JSP世界,這些信号被封裝到了request和response對象中。也就是說,request對象中包含着用戶端請求的資訊,而response代表着服務端對用戶端響應的資訊,通過它哥倆,程式員就能非常友善擷取、操作輸入輸出(請求響應)。
然後out對象呢,其實就是response的一個小弟,response對象封裝的是對用戶端的各種響應,最常見的就是輸出(當然不止輸出,還有網頁跳轉什麼的也算響應)。是以out也成了一個内置對象。
上面的例子是在Servlet中使用response、out、request,在JSP中更加簡單,看例子
<body>
該班的學生有:<br/>
<%
response.setContentType("text/html");//設定輸入格式
response.setContentType("text/html");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String classId=request.getParameter("class");//擷取要查詢的班級id
StudentOperation stuOper=new StudentOperation();
List students=stuOper.selectByClassId(classId);
for(Object obj:students){
StudentInfo stu=(StudentInfo)obj;
out.print("姓名:"+stu.getStudentName()+" ");
out.print("班級:"+stu.getStudentClass().getClassName());
%>
<br/>
<%
}
%>
</body>
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
可見,這三個對象是可以在JSP中直接不打招呼拿來用的,那叫一個友善,是以才叫内置對象嗎。内置的意思,不用在置辦了,咱JSP天生就有!
OK,是以從Servlet向JSP傳值,變得如此簡單:
Servlet端: request.setAttribute("name", "張三");
JSP擷取: request.getAttribute("name");
attributte的意思是“屬性”,request.setAttribute("name", "張三");的意思是在request這個内置對象添加一個叫name的屬性,屬性值是張三。request.getAttribute("name");的意思是從request這個内置對象中擷取名字是name的屬性的值。
OK,還有一個session,這個才是難點。
session也有setAttribute和getAttribute方法,同樣可以從Servlet向JSP傳值。
那有request就夠了,還要session幹嘛?session具備非常重要的意義,request代表一次請求,而session代表一次會話,所謂回話的意思就是一個客戶在使用一個浏覽器用戶端通路伺服器期間,session在此期間生存在唯一。簡單點,session有點像為每個使用者配置設定的靜态對象,開始通路時生成,關閉浏覽器時銷毀。這個可能不好了解,暫時先會用request傳值就行了,session在具體實踐中再講。