javaEE EL+JSTL

一 EL

EL可以获取数据,执行运算

1.获取数据

EL获取数据的语法: 1.1 S t r i n g , I n t e g e r {标识符},用于获取作用域中的数据,包括简单数据和对象的数据。 **1.1 获取简单数据** 简单数据指非对象类型的数据,比如String,Integer,基本类型等 获取简单数据的语法: {key},key就是存数据的关键字或属性名,数据通常要保存在作用域对象中,EL在获取数据时,会依次从page,request,session,application域对象中查找数据,找到了就返回数据,找不到就返回空字符串

<%
         //将数据存到page域对象中
         pageContext.setAttribute("name", "张三");
       request.setAttribute("age", 23);
       %>
       EL获取简单数据:${name },age:${age}

1.2 获取javaBean对象数据
EL获取javaBean对象的数据, javaBean是普通的java对象,一个类中只要有公共无参构造方法,私有属性及对应的getXxx(),setXxx()方法,则该类就是一个javaBean类,它的对象就是javaBean对象。
获取javaBean对象数据的语法:${存对象的key.属性名}
例如:

<%  request.setAttribute("u", user); %>
获取javaBean对象的数据
    用户姓名:${u.username},性别:${u.sex },id:${u.id }

1.3 EL获取javaBean对象数据的本质
EL获取javaBean对象数据的本质是在调用javaBean对象属性xxx对应的getXxx()方法,例如执行${u.username},就是在调用对象的getUsername()方法。
常见错误:如果在写javaBean类时,没有提供某个属性xxx对应的getXxx(),
那么在页面上用EL来获取xxx属性值就会报错–属性xxx无法读取(缺少getXxx()方法)
在这里插入图片描述

注意:使用EL语法获取javaBean对象数据${对象的key.xxx},类中可以没有xxx属性,只要有getXxx()就可以了。
在这里插入图片描述

1.4 EL访问javaBean对象的关联对象的数据
语法:${对象key.关联对象名.属性名}

例如:${u.address.name },相当于调用user对象的getAddress().getName()

1.5 EL访问List集合指定位置的数据
语法: k e y [ ] . {存集合的key[下标].对象的属性名}或 {存集合的key[下标]}

<%
		//创建一个List集合
		User user1 = new User(1, "令狐冲", "男");
		User user2 = new User(2, "岳不群", "男");
		List<User> users = new ArrayList<User>();
		users.add(user1);
		users.add(user2);
		//把List集合存到request域对象中
		request.setAttribute("list", users);
		List<String>  strs=new ArrayList<String>();
		strs.add("武汉");
		strs.add("成都");
		strs.add("上海");
		request.setAttribute("strs", strs);
	%>
  EL获取List集合指定位置(下标)的数据:${list[0].username },  ${strs[1] }

1.6 EL访问Map集合指定key的数据
语法:${存集合的key.map中的key}

<%	//创建一个Map集合
		Map<String,String>  map=new HashMap<String,String>();
		map.put("a", "aaa");
		map.put("b", "bbb");
		map.put("c", "ccc");
		//把Map集合存到request域对象中
		request.setAttribute("map", map);%>

获取Map中的数据:${map.b}
注意:EL在获取Map数据时,如果key是数字组成的,那么要把点改成[“key”],中括号语法是万能的,EL中所有用.符号的都可以改成[]

EL获取Map集合指定key的数据:${map.b}, ${map["11"] },${map["a"] }

2.执行运算

2.1 关系运算符

运算符 别名
> gt
>= ge
< lt
<= le
== eq
!= ne

尽量使用别名
2.2 逻辑运算符
与:&& ,别名and
或:||,别名or
非: !,别名not
2.3 三元运算符
?:,例如:${5 gt 3?“aa”:“bb”}
2.4 特殊运算符
empty:
1.断 EL 表达式中的对象是否为 null(空)或者字符串是否为空,也可判断集合是否为空集(没有任何元素的集合)
2.判断对象:如果对象为null,empty运算符返回true,否则返回false
3.判断字符串:字符串为空串返回true,否则返回false
4.判断集合:集合为空集返回true,否则返回false

3.获取web开发常用对象

重点:
1).4个XxxScope对象,Xxx表示作用域对象
EL中的隐含对象${XxxScope}代表4个作用域中保存属性数据的Map
pageScope:page域中保存属性数据的Map对象,因为作用域对象存数据时用的setAttribute()方法本质上就是用一个Map来存数据(setAttribute()相当于Map中的put()),Map就是保存属性数据的容器
requestScope:request域中保存属性数据的Map对象

<%
  //将数据存到作用域对象中
 pageContext.setAttribute("book", "三国演义");
request.setAttribute("book", "西游记");
session.setAttribute("book", "红楼梦");
application.setAttribute("book", "水浒传");
%>
获取数据:${book }<hr>
<h2>依次获取4个作用域对象中的数据</h2>
page域中的数据:${pageScope.book}<br>
request域中的数据:${requestScope.book}<br>
session域中的数据:${sessionScope.book}<br>
application域中的数据:${applicationScope.book}<br>

注意:只有当多个作用域中存储了相同名称(key)的数据时,就要用XxxScope来进行指定到底从哪个作用域对象中获取数据
2)param:代表保存了所有请求参数的Map,jsp引擎会将所有请求参数存储到Map中,
调用map.put(请求参数名,参数值)
通过param对象获取请求参数的值:${param.请求参数名}
3)header:代表保存了所有http请求头字段的Map
通过header对象获取请求头字段值:${header.请求头字段的名称}

EL获取请求中的每个参数的值:${param.uname },${param.sex }
    EL获取http请求头字段的值:${header.Host }

4.调用java对象的方法

调用java对象的非getXxx()方法的语法:${对象的key.方法()},如果是要调用getXxx(),直接写${对象的key.xxx}
例如:

<%
		//将数据存到作用域对象中
		List<String> list = new ArrayList<String>();
		list.add("111");
		list.add("222");
		request.setAttribute("list", list);
	%>
	调用集合的方法:${list.size() }

EL代码示例

二 JSTL

JSTL即jsp标准标签库,是一组标签的集合。
2.1 流程控制标签
1)if标签
执行最简单的条件判断,
<c:if test=“条件表达式”>
满足条件时执行的代码
</c:if>
2)choose,when,otherwise标签
这3个标签通常一起使用,choose标签作为when和otherwise的父标签

<c:choose>
   <c:when   test=”条件1>
         内容1
   </c:when>
  <c:when   test=”条件2>
         内容2
   </c:when>
  ....
  <c:otherwise>
      内容n
  </c:otherwise>
</c:choose>

相当于java中的多重if判断结构,c:when可以有多个,c:otherwise只能有1个
强调:只要页面上用了标签,都必须在页面上引入标签库

<!-- 引入JSTL中的核心标签库.uri:标签库的网络路径 prefix:使用标签的前缀 -->
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c" %> 

2.2 循环标签

1).forEach标签:用于遍历集合或数组
必须属性:var和items
可选属性:varStatus, beign和end,step
<c:forEach var=”name” items=”Collection” [varStatus=”StatusName” ] [begin=”begin”] [end=”end”] [step=”step”]>
补充:forEach标签的特殊用法
forEach标签还可以遍历一组连续的数字,语法:
<c:forEach var=”name” begin=”最小值” end=”最大值”>
使用这种语法遍历一组连续的数字,jsp引擎会将每次遍历出来的数字用var作为key,数字本身作为value存到page域对象中

<h2>遍历一组连续的数字</h2>
    <c:forEach var="sn"  begin="1" end="10">
        ${sn }<br>
    </c:forEach>

2).forTokens标签:用指定的字符将字符串截取,遍历分割后的字符串数组

<!-- 
       forTokens标签,使用某个字符来分割字符串,并迭代分割后的字符串数组 ,3个必需属性:
         1.var:设定一个变量名,用该变量存储每次从字符串数组中遍历出来的字符串
         2.items:要分割的字符串
         3.delims:指定使用什么分割符
     -->
       <h2>遍历分割后的字符串数组</h2>
      
      <c:forTokens items="武汉,天津,上海" delims="," var="str">
          ${str }<br>
      </c:forTokens>

JSTL代码示例

综合案例:改造昨天的crud案例

需求 1–将列表页面list.jsp上的for循环改造成forEach标签
第1步:在list.jsp页面上引入jstl标签库

<!-- 引入标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>

第2步:将集合存到request域对象中,用forEach标签来遍历集合

<%
			StudentDao dao = new StudentDaoImpl();
			List<Student> list = dao.queryAll();
		    //将集合存到request域中
		    request.setAttribute("stus", list);
		%>
		<c:forEach var="st" items="${stus }">
		<tr>
			<td>${st.id }</td>
			<td>${st.name }</td>
			<td>${st.sex }</td>
			<td>${st.email }</td>
			<td>${st.age }</td>
          <td>
            <!-- 如果点超链接时,需要响应js事件,那么建议把href写成
            javascript:void(0)或者javascript:;表示让超链接不作任何跳转,只响应js事件 -->
          <a href="javascript:void(0)" onclick="deleteById(${st.id})" >删除</a></td>
		</tr>
		</c:forEach>

需求 2–加入修改学生的功能
第1步:点击“修改”超链接时,发一个查询请求,根据id查询原始记录,跳转到修改页面上回显数据
List.jsp页面上给一个修改超链接,把id发送给update.jsp

 <a href="update.jsp?id=${st.id }">修改</a>

Update.jsp页面上根据获取的id查询学生的记录, 并回显到页面上

<form action="doUpdate.jsp" method="post">
    <!-- 将学生的id存到只读的文本框中,就不能被修改了,也可以将id存到隐藏域中 -->
 <input type="text" name="id" value="${stu.id}" readonly><br>
  <%-- <input type="hidden" name="id" value="${stu.id}"><br> --%>
    姓名:<input type="text" name="uname" value="${stu.name }"> <br>
  性别:<input type="radio" name="sex" value="男" ${stu.sex eq '男'?'checked':'' } ><input type="radio" name="sex" value="女" ${stu.sex eq '女'?'checked':'' }><br>
 邮箱 :<input type="text" name="email" value="${stu.email }"> <br>
年龄:<input type="text" name="age" value="${stu.age }"> <br>
 <input  type="submit"  value="修改">
  </form>

第2步:在doUpdate.jsp页面上处理修改请求,将表单中传来的数据封装成一个新的对象,再调用Dao中的修改方法

<%
		//设置请求编码,防止中文乱码
		request.setCharacterEncoding("UTF-8");
		//获取表单中传过来的参数的值
		//获取id
		 int id=Integer.parseInt(request.getParameter("id"));
		String name = request.getParameter("uname");
		String sex = request.getParameter("sex");
		String email = request.getParameter("email");
		int age = Integer.parseInt(request.getParameter("age"));
		//调用Dao中的修改方法
		Student stu = new Student();
		stu.setId(id);
		stu.setName(name);
		stu.setSex(sex);
		stu.setEmail(email);
		stu.setAge(age);

		StudentDao dao = new StudentDaoImpl();
		int i = dao.update(stu);
		if (i > 0) {
			//跳转到list.jsp页面,刷新页面,response.sendRedirect:重新发请求到新页面
			response.sendRedirect("list.jsp");
		}
	%>

猜你喜欢

转载自blog.csdn.net/qq_41532872/article/details/87293695
今日推荐