表达式语言 ------ 在MVC中应用表达式语言
在之前讲解的MVC设计模式之中一直都有DAO 的存在,而且所有的对象都保存在VO 之中。那么这个时候如果将一个VO
传递到了JSP 文件中的话,则必须在JSP之中导入VO包,而如果现在使用了表达式语言的话,这个包导入就没用任何意义了。
package org.gz.el.vo;
public class Dept {
private int deptno;
private String dname;
private String loc;
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public void setDname(String dname) {
this.dname = dname;
}
public void setLoc(String loc) {
this.loc = loc;
}
//
public int getDeptno() {
return this.deptno;
}
public String getDname() {
return this.dname;
}
public String getLoc() {
return this.loc;
}
}
//为了更好的理解,下面先在JSP中直接使用一下
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="org.gz.le.vo.*"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
// 现在假设 这些代码是由Servlet 完成
Detp dept = new Dept();
dept.setDeptno(8);
dept.setDname("雪花神剑");
dept.setLoc("华山");
request.setAttribute("deptinfo",dept);
%>
<h3>部门编号: ${deptinfo.deptno}</h3>
<h3>部门名称: ${deptinfo.dname}</h3>
<h3>部门位置:${deptinfo.loc}</h3>
</body>
</html>
在JSP 文件之中并没用调用任何的getter() 方法就完成了输出,不用讲现在肯定还是依靠反射机制完成的。
但是,如果要想让这个程序发挥最好的效果,则一定要使用MVC
package org.gz.el.vo;
public class Dept {
private int deptno;
private String dname;
private String loc;
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public void setDname(String dname) {
this.dname = dname;
}
public void setLoc(String loc) {
this.loc = loc;
}
//
public int getDeptno() {
return this.deptno;
}
public String getDname() {
return this.dname;
}
public String getLoc() {
return this.loc;
}
}
package org.gz.el.servlet;
import org.gz.el.vo.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ElServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws java.io.IOException,ServletException {
Dept dept = new Dept();
dept.setDeptno(8);
dept.setDname("雪花神剑");
dept.setLoc("华山");
request.setAttribute("deptinfo",dept);
request.getRequestDispatcher("dept_info.jsp").forward(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws java.io.IOException,ServletException {
doGet(request,response);
}
}
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
pageContext.setAttribute("info","page属性范围");
request.setAttribute("info","request属性范围");
session.setAttribute("info","session属性范围");
application.setAttribute("info","application属性范围"); //getServletContext()
%>
<h3>${info}</h3>
</body>
</html>
<servlet>
<servlet-name>elservlet</servlet-name>
<servlet-class>org.gz.el.servlet.ElServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>elservlet</servlet-name>
<url-pattern>/eldemo/ElServlet</url-pattern>
</servlet-mapping>
package org.gz.el.vo;
public class Dept {
private int deptno;
private String dname;
private String loc;
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public void setDname(String dname) {
this.dname = dname;
}
public void setLoc(String loc) {
this.loc = loc;
}
public int getDeptno() {
return this.deptno;
}
public String getDname() {
return this.dname;
}
public String getLoc() {
return this.loc;
}
}
package org.gz.el.servlet;
import org.gz.el.vo.*;
import javax.servlet.*;
import javax.servlet.http.*;
// org.gz.el.servlet.ElServlet
public class ElServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws java.io.IOException,ServletException {
//HttpSession session = request.getSession();
Dept dept = new Dept();
dept.setDeptno(1);
dept.setDname("独孤求败");
dept.setLoc("火星");
request.setAttribute("info",dept);
request.getRequestDispatcher("deptinfo.jsp").forward(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws java.io.IOException,ServletException {
doGet(request,response);
}
}
<servlet>
<servlet-name>el</servlet-name>
<servlet-class>org.gz.el.servlet.ElServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>el</servlet-name>
<url-pattern>/eldemo/ElServlet</url-pattern>
</servlet-mapping>
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<h3>部门编号: ${info.deptno}</h3>
<h3>部门名称: ${info.dname}</h3>
<h3>部门位置:${info.loc}</h3>
</body>
</html>
http://localhost:8080/demo/eldemo/ElServlet 路径一定要按照web.xml里面url走
可是在这里面还有一个问题,如果现在传递的到JSP 文件中的是 一个集合呢?
只是集合不管在何种情况下都要通过Iterator 输出,这是一个绝对的真理,可是现在是要通过EL 完成输出,而且EL 只能操作属性范围 所以
将集合通过Iterator 找到每一个,之后将每一个对象放在page 属性范围之中,再通过EL找到
在一个JSP 文件之中唯一允许导入的包就是java.util 包
现在充分发挥JSP 的特点: 接收、判断、输出。
集合永远是Iterator 而表达式永远只能操作一个属性范围
package org.gz.el.vo;
public class Dept {
private int deptno;
private String dname;
private String loc;
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public void setDname(String dname) {
this.dname = dname;
}
public void setLoc(String loc) {
this.loc = loc;
}
public int getDeptno() {
return this.deptno;
}
public String getDname() {
return this.dname;
}
public String getLoc() {
return this.loc;
}
}
package org.gz.el.servletlist;
import org.gz.el.vo.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
// org.gz.el.servletlist.ElListServlet
public class ElListServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws java.io.IOException,ServletException {
//HttpSession session = request.getSession();
List<Dept> list = new ArrayList<Dept>();
Dept dept = null;
dept = new Dept();
dept.setDeptno(1);
dept.setDname("独孤求败");
dept.setLoc("火星");
list.add(dept);
dept = new Dept();
dept.setDeptno(2);
dept.setDname("大刀王五");
dept.setLoc("太平洋");
list.add(dept);
request.setAttribute("infolist",list);
request.getRequestDispatcher("dept_list.jsp").forward(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws java.io.IOException,ServletException {
doGet(request,response);
}
}
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
List all = (List)request.getAttribute("infolist");
if(all != null) {
%>
<table border="1" width="90%">
<tr>
<td>部门编号</td>
<td>部门名称</td>
<td>部门位置</td>
</tr>
<%
Iterator iter = all.iterator();
while(iter.hasNext()) {
pageContext.setAttribute("dept",iter.next()); //通过pageContext 对象保存在当前的页面之中 (属性标记保存)
%>
<tr>
<td>${dept.deptno}</td>
<td>${dept.dname}</td>
<td>${dept.loc}</td>
</tr>
<%
}
%>
</table>
<%
}
%>
</body>
</html>
表达式语言可以方便的进行对象属性的输出
通过表达式语言输出集合时,需要使用page属性范围完成
表达式结合MVC设计模式将发挥更大的作用
掌握表达式各种运输符的使用。
在这之中需要重点掌握的就是三目运算符的使用
运算符
在表达式语言中为了方便用户的显示操作定义了许多数学运算符、关系运算符、逻辑运算符等,使用这些运算符将使得JSP页面更加简洁,但是对于复杂的操作还是应该在Servlet 或JavaBean 中完成,在使用这些运输符的时候,所有的操作内容也可以直接使用设置的属性,而不用考虑转型的问题。
一定要掌握好JSP 的主要作用,JSP 就是负责显示的,而所有的复杂的业务操作都应交给Servlet 完成
唯一的好处是可以直接使用属性名称完成操作
在jdk1.5 之后,增加了自动装箱操作,所有的数字会自动变成Integer对象 例如:pageContext.setAttribute("num",33);
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
pageContext.setAttribute("num1",10);
pageContext.setAttribute("num2",20);
%>
<h3>加法操作:${num1 + num2}</h3>
<h3>减法操作:${num1 - num2}</h3>
<h3>乘法操作: ${num1 * num2}</h3>
<h3>除法操作: ${num1 / num2} 和 ${num1 div num2}</h3>
<h3>取模操作:${num1 % num2} 和 ${num1 mod num2}</h3>
</body>
</html>
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
pageContext.setAttribute("num1",10);
pageContext.setAttribute("num2",20);
%>
<h3>等于判断:${num1 == num2} 和 ${num1 eq num2}</h3>
<h3>不等判断:${num1 != num2} 和 ${num1 ne num2}</h3>
<h3>小于判断:${num1 < num2} 和 ${num1 lt num2}</h3>
<h3>大于判断:${num1 > num2} 和 ${num1 gt num2}</h3>
<h3>小于等于判断:${num1 <= num2} 和 ${num1 le num2}</h3>
<h3>大于等于判断:${num1 >= num2} 和 ${num1 ge num2}</h3>
</body>
</html>
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
pageContext.setAttribute("flagA",true);
pageContext.setAttribute("flagB",false);
%>
<h3>与操作: ${flagA && flagB} 和 ${flagA and flagB} </h3>
<h3>或操作: ${flagA || flagB} 和 ${flagA or flagB} </h3>
<h3>非操作: ${!flagA} 和 ${not flagA} </h3>
<h3>非操作: ${!flagB} 和 ${not flagB} </h3>
</body>
</html>
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
pageContext.setAttribute("num1",10);
pageContext.setAttribute("num2",20);
pageContext.setAttribute("num3",30);
%>
<h3>empty操作: ${empty info}</h3>
<h3>三目操作: ${num1 > num2 ? "大于" : "小于"}</h3>
<h3>括号操作: ${num1*(num2 + num3)}</h3>
</body>
</html>
小结:
使用表达式中的运算可以方便完成各种运算操作,从而避免使用转型所代码的麻烦
可以发现根本就不再考虑类型问题了