JSP内置对象及EL表达式及相关问题讲解

JSP的内置对象是为了方便, 开发 JSP 的时候,把一些对象设置为内置对象,开发者在 JSP 页面编程的时候没必要声明这些对象就能直接使用。
本文咱们具体讲解一下Jsp内置对象及EL表达式的使用。 java

1、JSP的内置对象(9个JSP内置对象)
JSP的内置对象引用名称   对应的类型
request      HttpServletRequest
response         HttpServletResponse
session      HttpSession(有开关的:page指令的session属性的取值)
application    ServletContext
config       ServletConfig
page        this(当前Servlet对象)
exception     java.lang.Throwable(有开关:page指令的isErrorPage属性改成true)
out        JspWriter
pageContext    javax.servlet.jsp.PageContext很是重要
pageContext对象有三大做用:
一、自己是一个域对象,表示的域范围是本页面。
同时还能操做其余三个域对象(PageContext ,ServletRequest, HttpSession,ServletContext)
设置属性:
  void setAttribute(String name,Object value)
  void removeAttribute(String name)
  Object getAttribute(String name)
操做其余的三个域对象,设置属性:
  void setAttribute(String name,Object value,int scope)
  void removeAttribute(String name,int scope)
  Object getAttribute(String name,int scope)
  参数int scope是由PageContext类提供的静态变量规定的。
  PageContext.PAGE_SCOPE:页面范围(是PageContext自己中的那个Map,代号page)
  PageContext.REQUEST_SCOPE:请求范围(是ServletRequest中的那个Map,代号request)
  PageContext.SESSION_SCOPE:请求范围(是HttpSession中的那个Map,代号session)
  PageContext.APPLICATION_SCOPE:请求范围(是ServletContext中的那个Map,代号application)
Object findAttribute(String name):依次按照page,request, session ,application范围搜索指定名称的对象,找到为止。
EL表达式即是调用了此方法(很是有用)
二、获取其余8个隐式对象
三、提供了转发和包含的方便方法 
 若不用pageContext对象:
  RequestDispatcher rd = request.getRequestDispatcher("/url");
  rd.forward(request,response);
 用pageContext对象:
  pageContext.forward("url");
  pageContext.include("url");
四大域对象(两个资源之间互传数据)
JSP中隐式对象的名称  范围名称  具体的类型
pageContext    page    javax.servlet.jsp.PageContext
request      request  javax.servlet.ServletRequest
session     session  javax.servlet.http.HttpSession
application    application  javax.servlet.ServletContext (若是使用,必须同步处理)
2、EL表达式
它只是JSP中的表达式,不是一种开发语言。
基本语法:${EL表达式}
1. 获取数据
EL表达式只能获取四大域中的数据。
EL表达式获取的对象若是是null,页面不会显示数据。所以,EL表达式中永远不会出现空指针异常
"."运算符:
${p.name}:调用域中名称为p对象的getName方法,点运算符是用于获取属性的取值的。
[]运算符:
(.运算符能作的,[]也能作。[]能作的,.不必定能作)
好比${p.name}===${p['name']}==${p["name"]}
优秀在能够取不符合Java命名规范的东东。
2. 数学逻辑运算:
empty运算符:
若是判断的对象是null或者空字符串,都返回true。
对于集合,即便集合对象自己不是null,没有任何元素,也返回true。
EL表达式不支持字符串链接操做。 web

3、EL内置对象(11大EL内置对象)
获取JSP的内置对象(11大EL内置对象):难点,不要与JSP的内置对象和范围名称搞混
11大EL隐式对象中,其中一个是表示自身对象外,其他都是表示的Map结构
EL隐式对象名称     Java类型              备注
pageContext    javax.servlet.jsp.PageContext   与JSP中的内置对象彻底相同
剩余的都是表明的Map集合
pageScope    java.util.Map   表明着PageContext页面范围域那个Map
requestScope    java.util.Map   表明着ServletRequest请求范围域那个Map
sessionScope   java.util.Map   表明着HttpSession会话范围域那个Map
applicationScope    java.util.Map   表明着ServletContext应用范围域那个Map
param       java.util.Map   表明着请求参数。key:请求参数的名称。value:请求参数的值,它是一个字符串。
paramValues   java.util.Map   表明着请求参数。key:请求参数的名称。value:请求参数的值,它是一个字符串数组。
header      java.util.Map  表明着请求消息头。key:头名称。value:头值,它是一个字符串。
headerValues   java.util.Map   表明着请求消息头。key:头名称。value:头值,它是一个字符串数组。
cookie     java.util.Map  表明客户端提交的Cookie的Map。key:cookie的name。value:cookie对象自己
initParam   java.util.Map   表明着全局初始化参数(web.xml中context-param).key:参数名称。value:参数值编程

EL表达式与JSP内置对象问题 数组

问:
${pageContex.request}和${request}有区别吗?这里的request都是HttpServletRequest类吗?
我在Action中有request.setAttribute("key",key);
key变量是集合时在jsp用${key}能拿到,可是key是个字符串时${key}就是null,为何呢?
还有Attribute和Parameter有什么区别?能够分别有同名的吗?(好比Parameter中有个"key",Attribute也有个"key")
能够的话,EL中区分吗?先找哪一个?
回复一:
有区别吧
request对象有若干个内部信息,其中一个是attribute(key, value)队列。
${pageContex.request}表示的是request对象自己,能取得request的全部信息。
${request}表示的是request对象内部的attribute(key, value)队列,只能取得该队列内的信息
回复二:
key变量是集合时在jsp用${key}能拿到,可是key是个字符串时${key}就是null,为何呢?
你在页面<%request.getparameter(‘key’)>能够取到!
Attribute和Parameter有什么区别:
getParameter(String name)得到客户端传送给服务器的参数值,该参数是由name指定的,一般是表单中的参数.
getAttribute(String name):返回有name 指定的属性值,若是指定的属性值不存在,则会返回一个null值.服务器