表达式语言 1

表达式语言简介

         JSP 2.0 之后提供的一个最注意的功能就是支持了表达式语言操作,如果要想让表达式语言发挥出自己的注意作用,则必须首先考虑的是使用MVC设计模式完成,因为在MVC设计模式一个最主要的好处就是让JSP 中的代码越来越少了,而且已经规定了在JSP之中只能出现三种代码:

      接收属性

      判定语句

      迭代语句

      但是,如果在开发之中,有时候这一点很难做到的,在实际的代码开发中已经讲解了,一个JSP肯定输出的时候是接收VO 对象的,则这个时候为了可以避免导入VO包,也只能透过表达式完成


表达式语言 (Expression Language,简称EL) 是JSP 2.0 中增加的新功能。使用表达式语言,可以方便的访问标志位(在JSP中一共提供了四种标识位:page(pageContext))

、request、session、application) 中的属性内容,这样就可以避免掉许多的script 代码,访问的简便语法如下:

     ${属性名称}  

     四种标识位 = 四种属性范围,有四种属性范围存在的属性可以直接通过表达式语言访问。

    那么下面通过一个简短的代码,来简单认识一下表达式语言的基本作用。

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
	//假设以下的设置属性操作是在Servlet 之中完成
	request.setAttribute("info","不做大哥很多年"); //设置一个request属性范围
%>
<%
	if(request.getAttribute("info") != null) {  //现在有属性存在
%>
	<h3><%=request.getAttribute("info")%></h3>
<%
	}
%>
</body>
</html>
   之所以要加入一个判断,主要的原因也是在避免输出null, 但是这样一来代码又太多了,在这种情况下就可以通过表达式来完成

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
	//假设以下的设置属性操作是在Servlet 之中完成
	request.setAttribute("info","不做大哥很多年"); //设置一个request属性范围
%>
<h3>${info}</h3>
</body>
</html>
         如果现在使用了表达式语言完成输出的话,可以很好的控制掉null的问题,而且比之前的直接使用Script代码输出更加的简便,而且使用" " (空字符串) 代替了null。

        通过表达式语言可以方便的进行属性的输出

       如果属性不存在,则通过表达式语言自动将null设置为 " ".


掌握表达式语言中的各主要内置对象的使用

可以使用表达式输出指定范围的属性或者是参数


     之前是直接使用了表达式输出了一个属性范围中的保存的属性

<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
	//pageContext.setAttribute("info","page属性范围");
	//request.setAttribute("info","request属性范围");
	//session.setAttribute("info","session属性范围");
	getServletContext().setAttribute("info","getServletContext()属性范围"); //application
	
%>
<h3>${info}</h3>
</body>
</html>
        如果现在不同的属性范围之中,保存了同名的属性,则EL的查找范围就是page --> request --> session ---> application 这个时候就可以依靠内置对象帮忙


<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%   //可以准确取得s
	pageContext.setAttribute("info","page属性范围");
	request.setAttribute("info","request属性范围");
	session.setAttribute("info","session属性范围");
	application.setAttribute("info","application属性范围"); //getServletContext()
	
%>
<h3>PAGE属性内容: ${pageScope.info}</h3>
<h3>REQUEST属性内容: ${requestScope.info}</h3>
<h3>SESSION属性内容: ${sessionScope.info}</h3>
<h3>APPLICATION属性内容: ${applicationScope.info}</h3>
</body>
</html>
      现在通过EL 的内置对象也可以发现pageContext, 之前在讲解内置对象的时候一直强调,pageContext 可以取得request、session、application 等对象,现在就可以通过EL直接完成内置对象的方法调用

    在HttpServletRequest 接口中存在了一个getRemoteAddr() 方法

    在HttpSession 接口中存在了getId() 方法,和isNew方法

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>
<head> <title>欢迎光临</title>
</head>
<body>
<h3>IP地址: ${pageContext.request.remoteAddr}</h3>	
<h3>SESSION ID地址: ${pageContext.session.id}</h3>	
<h3>是否是新session: ${pageContext.session.new}</h3>	

</body>
</html>

    这样的命名及操作实际上是为了依靠反射机制完成的,在JAVA 开发实战经典中,已经详细讲解了反射机制的核心内容,现在这种操作形式实际上也是利用反射机制完成的。

    表单可以传递参数,或者是通过URL 重写传递参数,如果要想接收参数“ param ” 对象完成

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>
<head> <title>欢迎光临</title>
</head>
<body>
<h3>通过内置读写接收输入参数: <%=request.getParameter("ref")%></h3>
<h3>通过表达式语言接收输入参数: ${param.ref}</h3>
</body>
</html>

通过内置读写接收输入参数: null

通过表达式语言接收输入参数:

通过内置读写接收输入参数: llll

通过表达式语言接收输入参数: llll

 

http://localhost:8080/demo/eldemo/get_param_el06.jsp?ref=llll

    现在只是接收了一个参数,也可以完成一组参数的接收, paramValue

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>
<head> <title>欢迎光临</title>
</head>
<body>
<form action="param_values_el07.jsp" method="post">
	兴趣: <input type="checkbox" name="inst" value="唱歌"> 唱歌
	      <input type="checkbox" name="inst" value="打拳"> 打拳
		  <input type="checkbox" name="inst" value="泡妞"> 泡妞
		  <input type="submit" value="显示"> 

</form>
</body>
</html>

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>
<head> <title>欢迎光临</title>
</head>
<%
	//正常开放中,此代码要通过过滤器实现
	request.setCharacterEncoding("GBK");
%>
<body>
<h3>第一个参数: ${paramValues.inst[0]}</h3>
<h3>第二个参数: ${paramValues.inst[1]}</h3>
<h3>第三个参数: ${paramValues.inst[2]}</h3>

</body>
</html>




        现在JSP 接收的时候,肯定要使用paramValues接收一组参数,由于现在接收过来的是数组,如果是数组的话则需要下标进行访问。

         但是在开发中用的最多的还是param对象,接收一个参数,因为从MVC 设计模式来讲,所有的参数接收应该交给Servlet去做。

          但是一般的开发中是回避免掉这些同名属性存在的

              ${属性}

 

集合操作

     以下JAVA开发实战经典中汇讲解类集框架部分。List、Set、Map、Iterator、Map.Entry等一些基本知识

     集合 Collection、Map、Iterator

     Collection: List、Set

     所有的集合都要使用Iterator 方法进行输出,而且List 和 Set集合的本质区别就在于List接口对Collection 接口进行了扩充,而Set接口并没用扩充

    对于每次保存一对内容的操作使用Map 集合,而且Map每次保存都是Map.Entry接口对象

     当然,此处的代码只是为了输出方便,而要想真正的起作用,必须结合MVC设计模式来看

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
	List all = new ArrayList();
	all.add("独孤求败");
	all.add("天天开心");
	all.add("8888888");
	request.setAttribute("allinfo",all);  //集合保存在request 范围

%>
<h3>第一个元素: ${allinfo[0]}</h3>
<h3>第二个元素: ${allinfo[1]}</h3>
<h3>第三个元素: ${allinfo[2]}</h3>
</body>
</html>
     但是,在此处必须强调的是,以上的代码实际上JSP 文件之中,只关心蓝色字体部分,其他的部分都应该由Servlet 完成

     既然可以输出了Collection ,那么下面再来输出Map集合。

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head> <title>欢迎光临</title>
</head>
<body>
<%
	Map map = new HashMap();
	map.put("1","独孤求败");
	map.put("2","天天开心");
	map.put("3","8888888");
	request.setAttribute("info",map);  //集合保存在request 范围

%>
<h3>KEY为1 的内容: ${info["1"]}</h3>
<h3>KEY为2 的内容:: ${info["2"]}</h3>
<h3>KEY为3 的内容:: ${info["3"]}</h3>
</body>
</html>

        现在的输出都是通过下标一个个的完成功能的,但是并没用涉及到具体的Iterator 的输出

       集合的操作依然是通过Iterator 输出

       输出时将集合中的每个元素都分别保存在page 的属性范围之后再使用表达式输出。

       输出集合时可以直接通过下标完成

       Map集合输出时依然要通过KEY 找到VALUE

下一章 是MVC中一ing有表达式语言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值