JavaWeb 学习笔记总结( 二 )

Posted IT_Holmes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb 学习笔记总结( 二 )相关的知识,希望对你有一定的参考价值。

1. EL表达式


El表达式的全称:Expression Language(表达式语言)。

EL表达式的作用:主要替代jsp页面中的表达式脚本在jsp页面进行数据的输出。


为什么要要用EL表达式来替代jsp的数据输出?

因为EL表达式在输出数据的时候,要比jsp的表达式脚本要简洁很多。


举例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Express Language</title>
</head>
<body>
    <%
        request.setAttribute("key","值");
    %>

    表达式脚本输出key的值是:<%=request.getAttribute("key")%><br>
    表达式脚本输出不存在的key2的值是:<%=request.getAttribute("key2")%><br>
    <hr>
    EL表达式输出key的值是:$key<br>
    EL表达式输出不能存的key2的值是:$key2
</body>
</html>

上面的输出结果是不同的!

如果想要表达式也是空串,还得写成三元表达式来判断:

<%=request.getAttribute("key2")==null?"":request.getAttribute("key2")%><br>

相比较EL表达式更为简洁。


总结:

  • El表达式的格式是:$表达式 。
  • EL表达式在输出null值时,输出的是空串‘;而jsp表达式脚本输出null值时,输出null字符串。

2. EL 表达式 搜索域数据的顺序


EL表达式主要在jsp页面中输出数据,而且主要输出域对象中的数据。

那么,如果四个域中都有相同的key的数据时,就是有重复的key值。

EL表达式会按照四个域的从小到大的顺序,查找,查找到就输出。

pageContext < request < session < application

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<% 
		//四个域中都保存了相同的数据
		application.setAttribute("key", "application");
		session.setAttribute("key", "session");//session保存的数据,必须关闭浏览器后才消失
		request.setAttribute("key", "request");
		pageContext.setAttribute("key", "pageContent");
		
		//当四个域中都有相同的key的数据时,EL表达式会按照四个域的从小到大的顺序,查找,查找到就输出。
		//pageContext < request < session < application
	%>
	
	$key
</body>
</html>

3. El表达式 调用类属性


我们在写EL表达式时,调用属性时,并不是直接调用属性,而是先调用属性对应的get方法,因此,如果我们想要把类中的属性使用EL表达式展现在jsp页面上,我们必须在java类中定义属性对应的get方法!

案例:
person.java 代码:

package com.test.el01;

import java.util.List;
import java.util.Map;

public class Person 
	
	private String name;
	private String[] phones;
	private List<String> cities;
	private Map<String,Object> map;
	private int age = 10;
	
	//倘若没有age的get方法,那么EL表达式调用age会直接报错!
	//public int getAge() 
	//	return age;
	//
	public void setAge(int age) 
		this.age = age;
	
	public String getName() 
		return name;
	
	public void setName(String name) 
		this.name = name;
	
	public String[] getPhones() 
		return phones;
	
	public void setPhones(String[] phones) 
		this.phones = phones;
	
	public List<String> getCities() 
		return cities;
	
	public void setCities(List<String> cities) 
		this.cities = cities;
	
	public Map<String, Object> getMap() 
		return map;
	
	public void setMap(Map<String, Object> map) 
		this.map = map;
	
	
	public Person() 
		super();
	
	
	public Person(String name, String[] phones, List<String> cities, Map<String, Object> map) 
		super();
		this.name = name;
		this.phones = phones;
		this.cities = cities;
		this.map = map;
	
	
	@Override
	public String toString() 
		// TODO Auto-generated method stub
		return "name:"+name+","+"phones:"+phones+","+"cities:"+cities+","+"map:"+map;
	
	

jsp页面:

<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.test.el01.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<% 
		Person p = new Person();
		p.setName("张三");
		p.setPhones(new String[]"1234567","12212331");
		
		List<String> cities = new ArrayList<String>();
		cities.add("北京");
		cities.add("上海");
		p.setCities(cities);
		
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("key1", "value1");
		map.put("key2", "value2");
		map.put("key3", "value3");
		p.setMap(map);
		
		pageContext.setAttribute("person", p);
	%>
	
	输出Person:$person<br>
	输出Person的name属性:$person.name<br>
	输出Person的phones数组的属性值:$person.phones[0]<br> 
	输出Person的cities集合的属性值组:$person.cities<br> 
	输出Person的cities集合的属性的某一个值:(和数组差不多。)$person.cities[1]<br> 
	输出Person的map集合的属性:$person.map<br> 
	输出Person的map集合的属性的某一个key值:$person.map.key2<br> 
	输出Person的age属性值:$person.age<br> 
	
</body>
</html>

4. EL表达式 运算

4.1 关系运算符


4.2 逻辑运算符


4.3 算数运算符


5. EL表达式 empty运算


empty运算可以判断一个数据是否为空,如果为空,则输出true,不为空输出false。

什么情况下EL表达式为空?

  • 值为null值得时候,为空。
  • 值为空串的时候,为空。
  • 值是Object类型数组,长度为零的时候。
  • list集合,元素个数为零。
  • map集合,元素个数为零。
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<% 
		//1.值为null值得时候,为空。
		request.setAttribute("emptyNull", null);
		//2.值为空串的时候,为空。
		request.setAttribute("emptyStr", "");
		//3.值是Object类型数组,长度为零的时候。
		request.setAttribute("emptyArr", new Object[]);
		//4.list集合,元素个数为零。
		request.setAttribute("emptyList", new ArrayList());
		//5.map集合,元素个数为零。
		request.setAttribute("emptyMap", new HashMap());
	%>
	
	$ empty emptyNull <br>
	$ empty emptyStr <br>
	$ empty emptyArr <br>
	$ empty emptyList <br>
	$ empty emptyMap <br>
	
</body>
</html>

6. EL表达式 三元运算 , .点运算符,[]中括号运算符


EL中三元表达式如下:

$ 表达式1?表达式2:表达式3

例如:$ 12>3 ? “胡说3大于12”:true


.点运算,可以输出类对象中某个属性的值,就是负责调用的。

[]中括号运算,可以输出有序集合中某个元素的值。

并且[]中括号运算,还可以输出map集合中key里含有特殊字符的key的值,就像下面的案例一样,本质上就是区分一些特殊字符的情况。

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<% 
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("a.a.a", "value1");
		map.put("b+b+b", "value2");
		map.put("c-c-c", "value3");
		
		request.setAttribute("map", map);
	%>
	<!-- 输出整个map -->
	$ map <br>
	<!-- 输出单个map中a.a.a的值 , 但是输出不到,就是因为 .点运算符 的影响,它以为是a下的a下的a。-->
	$ map.a.a.a 
	<!-- 这个时候就用到了[]中括号运算符了 -->
	$ map['a.a.a'] 或者	$ map["a.a.a"]    <br>
	$ map['b+b+b'] 或者	$ map["b+b+b"] 	<br>
	$ map['c-c-c'] 或者	$ map["c-c-c"] 	<br>
</body>
</html>

7. EL表达式 11个隐含对象

7.1 11个隐含对象


EL表达式的11个隐含对象,是它自己定义的(内置),可以直接使用。

7.2 EL 获取四个特定域中的属性


特定域属性特定域
pageScopepageContext域
requestScopeRequest域
sessionScopeSession域
applicationScopeServletContext域
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<% 
		pageContext.setAttribute("key1", "pageContext1");
		pageContext.setAttribute("key2", "PageContext2");
		request.setAttribute("key1", "request1");
		request.setAttribute("key2", "request2");
		session.setAttribute("key1", "session1");
		session.setAttribute("key2", "session2");
		application.setAttribute("key1", "application1");
		application.setAttribute("key2", "application2");
	%>
	
	<!-- 如果调用默认的,那他自然是按照由小到大获取,只能获取到pageContext设置的属性: -->
	$ key1  <br> $ key2 <br>
	
	*******************<br>
	
	<!-- 我们想要获得其他的就需要EL对应的四个内置对象了 -->
	$ pageScope.key1 <br>
	$ pageScope.key2 <br>
	$ requestScope.key1 <br>
	$ requestScope.key2 <br>
	$ sessionScope.key1 <br>
	$ sessionScope.key2 <br>
	$ applicationScope.key1 <br>
	

以上是关于JavaWeb 学习笔记总结( 二 )的主要内容,如果未能解决你的问题,请参考以下文章

[硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记

JavaWeb Servlet 学习笔记总结( 一 )

javaweb学习总结二十二(servlet开发中常见的问题汇总)

JAVAWEB学习笔记13_servlet

javaweb学习总结二十(http响应)

javaweb学习总结——购物车案列