1 業務層將屬性值封裝到request內置對象,並向控制層返回一個轉向信息,控制層對返回的結果進行分析,根據結果再轉向視圖組件,視圖層通過EL表達式從scop所指內置對象中獲取屬性值,進行處理,然後通過response將結果發送到瀏覽器顯示
控制層(ELServletDemo01.Java)
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
{
req.setAttribute("name","www.MLDN.cn") ;//模擬業務層功能
// 服務器端跳轉
req.getRequestDispatcher("eldemo03.jsp").forward(req,resp) ;
}
視圖層(eldemo03.jsp)
<h1>${name}</h1>
2 持久層創建結果bean對象,將結果信息封裝到結果bean,將結果bean交給業務層,業務層將結果bean封裝到request內置對象,並向控制層返回一個轉向信息,控制層對返回的結果進行分析,根據結果再轉向視圖組件,視圖層通過EL表達式從scop所指內置對象中獲取屬性值(結果bean對象),再調用結果bean對象的對應的get()方法取得結果bean對象的屬性值,然後通過response將結果發送到瀏覽器顯示
控制層(ELServletDemo02.java)
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
{
//模擬持久層功能
Simple s = new Simple() ;
s.setName("LiXingHua") ;
//模擬業務層功能
req.setAttribute("sim",s) ;
// 服務器端跳轉
req.getRequestDispatcher("eldemo04.jsp").forward(req,resp) ;
}
視圖層(eldemo04.jsp)
<h1>${sim.name}</h1>
上述${sim.name}稱爲導航
1 如果改爲${sim11.name},找不到屬性名爲sim11的屬性值(即找不到結果bean對象)輸出” ”;
2 如果改爲${sim.name11},找得到結果bean對象,但找不到對應得方法,出現500錯誤
3 如果改爲${sim11.name11},沒有找到屬性名爲sim11的屬性值(即找不到結果bean對象),直接輸出” ”,後面不會執行
對象之間的關係
1 繼承 (is a)
2 關聯 (like a)(one to one , many to one, many to many)
原則:多用關聯,少用繼承 原因:繼承會打破對象的封裝性
舉例:many to one
創建一個Teacher類
public class Teacher {
private int tid;//工號
private String tname;//姓名
//省略get() set()方法
}
創建一個Student類
public class Student {
private int sid;//學號
private String sname;//姓名
//關聯屬性(屬性類型是自定義類型)通常放在多的一方
private Teacher teacher;
//省略get() set()方法
}
測試類
public class Test {
public static void main(String[] args) {
//創建一個Teacher對象
Teacher t = new Teacher();
t.setTname("tom");
//創建三個學生對象
Student s1 = new Student();
Student s2 = new Student();
Student s3 = new Student();
s1.setSname("zs");
s1.setTeacher(t);//裝配關係
s2.setSname("ls");
s2.setTeacher(t);//裝配關係
s3.setSname("ww");
s3.setTeacher(t);//裝配關係
s3.getTeacher().getTname();//使用關係
}
}
總結:關聯屬性由多的一方建立,由多的一方裝配,維護和使用關係
Many to many
創建一個員工bean
public class NameBean{
private String firstName ;//姓
private String lastName ;//名
//省略get() set()方法
}
創建一個公司bean
public class CompanyBean{
private String companyName ;//公司名
private String business ;//業務
//省略get() set()方法
}
創建一個僱傭關係bean
public class EmployeeBean{
//關聯屬性,和NameBean建立聯繫
private NameBean name ;
//關聯屬性,和CompanyBean建立聯繫
private CompanyBean company ;
//省略get() set()方法
}
控制層(ELServletDemo03.java)
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException
{
NameBean nb = new NameBean() ;
nb.setFirstName("Li") ;
nb.setLastName("XingHua") ;
CompanyBean cb = new CompanyBean() ;
cb.setCompanyName("www.MLDN.cn") ;
cb.setBusiness("JAVA EE、JAVA SE、JAVA ME") ;
EmployeeBean eb = new EmployeeBean() ;
eb.setName(nb) ;// 裝配關係
eb.setCompany(cb) ;// 裝配關係
// 保存屬性
req.setAttribute("emp",eb) ;
// 服務器端跳轉
req.getRequestDispatcher("eldemo05.jsp").forward(req,resp) ;
}
視圖層(eldemo05.jsp)
<h1>FirstName:${emp.name.firstName}</h1>
<h1>LastName:${emp.name.lastName}</h1>
<h1>CompanyName:${emp.company.companyName}</h1>
<h1>Business:${emp.company.business}</h1>
1 持久層創建三個結果bean對象NameBean,CompanyBean,EmployeeBean(包含兩個關聯屬性,一個屬性關聯NameBean,一個屬性關聯CompanyBean,此時建立了兩個多對一的關係,即員工和公司建立了多對多的關係)(建立關係)
2 將結果信息封裝到結果bean對象(NameBean對象封裝姓和名,CompanyBean對象封裝公司名和業務,EmployeeBean封裝了NameBean對象和CompanyBean對象)(裝配關係),將結果bean交給業務層
3 業務層將結果bean封裝到request內置對象,並向控制層返回一個轉向信息
4 控制層對返回的結果進行分析,根據結果再轉向視圖組件
5 視圖層通過EL表達式從Scop所指內置對象中找到屬性的屬性值所對應的對象(EmployeeBean對象)的關聯屬性所指對象(NameBean||NameBean)的屬性值(使用關係)
深度導航:通過內置對象找到屬性的屬性值所對應的對象的關聯屬性所指對象的屬性值
El表達式在集合中的應用
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws IOException,ServletException{
List l = new ArrayList() ;
Simple s = null ;
s = new Simple() ;
s.setName("zs") ;
l.add(s) ;
s = new Simple() ;
s.setName("ls") ;
l.add(s) ;
s = new Simple() ;
s.setName("ww") ;
l.add(s) ;
req.setAttribute("all",l) ;
// 服務器端跳轉
req.getRequestDispatcher("eldemo06.jsp").forward(req,resp) ;
}
eldemo06.jsp
<h1>${all}</h1> //輸出request內置對象中屬性名爲all的屬性值(即ArrayList對象的地址,集合覆寫了toString(),所以會輸出集合的所有元素,即各個simple對象的地址)
<h1>${all[1].name}</h1>//輸出ArrayList集合中第一個元素的屬性值name(ls)
注意:上面這種輸出方式只有List集合才能這樣輸出(Set,Map都不行)
<%
// EL表達式不能輸出集合裏面所有的元素,要使用Iterator輸出
List l = (List)request.getAttribute("all") ;
Iterator iter = l.iterator() ;
while(iter.hasNext())
{
// 將取出的對象放在page範圍之中
pageContext.setAttribute("sim",iter.next()) ;
%>
<h1>${pageScope.sim.name}</h1>
<%
}
%>