表达式语言的语法
EL表达式以 ${ 开头并以 }结束。如下:
${expression} ,${x+y}
它也常用来连接两个表达式。对于一系列的表达式,它们的取值将是从左到右进行,计算结果的类型为String,并且连接在一起。
${2+6}${5+5} //810
[] 和 . 运算符
EL表达式可以返回任意类型的值,如果EL表达式的结果是一个带有属性的对象,则可以利用 [] 或者 . 运算符来访问该属性。" [ ] " 和 " . " 运算符类型;" [ ] " 是比较规范的形式," . "运算符则比较快捷。
为了访问对象的属性,可以使用一下任意一种形式:
${object["propertyName"]}
${object.propertyName}
但是如果propertyName不是有效的Java变量名,只能使用 [] 运算符。如:
${header["host"]} ✔
${header.host} ✔
${header["accept-language"]} ✔
${header.accept-language} ✖ 因为accept-language不是有效的java变量名
如果访问对象属性的属性则可以继续:
${object["a"]["b"]}
${object.a.b}
取值规则
EL表达式的取值是从左到右进行的。对于expr-a[ expr-b ] 形式的表达式,其EL表达式的取值方法如下:
1.先计算expr-a 得到value-a
2.如果value-a为null,则返回null
3.然后计算expr-b得到value-b
4.如果value-b为null,则返回null
访问JavaBean
利用 " . "或 " [] " 运算符,都可以访问bean属性。
EL隐式对象
在JSP页面中,可以利用JSP脚本来访问JSP隐式对象。但是,在免脚本的JSP页面中,则不可能访问这些隐式对象。EL允许通过一组它自己的隐式对象来访问不同的对象。
对象 | 描述 |
---|---|
pageContext | 这是当前JSP的avax.servlet.jsp.PageContext |
initParam | 用于获取上下文参数的值。 |
param | 用于获取请求参数的值。 |
paramValues | 可以获取一个请求参数的多个值。(当key对应的value是数组时,${ paramValues.selected[0] }) |
header | 表示一个包含所有请求标题的Map。 |
cookie | 可以用来获取一个cookie。(${ cookie.jsessionid.value }) |
applicationScope | 包含了ServletContext对象中所有属性的Map。 |
sessionScope | 包含了HttpSession对象中所有属性的Map |
requestScope | 包含了当前HttpservletRequest对象中所有的属性的Map。 |
pageScope | 包含了全页面范围内的所有属性的Map |
其他EL运算符
+,- ,* ,/(div) , %(mod) ,&&(and) , || (or) , ! (not) , == (eq) , != (ne) ,>(gt) , >=(ge) , <(lt) ,<= (le) , empty x(检验x是否为空)
应用:
Employee类:
public class Employee2 {
private int id;
private String name;
private Address address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
EmployeeServlet类:
@WebServlet(name = "EmployeeServlet",urlPatterns = "/employee")
public class EmployeeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Address address = new Address();
address.setCity("jinan");
address.setCounty("China");
Employee2 employee2 = new Employee2();
employee2.setAddress(address);
employee2.setId(2018);
employee2.setName("Veng");
request.setAttribute("employee",employee2);
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/employee.jsp");
requestDispatcher.forward(request,response);
}
}
employee.jsp
<html>
<head>
<title>Title</title>
</head>
<body>
employee: ${requestScope["employee"]["name"]} , ${employee["address"]["city"]}
</body>
</html>
禁用脚本
实现免脚本的JSP页面
为了关闭JSP页面的脚本元素,要使用到jsp-property-group 元素以及url-pattern 和scripting-invalid 两个子元素。url-pattern元素定义禁用脚本要应用的URL样式(即禁用哪个jsp页面)。
例(将一个应用程序中所有的JSP页面的脚本关闭):
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
注意:在部署描述符中只能有一个jsp-config元素。如果已经为禁用EL而定义了一个jsp-property-group,就必须在同一个jsp-config元素下,为禁用脚本而编写jsp-property-group.
禁用EL计算
-
可以用page指令的isELIgnored属性设置为true。
<%@page isELIgnored="true" %>
-
可以在部署描述符中使用jsp-property-group元素。其中还必须有url-pattren 和 el-ignored 两个子元素。
<jsp-config> <jsp-property-group> <url-pattern>employee.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </jsp-config>