EL 蛮强大的啊 可以直接输出某些东西,如果要知道底层 你自己去看编译后的源码即可。
EL表达式内置对象
同JSP类似,在EL表达式中也有一些内置对象,共11个:
- pageContext
- pageScope
- requestScope
- sessionScope
- applicationScope
- cookie
- param
- paramValues
- header
- headerValues
- initParam
上面红色表示的 我们已经介绍过了,也用过了:
经过一系列查找和求知,知道了 :
page 和 pagescope 和 pagecontext 三个区别:
page是当前jsp页面也就是jsp转换后的servlet类实例(this)。
pagescope即当前页面的域,也就是pagecontext对于的域
pagecontext当前页面的上下文,可以获得隐式对象,同时可以保持获取不同域中的属性值,拥有自己的域(pageScope)
所以呢 pagescope 和 pagecontext 这两玩意是差不多一样的 但是 pagecontext 【其实 EL 内置对象 pagecontext 等于JSP 的 pageContext 】 功能比较强大,下面讲解:
上面除了pageContext是javax.servlet.jsp.PageContext类型,其他的都是java.util.Map类型。下面主要介绍一些其他常用的:
pageContext
EL表达式中的pageContext与JSP内置对象中的 pageContext 是同一个对象。通过该对象,可以获取
到 request、response、session、servletContext、servletConfig 等对象。
比如直接在el表达式用pageContext获取request对象,然后打印 :
${ pageContext.request }
<%-- 结果: org.apache.catalina.connector.RequestFacade@2790a6fa --%>
注意: EL 中的内置对象: pageContext 和 JSP中的内置对象是两个东西 即使是一样的!!! 但是有些名字是不一样的啊!
还有就是 El表达式中的 pageContext 对象只能获取到其属性 而不能调用获取到的 对象【例如 reques、session 等...】 的 方法! 这点自己去验证!!!
例如:
<% out.print(pageContext.getSession().getId()); %>
${ pageContext.session.id }
第一个行是 JSP 的 pageContext 第二行是用EL表达式的内置对象打印的 都一样 但是就是不能调用用 pageContext获取的对象的方法
其底层实际调用的是
pageContext.getRequest()方法 其他对象则是 pageContext.getXXXX()
同理,也可以通过类似方式获取到其它对象。
在这些获取的对象中,有一个是实际工程中最常用的:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*,test.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/index.jsp">
<input type = "submit" value="提交">
</form>
</body>
</html>
看见没 其实这个可以表单提交的网址是: http://localhost:8080/JSP/index.jsp?
param
在 EL 中通过${param.参数名}可获取到请求中指定参数名的值。例如,提交的请求为:
http://localhost:8080/JSP/index.jsp?user=123456&password=abcde
在 JSP 页面中通过如下方式,可获取到 user 参数 和 password 参数的值:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*,test.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${param.user}
<br>
${param.password}
</body>
</html>
其实你也可以POST提交然后 到某个页面然后自己获取 其次呢 它的原理就是request.getParameter();
问题来了: 如果提交的是多个值 我怎么获取: 例如爱好有 篮球 跆拳道 和 羽毛球:
paramValues
若提交的请求中同一参数具有多个值,则可通过 ${paramValues.参数名[索引]} 获取到指定索引号的该参数值。例如,提交的请求为:
localhost:8080/07-04-jsp/index.jsp?hobby=basketball&hobby=football
在JSP中获取方式如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*,test.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${paramValues.hobby[0]}
${paramValues.hobby[1]}
${paramValues.hobby[2]}
</body>
</html>
但是具体有多少个 这个我就不知道怎么算了 其实你自己用 request直接getParameterValues获取:
<%
String[] hobby = (String[])request.getParameterValues("hobby");
out.print(hobby.length);
%>
initParam
在 EL 中通过使用 ${initParam.初始化参数名} 可以获取到初始化参数的值。 例如在 web.xml 中定义了初始化参数如下:
<context-param>
<param-name>name</param-name>
<param-value>bihu</param-value>
</context-param>
那么,获取:
el内置对象 cookie : 可以获取指定cook的name 和 value :
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*,test.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% Cookie c = new Cookie("user","bihu");
response.addCookie(c);
%>
${cookie.user.name }
${ cookie.user.value}
</body>
</html>
其他对象在开发中基本不常使用,这里就不介绍了 , 其实很多都和JSP的的那些方法一样的 内置了对象 只是比较方便而已!
作者:咸瑜