七、jsp基础(四)- EL表达式

一、 jsp的最佳实践

	Servlet技术: 开发动态资源。是一个java类,最擅长写java代码
	jsp技术: 开发动态资源。通过java代码最擅长输出html代码。


	各取所长:
		在web项目中涉及到逻辑:
			1)接收参数      		    servlet做
			2)处理业务逻辑,返回结果    	servlet做
			3)显示数据到浏览器      	jsp做
			4)跳转到其他页面        	servlet做


	servlet+jsp模式

				 servlet:
						1)接收参数
						2)处理业务逻辑
						3)把结果保存到域对象中
						4)跳转到jsp页面
					Jsp:
						1)从域对象取出数据
						2)把数据显示到浏览器
				
				servlet的数据    ->   jsp页面
				List<Contact>    使用域对象 共享数据

jsp的最佳实践

		jsp的最佳实践:servlet+jsp模式
			
		jsp的核心语法: jsp表达式 <%=表达式  %>和 jsp脚本<%  %>。
		以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。

二、EL表达式

2.1 EL表达式的作用

		jsp的核心语法: jsp表达式 <%=表达式  %>和 jsp脚本<%  %>。
		以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。
		使用EL表达式替换掉jsp表达式。
		EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!
		语法: ${变量或表达式}

		使用EL表达式,不需要导包,jsp中自带
		EL(Expression Language)表达语言。 目的:为了使JSP写起来更加简单。
	    EL表达式格式${key值}
	    EL表达式可以从pageContext、request、session和application中取值。
		EL表达式取值的顺序是先从pageContext开始,逐一查找request、session、application,找到了显示对应的value值,没找到,什么都不显示
		EL表达式可以做运算,加减乘除,逻辑等运算
		

2.2 EL表达式的语法

		    1)输出基本数据类型变量
					1.1 从四个域自动搜索
						${name}
								相当于pageContext.findAttribute("name")
								(取数顺序:page->request->session->context)
					
					1.2 从指定域获取
						${pageScope.name}
                   		域范围: pageScope / requestScope / sessionScope / applicationScope
		
								相当于pageContext.findAttribute("name",REQUEST_SCOPE)
								
		    2)输出对象的属性值
						${s.name}
							  	相当于pageContext.findAttribute("s").getName()
					
			3)输出集合对象					
				   输出List集合
				   			${list[0]}
				   			${list[1]}  
					
				   输出map集合
				  			${map["s0"]}
				   			${map["s1"]} 
	
			4)在el表达式中调用对象的方法
			
						${student.getNameT()}	调用对象的方法
												
												get方式简写:${student.name}	
						
						${list1.size()}
						${list1.get(0)}			调用list的方法

									
						${map1.size()}
						${map1.get("key1")}		调用map的方法


			4)EL表达式计算
					算数运算
							${10+5}
							${10/5}
					
					比较运算
							${10>5}
				
					逻辑
							${true && false}
							${true  || false}
					
					字符串判空
							${str==null}  判断null的情况
							${str==""}	  判断空字符串的情况
							
							字符串判空	
									方式一:
										${str==null||str==""}
									方式二:
		  								${empty  str}
				   其他
				   			${score>20 ||score <30}
				   			${! empty str }
							${name== 'hlp'} 比较字符串是否相同
							
2.2.1 输出基本类型数据
	输出基本类型数据
			${name } 相当于 pageContext.findAttribute("name")
	
			${pageScope.name}  
			${requestScope.name}  
			${sessionScope.name }
			${applicationScope.name}   相当于pageContext.findAttribute("name",scope)
			

例子:

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>

	<%
		request.setAttribute("name", "request_msg");
		session.setAttribute("name", "session_msg");
		application.setAttribute("name", "context_msg");
		
	%>
	
	<!-- 从四个域自动搜索 -->
	${name } <br/>
	
	<!-- 从指定域搜索 -->
	从request域中获取:${requestScope.name}   <br/>
	从session域中获取:${sessionScope.name }  <br/>
	从context域中获取:${applicationScope.name} <br/>

</body>
</html>
2.2.2 输出对象的属性
输出对象的属性
	${student.name}  相当于pageContext.findAttribute("student").getName()
	${student.age}   相当于pageContext.findAttribute("student").getAge()
	
	注意:
		使用EL表达式输出对象的属性值,其实是调用该对象的属性值的get方法
		${studeng.xxx}  相当于pageContext.findAttribute("student").getXxx()
		
		如:
			如果Student的属性值为name,获取name属性值的get方法为getNameT();
			则使用 ${student.name} 是获取不到数据的
			而使用${studeng.nameT} 是可以获取到数据。
		
使用el表达式获取对象的属性值,其实相当于调用该对象的属性值的get方法。因为属性值是私有的,访问不到。	

例子:

获取Student类的name属性,el表达式:  ${student.name}

将Student类的name属性的get方法,将名称由getName改为getNameT。
此时el表达式需要改为 : ${student.nameT}

Student.java

public class Student {
	
	private String name;
	private int age;
	
	//注意:该get方法的名称
	public String getNameT() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

TestServlet.java


public class TestServlet  extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Student s=new Student();
		s.setAge(12);
		s.setName("xiaolu");
		req.setAttribute("student", s);
		
		req.getRequestDispatcher("/NewFile.jsp").forward(req, resp);
	}
}

NewFile.jsp

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
	
	<!-- 输出对象的属性值 -->
	输出对象的属性值: ${student.nameT} <br/>
					 ${student.age}  <br/>
	
</body>
</html>
2.2.3 输出集合
	el表达式没有遍历功能

输出List集合

	##输出List集合
			${list[0]}  
			${list[1]}  相当于pageContext.findAttribute("list").get(0)
	方式2:
			${list.get(0)}  
			${list.get(1)} 相当于pageContext.findAttribute("list").get(0)
	
	##获取list的长度
			${list.size()}  
						

例1:
TestServlet .java

public class TestServlet  extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Student s=new Student();
		s.setAge(12);
		s.setName("xiaolu");
		
		Student s2=new Student();
		s2.setAge(12);
		s2.setName("xiaolu");
		
		List list=new ArrayList<Student>();
		list.add(s);
		list.add(s2);
		req.setAttribute("list", list);
		
		req.getRequestDispatcher("/NewFile.jsp").forward(req, resp);
	}

NewFile.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>

	<!-- 输出List对象 -->
	方式一:
		  ${list}             <br/>
		  ${list[0].name} -  ${list[0].age}          <br/>
		  ${list[1].name} -  ${list[1].age}          <br/>

	方式二:
		  ${list}             <br/>
		  ${list.get(0).name} -  ${list.get(0).age}          <br/>
		  ${list.get(1).name} -  ${list.get(1).age}          <br/>
</body>
</html>

输出map集合


		  ${map}    
		  			    输出map对象    
		      
		  ${map["student1"].name}
		  ${map["student2"].name} 
						相当于pageContext.findAttribute("map").get("student2")
						

例1:
TestServlet .java

public class TestServlet  extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Student s=new Student();
		s.setAge(12);
		s.setName("xiaolu");
		
		Student s2=new Student();
		s2.setAge(12);
		s2.setName("xiaolu");
		
		Map<String, Student> map=new HashMap<String, Student>();
		map.put("student1", s);
		map.put("student2", s2);

		req.setAttribute("map", map);
		req.getRequestDispatcher("/NewFile.jsp").forward(req, resp);
	}
}

NewFile.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>

	<!-- 输出map对象 -->
	方式一:
		  ${map}             <br/>
		  ${map["student1"].name} -	  ${map["student1"].age}         <br/>
		  ${map["student2"].name} -	  ${map["student2"].age}         <br/>

</body>
</html>

2.3 总结

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>EL语法</title>  
  </head>
  
  <body>
    <%
	 String name = "rose";  
	 //放入域中
	 //pageContext.setAttribute("name",name);
	 pageContext.setAttribute("name",name,PageContext.REQUEST_SCOPE); 
	  %>
	  <%=name %>
	  <br/>
	  <%--
	  1)从四个域自动搜索
	   --%>
	  EL表达式: ${name }
	  <%--
	  	${name } 等价于
	  	    <%=pageContext.findAttribute("name")%>
	   --%>
	   <%--
	    2) 从指定的域中获取数据
	    --%>
	    EL表达式: ${pageScope.name }
	    <%--
	    	${pageScope.name } 等价于
	    	 <%= pageContext.getAttribute("name",PageContext.PAGE_SCOPE)%>
	    	
	     --%>
  </body>
</html>

<%@ page language="java" import="java.util.*,gz.itcast.b_entity.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>EL输出不同类型的数据</title>  
  </head>
  
  <body>
    <%--
		1)EL输出对象的属性    
     --%>
     <%
     	//保存数据
     	Student student = new Student("eric",20);
     	//放入域中
     	pageContext.setAttribute("student",student);
     	
     	//List
     	List<Student>  list = new ArrayList<Student>();
     	list.add(new Student("rose",18));
     	list.add(new Student("jack",28));
     	list.add(new Student("lucy",38));
     	//放入域中
     	pageContext.setAttribute("list",list);
     	
     	//Map
     	Map<String,Student> map = new HashMap<String,Student>();
     	map.put("100",new Student("mark",20));
     	map.put("101",new Student("maxwell",30));
     	map.put("102",new Student("narci",40));
     	//放入域中
     	pageContext.setAttribute("map",map);
     	
      %>
      
      <%--使用EL获取对象 --%>
      ${student.name} - ${student.age }
      <%--
       ${student.name} 等价于     (点相对于调用getXX()方法)
          <%=((Student)pageContext.findAttribute("student")).getName()%>
       --%>
       
       <hr/>
       <%--使用EL获取List对象 --%>
       ${list[0].name } - ${list[0].age }<br/>
       ${list[1].name } - ${list[1].age }<br/>
       ${list[2].name } - ${list[2].age }
       <%--
       list[0]等价于       (中括号相对于调用get(参数)方法)
       		((List)pageContext.findAttribute("list")).get(0)
        --%>
        <hr/>
        <%--使用EL获取Map对象 --%>
        ${map['100'].name } -  ${map['100'].age }<br/>
        ${map['101'].name } -  ${map['101'].age }<br/>
        ${map['102'].name } -  ${map['102'].age }<br/>
  </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>EL表达式计算</title>  
  </head>
  
  <body>
    <%--
    	1)算术表达式
    	  +  -  *  /
     --%>
     ${10+5 }<br/>
     ${10*5 }
     <hr/>
     <%--
    	2)比较运算
    	>  <  >=  <=  ==   !=
     --%>
     ${10>5 }<br/>
     ${10<5 }<br/>
     ${10!=10 }
     <hr/>
     <%--
    	3)逻辑运算
    	 &&  ||  !
     --%>
     ${true && false }<br/>
     ${true || false }<br/>
     ${!false }<br/>
     <hr/>
      <%--
    	4)判空
    	null 或 空字符串:  empty
     --%>
     <%
     	//String name = "eric";
     	//String name = null;
     	String name = "";
     	pageContext.setAttribute("name",name);
      %>
      判断null: ${name==null }<br/>
      判断空字符: ${name=="" }<br/>
     判空:  ${name==null || name=="" }
     另一种判空写法: ${empty name }
     
         
  </body>
</html>
在这里插入
码片
发布了94 篇原创文章 · 获赞 0 · 访问量 653

猜你喜欢

转载自blog.csdn.net/weixin_45602227/article/details/103943514