1.MVC模式
- Model-View-Controller
- 模型-視圖-控制器
- Model(模型)
> 模型分為業務模型,和數據模型
> 模型負責處理業務邏輯以及和數據庫進行交互
> Service和DAO
- View(視圖)
> 視圖用來渲染模型,將模型以頁面的形式展現給用戶
> JSP
- Controller(控制器)
> 負責接收請求,調用模型處理請求,然后選擇視圖渲染模型
> Servlet
三層架構
表示層
JSP+Servlet
業務邏輯層
Service
持久化層
DAO
MVC和三層架構都是為了軟件的層與層之間的解耦,其實我們日常開發的項目的實際上是綜合了三層架構和MVC兩種形式。
表示層:
HTML擅長顯示一個靜態的網頁,HTML並不能運行Java程序
Servlet擅長調用Java程序,但是不擅長顯示一個網頁
HTML+Servlet=JSP
1.JSP
[1] 簡介
> Java Server Pages
> Java的服務器頁面
> JSP是需要運行在服務器中,不能脫離服務器運行
> JSP的本質就是一個Servlet
> JSP就是一個披着HTML皮的Servlet
[2] 運行原理
> 我們在訪問JSP時,服務器會先將JSP翻譯為一個Servlet,然后再去調用Servlet去處理請求
> jsp文件 --翻譯--> java文件 --編譯--> class
> 服務器翻譯過的java文件,和編譯好的class文件都會放到Tomcat服務器的work目錄下
> 被服務器翻譯生成java文件,該類已經繼承HttpJspBase
而HttpJspBase又繼承HttpServlet。
而在總的web.xml文件中又發現JSP對應Servlet的配置信息
由此證明,JSP就是一個Servlet。
[3] 基本語法
> 模板元素
- 模板元素就是JSP中HTML代碼
- 模板元素中的內容會作為out.write()的參數輸出到頁面中來
- 所以我們可以像編寫一個HTML網頁一樣,在JSP中編寫HTML代碼
> 腳本片段
- <% %>
- 在腳本片段可以直接編寫Java代碼
- 腳本片段中內容會原封不動的復制到JSP對應Java文件的的service方法中的指定位置
- 所以在service()方法中可以寫什么,在腳本片段中就可以寫什么
- 在JSP頁面中可以編寫多個腳本片段,但是多個腳本片段之間要保證結構完整
> 表達式
- <%= %>
- 表達式可以用來將一個對象輸出到頁面中
- 表達式中的內容,會作為out.print()的參數,最終輸出到頁面
- 所以out.print()可以接收什么參數,則表達式中就可以些什么
- 而該方法可以接收Object類型的參數,所以表達式可以傳遞任意的Java對象
> 注釋
- <%-- --%>
- JSP注釋中的內容將不會被翻譯到java文件中,只能在jsp頁面中看見
- JSP中一共可以使用三種注釋:
1.jsp注釋 <%-- --%>
2.HTML注釋 <!-- -->
3.Java注釋 // /**/ java注釋只能在腳本片段寫
> 聲明
- <%! %>
- JSP聲明中的內容將會被寫入到JSP對應的java類中
- 所以在類中可以寫什么,在聲明中就可以寫什么
- 但是這個沒什么用
[4] JSP指令
> JSP指令用來告訴JSP引擎,如何來翻譯我們的JSP文件
> JSP指令一共有三個:page include taglib
> 格式:<%@ 指令名 屬性名1=”屬性值1” 屬性名2=”屬性值2” %>
- page指令
- import:用來導包的
- errorPage:當頁面出現異常時轉發到的頁面
- isErrorPage:當前頁面是否是一個錯誤頁面,需要一個布爾值,默認是false
如果設置為true,則可以在頁面中使用exception對象
- isELIgnored:是否忽略EL表達式,需要布爾值,默認值是false,不忽略,一般不動
- session:頁面中是否可以直接使用session對象,需要一個布爾值,默認值為true,可以使用。一般不動
- contentType:設置響應內容及編碼,實際上就是設置Content-Type這個響應頭的
- pageEncoding:當前JSP頁面使用的編碼,jsp引擎需要根據該編碼去解析JSP文件
- language:jsp將被翻譯成的語言,默認值是java,可選值java
- extends:指定jsp翻譯為java文件要繼承的父類
- info:設置JSP的信息
- include指令
- <%@ include file="/include/2.jsp" %>
- include指令用來將一個頁面包含進另一個頁面
- include指令是靜態包含,使用該指令相當於將另一個頁面,
原封不動的復制到當前頁面的指定位置
- 使用靜態包含,只會翻譯當前頁面,而不會翻譯被包含頁面
[5] JSP動作標簽
> 格式:<jsp:標簽名 屬性名="屬性值"></jsp:標簽名>
- 原理:
JSP動作標簽,最終在java文件中,都會被轉換成java代碼
- 標簽就是以標簽的形式,去調用Java代碼
- <jsp:forward page="/index.jsp">
<jsp:param value="zhubajie" name="username"/>
</jsp:forward>
用來做請求的轉發,我們還可以通過forward標簽內部使用param標簽,為轉發附加請求參數
- <jsp:include page="/include2/2.jsp"></jsp:include>
作用:將一個頁面包含進另一個頁面
jsp:include和include指令不同,include指令是靜態包含,而jsp:include是動態包含
它會同時將當前頁面和被包含頁面都翻譯為java文件
它是通過這行代碼來包含另一個頁面:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/include2/2.jsp", out, false);
[6] 隱含對象
> 隱含對象指的是可以直接在JSP中使用的對象
> JSP中一共有九大隱含對象,這九個對象都可以在JSP中直接使用
> 在JSP對應的Servlet中以及對這個九個變量進行聲明並賦值
> 九個隱含對象中有四個是域對象
> 九大隱含對象有:
1.pageContext
類型:PageContext
作用:通過pageContext可以獲取到頁面中的其他隱含對象
2.request
類型:HttpServletRequest
3.session
類型:HttpSession
4.application
類型:ServletContext
5.response
類型:HttpServletResponse
作用:代表服務器發送給瀏覽器的響應報文
和Servlet中的response一樣,但是在JSP中這個對象不太常用
6.out
類型:JspWriter
作用:通過out對象向瀏覽器輸出一個內容
7.config
類型:ServletConfig
作用:代表當前JSP的配置信息,基本不用
8.page
類型:Object
作用:在JSP對應的Java文件中有這么一行代碼:Object page = this;
page代表的當前對象,不咋用
9.exception
類型:Throwable
作用:代表頁面中的異常信息,可以通過該對象獲取到頁面中的異常
[7] 域對象
> 域指區域,地區,范圍,在WEB項目中同樣也存在很多不同的區域:
不同的JSP頁面、不同Servlet。總之,不同的WEB資源就是一個一個不同的區域。
> 域對象的主要作用就是在不同的WEB資源之間共享數據。
> JavaWeb中一共有四個域對象pageContext、request、session、application
> 在JSP中可以獲取到全部四個域對象,而在Servlet中只能獲取三個,獲取不到pageContext
> 所有的域對象的內部,都維護着一個Map,這個Map用來保存屬性
> 域對象共有的3個方法:
void setAttribute(String name , Object value) --> 以指定的屬性名在域對象中保存一個屬性
Object getAttribute(String name) --> 根據屬性名從域中獲取一個屬性值
void removeAttribute(String name) --> 從域中移除一個指定的屬性
- pageContext
- 類型:PageContext
- 作用:當前頁面
代表page域的域對象,作用范圍就是當前頁面
一旦切換頁面,則域中的屬性全部丟失
該域對象主要在標簽中使用
- request
- 類型:HttpServletRequest
- 作用:當前請求
代表的是request域的域對象,作用范圍時當前請求
一旦發送多個請求,則域中的屬性會全部丟失
注意:request域中的屬性在轉發時有效
重定向時request域中屬性會全部丟失
- session
- 類型:HttpSession
- 作用:當前會話,會話指一次打開瀏覽器到關閉瀏覽器的過程
代表的是session域的域對象,一旦結束會話(關閉瀏覽器),
則session域中屬性全部丟失
- application
- 類型:ServletContext
- 作用:當前應用,只要服務器不停application中的屬性一直都在
application域
[7] JSP和Servlet的分工:
> JSP本質就是一個Servlet,所以Servlet能干的事JSP全行。
> 所以有一段時間人們已經將Servlet完全拋棄了,
於是我們的項目中全都變成了JSP,一個項目可能會有成百上千JSP。
> 但是經過長時間的實踐發現,雖然JSP可以去調用java代碼,
但是當jsp中的java代碼過多,jsp會變得非常不好維護,
所以人們又想起了被冷落已久的Servlet。
> Servlet和JSP實際上是各有優勢:
Servlet擅長調用Java代碼,不擅長顯示一個頁面
JSP擅長顯示一個動態頁面,但是不擅長編寫大量的java代碼
> 分工:
1.Servlet負責調用后台程序處理用戶請求
2.JSP負責顯示動態頁面
> 域對象使用原則:
能用小的就不用大的
轉載請注明出處!
http://www.cnblogs.com/libingbin/
感謝您的閱讀。如果文章對您有用,那么請輕輕點個贊,以資鼓勵。