el和jstl小结

el(Expression Language)

在jsp中使用或显示Java对象的属性和属性值需要写很长的一段代码,多而繁杂;为了优化程序,提高可读性与编码的方便性,el表达式出现了;el表达式的使用大大优化了在jsp中使用Java对象的属性和属性值的代码;

request.setAttribute("mouse", "Jerry");

我们在web项目的Java代码中给request添加一个("mouse", "Jerry")的属性和属性值;然后再在jsp中显示mouse的值;常规的比较麻烦的写法;如下:

<%=request.getAttribute("mouse") %>

再看我们使用el表达式:

${mouse}

两者的输出内容是一致的,都是 Jerry;但下面的代码比上面的简短了太多了;

接下来,我们来看常用的el表达式;

(jsp和servlet的全代码不再放出,仅放出其中起作用的代码;这样的话博客会简洁很多,也是因为创建jsp文件、target文件和servlet文件比较简单,但是全部搬运到博客上就显得冗余而繁杂)

基本数据类型和String类型

定义request对象两个属性和属性值;

request.setAttribute("name", "Jerry"); 
request.setAttribute("age", 1);

然后再jsp中使用el表达式调用;就能在浏览器端口输出我们想要的属性值了;

${name }
${age }

Jerry 1

自定义类型

首先我们先自定义一个类,这里以自定义Student类演示;

public class Student {
	
	private String name;
	private String id;
	private String mobile;
	private String address;
	
	public Student(String name, String id, String mobile, String address) {
		this.name = name;
		this.id = id;
		this.mobile = mobile;
		this.address = address;
	}

	public String getName() {
		return name;
	}

	public String getId() {
		return id;
	}

	public String getMobile() {
		return mobile;
	}

	public String getAddress() {
		return address;
	}
}

然后再创建对象并把对象作为属性值赋给request对象;

request.setAttribute("student", new Student("Jerry","911","911","Washington"));

然后再在jsp中调用显示;

${student.name }
${student.id }
${student.mobile }
${student.address }

Jerry 911 911 Washington

JSTL(JSP Standard Tag Library)

JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要代替jsp页面中的脚本代码;我们可以在网上下载两个jar包; 其中,jstl.jar文件包含JSTL规范中定义的接口和相关类,standard.jar文件包含用于实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD);

因为以下对数组的遍历和以下判断需要用法哦jstl,因此该部分从这里引入;

数组和集合(list  set)

创建一个数组并将数组作为属性值赋给request对象;

request.setAttribute("names", new String[] {"Tom","Jerry","Speike"});

此时,在jsp中有两种遍历方式:枚举和<c:forEach>遍历;

因为这里需要使用jstl标签库,因此将上文提到的两个jar包放在该web项目中的lib文件夹;然后使用下面语句引用;

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

该语句有两部分,taglib uri="http://java.sun.com/jsp/jstl/core" 是引用的固定格式,不允许更改;后面 prefix="c"  是声明标签<c:forEach>中的符号c,声明的部分要和forEach的前面的字符保持一致;一般来说习惯为c,当然也可以是其他字符;

${names[0] } ${names[1] } ${names[2] }<br/>
<c:forEach var="name" items="${names }">
	${name } 
</c:forEach>

Tom Jerry Speike
Tom Jerry Speike

上面是枚举,下面是<c:forEach>遍历;两种方法均可使用;

<c:forEach>和Java遍历中的foreach加强循环很像,以上例为例:其中 var是声明关键字;name 是将遍历的结果赋给变量的变量名;items遍历的对象;${names}是传入的需要遍历的对象;

List<Integer> list=new ArrayList<Integer>();
list.add(100);
list.add(110);
list.add(120);
request.setAttribute("list", list);

List数组遍历方式和普通数组相同,两者均可;

${list[0] } ${list[1] } ${list[2] }<br />
<c:forEach var="l" items="${list}">
	${l }
</c:forEach>

100 110 120
100 110 120

Set集合稍有不同,因为Set集合是无序的,集合内元素没有下标,因此用不了下标遍历的方法,只能使用<c:forEach>遍历;

Set<String> set = new HashSet<String>();
set.add("Tom");
set.add("Jerry");
set.add("Speike");
request.setAttribute("set", set);
<c:forEach var="s" items="${set }">
	${s }
</c:forEach>

Tom Speike Jerry

Map对象

Map的值是以key和value的形式一对一对存在的;

Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Tom", 90);
map.put("Jerry",91);
map.put("Speike",92);
request.setAttribute("scores", map);

遍历的方法也存在两种;

${scores['Tom'] }<br/>
<c:forEach var="score" items="${scores }">
	${score.key }---${score.value }<br/>
</c:forEach>

90
Tom---90
Speike---92
Jerry---91

算术运算符与关系运算符

el表达式适用于+、-、*、/ 和% 运算符,其中/ 和% 也可使用 div 和 mod 代替;如下:

request.setAttribute("a", 1);
request.setAttribute("b", 1);
${a+b }<br/>
${a-b }<br/>
${a*b }<br/>
${a/b }<br/>
${a div b }<br/>
${a%b }<br/>
${a mod b }<br/>

2
0
1
1.0
1.0
0
0

el表达hi式中的除法的结果均已小数的形式表示;

> 、 >= 、  == 、 <= 、 < 、 !=     等关系表达式也可使用

毕竟不难,这里仅举三例;

${a>b }<br/>
${a==b }<br/>
${a<=b }<br/>

false
true
true

逻辑运算符

逻辑运算符也可以使用,这里以 empty 判断数据是否为空进行举例;

直接创建一个空的list数组,并将其赋给request对象;

request.setAttribute("list", new ArrayList<String>());

使用empty进行判断(是否为空   是否不为空   是否不为空)

${empty list }<br/>
${not empty list }<br/>
${!empty list }<br/>

true
false
false

<c:if>  <c:choose>  <c:when>  <c:otherwise>

<c:if>类似于Java的ifelse选择语句,但是没有else部分;<c:choose>则是类似于switch方法,其中<c:when>类似于case,<c:otherwise> 类似于default;如下:

request.setAttribute("a", 1);
request.setAttribute("b", 1);
request.setAttribute("c", 2);
<c:if test="${a==b }">
	等于
</c:if>
<c:if test="${a!=b }">
	不等于
</c:if>
<c:choose>
	<c:when test="${a==c }">
		等于
	</c:when>
	<c:when test="${a>c }">
		大于
	</c:when>
	<c:otherwise>
		小于
	</c:otherwise>
</c:choose>

等于 小于

因为a和b的值都是1,因此只会输出第一个<c:if>判断;而c为2,大于a,因此<c:choose>中判断a?b时会输出小于;

<c:set>  <c:out>  <c:remove>

这三个标签可以直接在jsp中进行创建属性和属性值,查询以及删除操作;

<c:set var="name" value="Tom"></c:set>
${name }
<c:out value="${name }"></c:out>
<c:remove var="name"/>
s${name }s

Tom Tom ss

截取字符

百度搜索东西的时候,我们会发现一些摘要和简介显示不完全,仅显示了一部分,这其实有很多都是截取的结果;

将百度搜索的一部分猫和老鼠的简介赋值给request的对象;

request.setAttribute("summary", "《猫和老鼠》以闹剧为特色,描绘了一对水火不容的冤家:汤姆和杰瑞猫鼠之间的战争,片中的汤姆经常使用狡诈的诡计来对付杰瑞,而杰瑞则时常利用汤姆诡计中的漏洞逃脱他的迫害并给予报复");

以下内容会用到jstl中的一些functions方法;因此,在这里我们还需要在增添一句话进行引入:

<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

然后先使用length方法判断长度,再使用substring进行截取;

${fn:length(summary) }
${fn:substring(summary,1,5) }

86 猫和老鼠 

字符总长为86,截取1到5(不包括5)得到的内容为 猫和老鼠;

我们再综合上述中的<c:choose>  <c:when>  <c:otherwise> 标签,模仿摘要输出结果,即当字符长度大于30时,仅输出前30个字符;

<c:choose>
	<c:when test="${fn:length(summary)>30 }">
		${fn:substring(summary,0,30) }...
	</c:when>
	<c:otherwise>
		${summary }
	</c:otherwise>
</c:choose>

《猫和老鼠》以闹剧为特色,描绘了一对水火不容的冤家:汤姆和杰...

参考链接:https://www.cnblogs.com/black-mcy/p/10040940.html

发布了99 篇原创文章 · 获赞 3 · 访问量 1247

猜你喜欢

转载自blog.csdn.net/qq_44971038/article/details/103472118
今日推荐