JSP再涉(三)

1、EL表达式的引出

       特点:JSP中虽然可以写脚本(Java代码),但是不美观,为方便程序员引入新的规范

       作用:主要是用来替代<%=%>的原始脚本的输出的!

       说明:是JSP内置的,不需要外部导入!

2、什么是EL表达式

      (1)它是一种获取数据规范,主要目的就是用来简化java代码的

      (2)格式:${变量或表达式}---不用写“%”和“=”JSP脚本的形式 <% =%>

      (3)EL表达式输出变量前提:变量"必须"保存在域对象

      (4)${s}说明---本质上用的pageContext.findAttribute()方法找到属性名(字段名)为s的对象,然后再取对象里的属性值,也

就是说${s}相当于pageContext.findAttribute("s")或PageContext.getAttribute("name")?以JSP脚本的形式--<%=name%>

练习:从当前页面使用EL表达式获取四大域对象

3、EL表达式的用法

说明:针对四大域对象

(1)普通字符串

<%
	String email="zhangsanqq.com";
	//存储到域对象
	pageContext.setAttribute("email", email);
%>
	${email}<!--主要是来获取(只能在此JSP页面使用!)的-->

(2)使用普通的类中----获取类对象和类中的属性值

已知:有一个Student类,给类提供一些属性name、pasword

思考:通过EL表达式如何获取属性?

传统方法:对象.getXXX()方法

遵循:EL表达式的规范

EL表达式规范:获取普通类中的属性---去掉"get"中间的变成小写同时去掉"()"

(3)用在数组

注意:在EL表达式中不能使用迭代(集合)或遍历(数组)----引出核心标签库

方式1:不使用核心标签库

在EL表达式中"获取数组"元素是通过角标获取

<%
	//创建一个学生数组
	Student[] st=new Student[3];
	//给学生数组中的元素进行赋值
	st[0]=new Student("a","1234");
	st[1]=new Student("b","4353");
	st[2]=new Student("a","3454");
	pageContext.setAttribute("st", st);//对象的传递
%><br/>
	${st[0].name}--${st[0].password}<br/>
	${st[1].name}--${st[1].password}<br/>
	${st[2].name}--${st[2].password}

(4)用在集合中--单链集合和双链集合

     遍历单列--已知:getIndex(角标)---获取数据集合中的数据

<%
	List<Student> list=new ArrayList<Student>();
	//赋值
	list.add(new Student("eric","1234"));
	list.add(new Student("jane","5342"));
	list.add(new Student("tony","5459"));
	pageContext.setAttribute("list", list);	
  %>
<%-- 得到index值--%%>
    ${list[0].name}---${list[0].password}<br/>
    ${list[1].name}---${list[1].password}<br/>
    ${list[2].name}---${list[2].password}

注意:单列集合底层的数据结构也是数组,所有也有通过索引来获取数据

遍历双列集合-Map集合--已知getKey("key")---String value---getNam().getPassword()

<%
	Map<String,Student> map=new HashMap<String,Student>();
	map.put("001", new Student("eric","1234"));
	map.put("002", new Student("jane","5342"));
	map.put("003", new Student("tony","5459"));
	pageContext.setAttribute("map", map);
%>
<%-- 得到key值--%%>
	${map["001"].name }-${map["001"].password }<br/>
	${map["002"].name }-${map["002"].password }<br/>
	${map["003"].name }-${map["003"].password }

说明:双列集合是通过键来找值的(或者可以理解为键就是其索引)!

注意:它的另外一种形式的书写(重要!!!)--回头补充

(5)EL表达式的容错能力比较强

     把s随便换成一个我们未定义的属性。那么上面一种写法中stu就是null值,这一步不会报错,但是下一步相当于

null.getName()就会报错NullPointerException。但是EL表达式不会报错,它会把取到的null值自动转化空字符串

   回顾:原来通过<%=%>传递域对象,第一次没有获取数据时会是null值,可以采用三元运算符(判断是否为null),进而展示数据

(6)表达式的属性导航,也就是链式属性,本质上是一个类中包含了另一个,然后链式调用(.的形式)

      []比点.强大,强大之处主要体现在对键值对或对象之外的取值,因为点.是根据属性名(或key的名字)字来的,如果没有名

字就很难取值,比如针对List只有序列下标,可以用下面来根据序号取值

(7)EL表达式支持的运算符

      1)算术运算符---加减乘除
      2)比较运算符---大于、小于、不等于、大于等于之类的
      3)逻辑运算符---支持"与"或"双或"或非
      4)重要:判空条件
            1)空值        ==null---${name==null}

            2)空字符串  ==""-----${name==“”}

      5)判空条件的等价形式

       ${empty 获取的变量值}==等价于${name==null}&&${name==null}

       特点:不管是是空字符串或null值返回的都是true

       注意:结果出现"null"的形式

(8)EL表达式支持三目运算符

    应用:比如我们从数据库中取得某个数据,然后根据这个数据显示不同的状态等等(后续)

4、EL 11个(隐藏)内置对象

(1)pageContext----------等价于JSP中的pageContext内置对象

JSP脚本获取上下文对象:<%=pageContext.getRequest().getcontextPath()%>--向浏览器输出
EL表达式获取上下文对象:${pageContext.request.contextPath()}

补充:EL可以输出的东西都在11个内置对象中,除了pageContext不是Map,其余都是map集合,它就是PageContext类型!

突破口:通过pageContext可以获取JSP中其它的对象(request、session等)

过程:得到request对象,进而得到请求中的Web项目的名称(上下文路径)

原因:El表达式中并没有rquest这个内置对象,不能直接使用(迂回使用)

(2)pageScope、requestScope、sessionScope、applicationScope

特点:域属性(获取数据--区分request),但是是个Map集合,如果不想域对象挨个查询变量,指定查询某个域对象的此变量

方式:${sessionScope.s}--从session域中获取s变量,有针对性

(3)parm(parmValues)、header(headerValues)、cookieinitParm(全局配置信息--从context-parm标签中获取)

作用获取参数请求头会话数据全局配置信息--直接是上面的开头

额外:cookie的集合形式是Map<String,Cookie>

说明:前三个对应request域对象 ,最后一个对应application对象(web.xml中配置)

理解:从等价形式(替代)的角度去理解EL表达式!

注意:(1)标签中可以写脚本,反过来不行;(2)标签中可以写EL表达式,反过来不行

应用:数据传递,获取数据、跳转、获取上下文对象

1、获取域中数据() ★

举例1:获取上下文文本路径进而实现页面跳转(重定向、a标签、href标签、src标签)!

特点:动态的得获取路径

举例2:在一个Servlet中存储数据,在另一个JSP中通过EL表达式获取域中的数据

2、执行运算 ★

3、获取常见的web对象★

说明:是从域对象传递过来对象

4、调用java的方法★★★

前提:域对象中存储的是对象,而不是字符串等!

注意:四大域对象可以存储的数据类型!

内置对象的掌握:重点是哪些是继承的、那些是特殊的、那些是没有的;Servlet、JSP、EL中内置对象的比较!

-----------------------------分割线--------------------------------------

练习:

<body>
	<%--
		1)pageContext对象:   ---->等价于Jsp中的pageContext内置对象
		通过pageContext获取其他几个jsp的内置对象
	 --%>
	<%=pageContext.getRequest()%>  <%--获取request对象的"原型",JSP中内置了request,而EL中没有内置JSP--%> 
	<%--获取上下文路径 --%>
	获取上下文路径:EL的pageContext内置对象
	<br/>
	${pageContext.request.contextPath}   
	<hr/>
	
	<%--
		pageScope	 当前jsp页面
		requestScope     在同一个请求中
		sessionScope     在同一个会话中(sesison)
		applicationScope 在一个网站起作用
	 --%>
	
	 <%--
	 	param:参数
	 	之前获取参数
	 	<%=request.getParameter("name") %>
	 	getParameterValues:获取多个参数值的情况<!--复选框-->
	 	<%=request.getParameterValues("name")[0] %><!--集合的形式-->
	  --%>
	  ${param['name'] }
	  <br/>
	  ${paramValues['name'][0] }  -  ${paramValues['name'][1] } 
	<hr/>
	
	<%--
		 header:请求头内置对象
		 <%=request.getHeader("host") %>
		 <%=request.getHeaders("host").nextElement() %>
	 --%>
	 ${header['host'] }<br/>
	 ${headerValues['host'][0]}
	<hr/>
	<%--
		initParam:获取全局参数
		<%=application.getInitParameter("AAA") %>
	 --%>
	 ${initParam['AAA'] }
	 <hr/>
	 <%--
	 	cookie
	 	<%=request.getCookies() %>
	  --%>
	  ${cookie['JSESSIONID'].name } - ${cookie['JSESSIONID'].value }
</body>
未完待续。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值