文章目錄
- 一、jsp基礎
-
- 1、jsp簡介
- 2、jsp注釋
- 3、jsp的java代碼塊
- 4、jsp的聲明語句塊
- 5、jsp的表達式語句塊
- 6、jsp内置對象
-
- 1.pageContext
- 2.out
- 7、jsp指令
-
- 1、page指令
- 2、include指令
- 8、jsp動作
-
- 1、forword動作
- 2、include動作
- 二、EL表達式(重點)
-
- 1、擷取資料
-
- 1.從四大域中查找值
- 2.從指定域擷取值
- 3.通路bean的屬性
- 4.EL通路數組
- 5.EL通路List
- 6.EL通路Map
- 2、EL中的運算符
- 3、EL内置對象
-
- 1.pageContext
- 2.param
- 3.paramValues
- 4.initParam
- 4、自定義EL函數
- 5、JSTL的EL函數庫\
- 三、自定義标簽
-
- 1.自定義标簽的基本用法
- 2.帶标簽體的标簽
- 3.帶屬性的标簽
- 4.自定義标簽周遊所有類型的集合和數組
- 四、JSTL核心标簽庫
-
- 1.五大标簽庫
- 五、javaBean
- 六、系統開發模型
-
- 1.純JSP開發
- 2.JSP+JavaBean的Model1
- 3.MVC的Model2
- 4.三層架構
- 5.MVC+三層架構
一、jsp基礎
1、jsp簡介
JSP即:Java Server pages(java 伺服器頁面),運作在服務端的頁面,是sun公司和多家大公司共同開發的一種動态網頁技術,它是在靜态的html檔案中插入java代碼段和jsp标簽形成的檔案,字尾為.jsp
當使用者第一次通路jsp頁面的時候,會由tomcat伺服器生成一個servelt檔案,使用者通路的頁面其實就是通路的這個servlet
idea下jsp通路産生的路徑C:\Users\79894.IntelliJIdea2019.3\system\tomcat_javeWeb\work\Catalina\localhost\JSP\org\apache\jsp
裡面的内容
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/8.5.65
* Generated at: 2021-04-30 06:43:43 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private static final java.util.Set<java.lang.String> _jspx_imports_packages;
private static final java.util.Set<java.lang.String> _jspx_imports_classes;
static {
_jspx_imports_packages = new java.util.HashSet<>();
_jspx_imports_packages.add("javax.servlet");
_jspx_imports_packages.add("javax.servlet.http");
_jspx_imports_packages.add("javax.servlet.jsp");
_jspx_imports_classes = null;
}
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public java.util.Set<java.lang.String> getPackageImports() {
return _jspx_imports_packages;
}
public java.util.Set<java.lang.String> getClassImports() {
return _jspx_imports_classes;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 隻允許 GET、POST 或 HEAD。Jasper 還允許 OPTIONS");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\n");
out.write("\n");
out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title>$Title$</title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write(" 這是一個jsp檔案\n");
out.write(" </body>\n");
out.write("</html>\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
2、jsp注釋
1.html注釋
2.jsp注釋
<%--這是jsp注釋,jsp注釋不顯示在前台頁面上,僅僅顯示在jsp源碼中--%>
例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
這是一個jsp檔案
<!--html注釋-->
<%--jsp注釋,僅在這個檔案下顯示--%>
</body>
</html>
前台頁面源碼:
<html>
<head>
<title>$Title$</title>
</head>
<body>f
這是一個jsp檔案
<!--html注釋-->
</body>
</html>
3、jsp的java代碼塊
文法:
<%
System.out.println("java代碼塊");
%>
注意:不可以寫方法,變量名前不可以加通路修飾符,因為這些代碼都會被插入到jsp_service()方法中
4、jsp的聲明語句塊
文法:
<%!
private int a = 0;
%>
這裡的代碼将會被插入到類中,是以可以加通路修飾符,也可以在這裡面寫方法,寫靜态代碼塊
5、jsp的表達式語句塊
文法:
<%=
表達式,可以将變量寫在這裡,然後會在浏覽器中顯示
%>
這行代碼會被插入到service方法中
6、jsp内置對象
在jsp的java代碼塊、表達式塊等可以直接使用的被成為jsp内置對象,常用的内置對象有9個
内置對象名 | 類型 |
---|---|
pageContext | javax.servlet.jsp.PageContext |
request | javax.servlet.http.HttpServletRequset |
session | javax.servlet.http.HttpSession |
application | javax.servlet.ServeltContext |
response | javax.servelt.http.HttpServletResponse |
config | javax.servelt.ServletConfig |
out | javax.servlet.jsp.JspWriter |
page | java.lang.Object |
exception | java.lang.Throwable |
1.pageContext
頁面上下文,四大域中的一個,雖然是域,但一般不用,因為作用域隻能在目前頁面有效
但是可以通過它擷取其他八個内置對象
2.out
out是JspWriter的子類,是一個輸出流,可以将資料輸出到浏覽器
7、jsp指令
jsp指令作用:為目前頁面提供一些基礎屬性設定,為目前頁面的運作體提供基礎的環境
一共有三種指令:page指令,include指令,taglib指令。這裡暫時先描述前兩種
文法:<%@ 指令名稱 屬性名=屬性值 屬性名=屬性值 …%>
1、page指令
**pageEncoding:**指定目前頁面編碼方式,如果使用這個,那麼contentType預設是text/html
contentType:可以指定text/html解析方式,與pageEncoding用一個就行
**import:**導包
<%@ page import="java.util.*"%>
<%@ page import="java.util.*,java.text.*"%>
errorPage:
頁面出錯後跳轉到指定頁面
<%@ page errorPage="error.jsp"%>
isErrorPage:
指定目前頁面為錯誤處理頁面,那麼就會顯示錯誤資訊
<%@ page isErrorPage="true"%>
ex= <%= exception.getMessage()%>
**session:**一般讀資料的時候設定成false,否則沒有讀取到的話就會建立一個新的session,占記憶體
session的使用原則:存:getSession(),取:getSession(false);有老的就用老的,沒老的也不建新的
<%@ page session="false"%>
<%
HttpSession session = request.getSession(false);
if(session!=null){
String user = (String)session.getAttribute("user");
out.print(user);
}
%>
2、include指令
<%@ include file="/test.jsp"%>
這叫做靜态聯編:編譯之前就将内容合并到了一起
作用:一個頁面可以多次使用
8、jsp動作
由于大量的使用java代碼塊,表達式塊等内容,使得頁面雜亂無章
有些公司明文規定不可以使用java代碼塊和表達式塊
推薦使用EL表達式 JSTL标簽,jsp動作
文法:
<jsp:動作名稱 屬性=屬性值 屬性=屬性值 ......></jsp:動作名稱>
或者
<jsp:動作名稱 屬性=屬性值 屬性=屬性值 ....../>
1、forword動作
不可以向标準輸出流寫入資料
<jsp:forward page="/next.jsp"/><%--會直接跳到next.jsp--%>
2、include動作
可以向标準輸出流寫入資料
<jsp:include page="/next.jsp"/><%--頁面會合并起來--%>
動态聯編:編譯的時候會生成多個servlet,不可以共享變量
推薦使用靜态聯編,因為隻會生成一個servlet,對資源的消耗比較小
二、EL表達式(重點)
定義:是一種擷取資料的簡單方式(隻能從四大域擷取)
文法:${exprition}
1、擷取資料
1.從四大域中查找值
<%
String user = "張三";
pageContext.setAttribute("user",user);
requset.setAttribute("user",user);
session.setAttribute("user",user);
application.setAttribute("user",user);
%>
user = ${user}
擷取值的時候會從四大域由小到大查找
查找資料的順序:pageContext,requset,session,application
2.從指定域擷取值
${pageScope.value}<%--指定從pageContext擷取值--%>
${requestScope.value}<%--指定從request擷取值--%>
${sessionScope.value}<%--指定從session中擷取值--%>
${applicationScope.value}<%--指定從application中擷取值--%>
3.通路bean的屬性
EL表達式如果使用為null的對象的屬性,EL是不會抛出空指針異常的,其僅僅是不顯示而已
<% page import="com.bean.*"%>
schoolName = ${student.school.schoolName}
4.EL通路數組
<%
String[] names = ["test01","test02"];
pageContext.setAttribute("names",names);
%>
names[0] = ${names[0]}
names[1] = ${names[1]}
若通路的數組下标超出了長度,EL不會抛出數組越界異常
5.EL通路List
<%
List<String> names = new ArrayList<>();//jdk8支援這樣寫
names.add("張三");
names.add("李四");
pageContext.setAttribute("names",names);
%>
names[0] = ${names[0]}
EL無法通路Set
6.EL通路Map
<%
Map<String,Object> map = new HashMap<>();
map.put("school",new School("河北科技大學","石家莊市"));
map.put("age",21);
%>
school.name = ${map.school.sname}<%--這裡會自動做一個向下轉型--%>
age = ${map.age}
2、EL中的運算符
序号 | 種類 | 運算符 |
---|---|---|
1 | 算術運算符 | + - * / % (不支援++ --) |
2 | 關系運算符 | == != > < >= <= |
3 | 邏輯運算符 | ! && || not and or |
4 | 條件運算符 | ? : |
5 | 取值運算符 | [] 點号. |
除了以上的運算符,還有一個重要的運算符 empty
用法:${empty 變量}
如果變量為空,空字元串,空的引用,空集合或者空數組,那麼就傳回true,否則傳回false
<%
String userName = "張三";
Integer age = null;
pageContext.setAttribute("userName",userName);
pageContext.setAttribute("age",age);
%>
userName = ${userName}<br>
age = ${(empty age)?"暫無資料":age}
3、EL内置對象
上面從指定域擷取資料用到了四個,下面介紹一些其他常用的
1.pageContext
對于這個對象,用的最多的地方就是
<form action="${pageContext.request.contextPath}/registerServlet" method="GET">
</form>
${pageContext.request.contextPath} 擷取目前網站路徑
2.param
擷取請求中的指定參數值,其底層調用的是request.getParamter()
可用于頁面之間傳值
姓名:${param.userName}
3.paramValues
擷取多個值用paramValues ,其底層調用的是requset.getParamterValues()
愛好:${empty paramValues.hobby[0]?"":paramValues.hobby[0]}<br>
愛好:${empty paramValues.hobby[1]?"":paramValues.hobby[1]}<br>
愛好:${empty paramValues.hobby[2]?"":paramValues.hobby[2]}<br>
4.initParam
web.xml
<context-param>
<param-name>company1</param-name>
<param-value>aaa</param-value>
</context-param>
<context-param>
<param-name>company2</param-name>
<param-value>bbb</param-value>
</context-param>
擷取初始化參數
${initParam.company1}
${initParam.company2}
其底層調用的是servletContext.getInitParamter()
4、自定義EL函數
注意:EL表達式不支援字元串的拼接
例子:
實作字元串小寫變大寫
步驟:
1.建立一個自定義的方法
package com.fjh.test01;
public class ElFunction {
//将字元串小寫變大寫
public static String lowerToUpper(String source){
return source.toUpperCase();
}
}
2.需要在在一個拓展名為.tld的xml檔案中進行注冊
tld tag library definition 标簽庫定義
xml檔案是需要限制的,需要配置檔案的頭部,這個頭部可以在tomcat中進行複制
在tomcat安裝路徑下E:\program\apache-tomcat-8.5.65\webapps\examples\WEB-INF\jsp2
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>my</short-name>
<uri>http://mycompany.com</uri>
<!-- Invoke 'Generate' action to add tags or functions -->
<!-- 注冊函數-->
<function>
<name>lowerToUpper</name>
<function-class>com.fjh.test01.ElFunction</function-class>
<function-signature>java.lang.String lowerToUpper(java.lang.String)</function-signature>
</function>
</taglib>
3.使用函數
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://mycompany.com" prefix="my"%>
<html>
<head>
<title>index</title>
</head>
<body>
${my:lowerToUpper("ABC")}
</body>
</html>
5、JSTL的EL函數庫\
JSTL:jsp Standard tag library 這是Apache定義好的一套标準的标簽庫規範
需要引入jar包 jstl.jar和standard.jar
三、自定義标簽
1.自定義标簽的基本用法
步驟
1.定義一個類實作 javax.servlet.jsp.tagext.SimpleTag 這個類成為标簽處理器類
package com.fjh.test02;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
public class GetIp extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//擷取pageContext對象
PageContext pc = (PageContext) this.getJspContext();
//擷取請求對象
ServletRequest request = pc.getRequest();
//擷取用戶端ip
String ip = request.getRemoteAddr();
pc.getOut().print(ip);
}
}
2.注冊
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>myTag</short-name>
<uri>http://my.com</uri>
<!-- Invoke 'Generate' action to add tags or functions -->
<tag>
<name>getIp</name>
<tag-class>com.fjh.test02.GetIp</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
3.使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://my.com" prefix="myTag"%>
<html>
<head>
<title>index</title>
</head>
<body>
<myTag:getIp/>
</body>
</html>
2.帶标簽體的标簽
步驟
1定義标簽處理器
public class TagTest01 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//StringWriter可以擷取流中的内容
StringWriter sw = new StringWriter();
//擷取标簽體内容
JspFragment jspBody = this.getJspBody();
//擷取标準輸出流
JspWriter out = this.getJspContext().getOut();
//将标簽體内容寫入到流中
jspBody.invoke(sw);
//擷取流中的内容
String content = sw.toString().toUpperCase();
//将内容用标準輸出流顯示在頁面上
out.print(content);
}
}
2注冊标簽
<tag>
<name>show</name>
<tag-class>com.fjh.test02.TagTest01</tag-class>
<!--
empty:表示目前沒有标簽體
scriptless:表示有标簽體,但是該标簽體不會出現java代碼塊,jsp表達式,但是可以出現EL表達式
jsp:已經棄用,具有标簽體,會将标簽體内容原樣顯示在浏覽器
tagdependent:表示目前标簽具有标簽體,将标簽内容原樣顯示在浏覽器中,但是不會對EL表達式進行計算
-->
<body-content>scriptless</body-content>
</tag>
3使用标簽
<%
pageContext.setAttribute("content","zhangsan");
%>
<myTag:show>${content}</myTag:show>
3.帶屬性的标簽
1.定義标簽處理器類
public class TagTest02 extends SimpleTagSupport {
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if (test) {
// //擷取标簽體
// JspFragment jf = this.getJspBody();
// //将标簽體寫入到标準輸出流
// jf.invoke(this.getJspContext().getOut());
this.getJspBody().invoke(null);
//這一句等價于上面,參數為空的時候自動會有一個标準的輸出流
}
}
}
2.注冊
<!-- 帶屬性的标簽-->
<tag>
<name>if</name>
<tag-class>com.fjh.test02.TagTest02</tag-class>
<body-content>tagdependent</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<!--
runtime expression value
若為true 則屬性支援EL和jsp表達式
-->
</attribute>
</tag>
3.使用
<%
pageContext.setAttribute("gender",true);
%>
<myTag:if test="${gender}">男</myTag:if>
<myTag:if test="${not gender}">女</myTag:if>
4.自定義标簽周遊所有類型的集合和數組
1.标簽處理器
package com.fjh.test02;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.*;
public class ForEach extends SimpleTagSupport {
private Object items;
private String var;
public void setItems(Object items) {
this.items = items;
}
public void setVar(String var) {
this.var = var;
}
//可以處理任何集合或者數組
public Collection getColl(){
if(items instanceof List){
return (List)items;
}else if(items instanceof Set){
return (Set)items;
}else if(items instanceof Map){
return ((Map) items).entrySet();
}else if(items.getClass().isArray()){
List nums = new ArrayList();
for(int i = 0;i< Array.getLength(items);i++){
nums.add(Array.get(items,i));
}
return nums;
}
return null;
}
@Override
public void doTag() throws JspException, IOException {
for(Object obj:getColl()){
this.getJspContext().setAttribute(var,obj);
this.getJspBody().invoke(null);
}
}
}
2.注冊
<tag>
<name>forEach</name>
<tag-class>com.fjh.test02.ForEach</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
3.使用
----------周遊List------------
<br>
<%
List users = new ArrayList();
users.add("張三");
users.add("李四");
users.add("王五");
pageContext.setAttribute("users",users);
%>
<myTag:forEach items="${users}" var="user">
${user}<br>
</myTag:forEach>
----------周遊Set------------
<br>
<%
Set set = new HashSet();
set.add("張三");
set.add("李四");
set.add("王五");
pageContext.setAttribute("set",set);
%>
<myTag:forEach items="${set}" var="s">
${s}<br>
</myTag:forEach>
----------周遊Map------------
<br>
<%
Map map = new HashMap();
map.put("name","123");
map.put("age",12);
pageContext.setAttribute("map",map);
%>
<myTag:forEach items="${map}" var="m">
${m}<br>
</myTag:forEach>
----------周遊數組------------
<br>
<%
int[] age = {12,13,14};
pageContext.setAttribute("age",age);
%>
<myTag:forEach items="${age}" var="a">
${a}<br>
</myTag:forEach>
4.結果
----------周遊List------------
張三
李四
王五
----------周遊Set------------
李四
張三
王五
----------周遊Map------------
name=123
age=12
----------周遊數組------------
12
13
14
四、JSTL核心标簽庫
1.五大标簽庫
核心标簽庫:完成基本的邏輯運算,重點
格式化标簽庫:主要用于日期和數字的格式化
EL函數标簽庫:定義了若幹EL函數
SQL函數标簽庫:完成SQL操作,不使用了,現在使用java代碼完成
XML操作标簽庫:完成XML操作,不使用了,現在使用java代碼完成
最近時間比較緊,而且jsp程式設計用的不是很多了,是以後面的就省略了
放個連結,可以看看
click這兒
五、javaBean
分類
廣義javaBean
資料承載bean
業務處理bean
狹義javaBean
狹義的javaBean是指符合sun公司提出的javaBean規範的java類,javaBean規範規定,滿足以下四點的java類稱為javaBean
1.該類需要時公共的
2.該類需要實作Serilizable接口
3.該類需要具備無參構造器
4.該類有成員變量,這些成員變量必須是私有的,且需要提供這些屬性的setter和getter方法
在實際項目中,實體類一般會被定義為狹義的javaBean,即廣義的javaBean的資料承載Bean一般會被定義為滿足JavaBean規範的狹義javaBean
六、系統開發模型
1.純JSP開發
2.JSP+JavaBean的Model1
3.MVC的Model2
MVC,即mode模型,View視圖,Controller控制器
View:視圖,為使用者提供界面,與使用者進行互動.
Model:模型,承載資料,并對使用者送出的請求進行計算的子產品,其分為兩類,一類稱為資料承載Bean,一類稱為業務處理Bean.所謂的資料承載Bean是指實體類,專門用于承載業務資料的,而業務處理Bean則書指Serbice或者Dao對象,專門用于處理使用者送出的請求的.
Controller:控制器,使用者将使用者請求轉發給相應的Model處理,指Servlet
4.三層架構
三層架構是指:視圖層View,服務層Service,持久層Dao,它們分别完成不同的功能
View層:表現層,視圖層,對于Web開發,也稱為Web層,用于接收使用者送出的代碼
Service層:服務層,邏輯層,系統的業務邏輯主要在這裡完成
Dao層,持久層,資料通路層,直接操作資料庫的代碼在這裡編寫DAO即Data Access Object,資料通路對象
為了更好的降低各層之間的耦合度,在三層架構的設計中,采用面向抽象程式設計,即上層對下層調用是通過接口實作的,而下層對上層是真正的服務提供者,是下層接口的實作類.
5.MVC+三層架構
注意:MVC和三層架構是不同的不要混淆