JavaEE学习day-52:EL表达式和JSTL标签

一、EL表达式

1.EL表达式的概念:

  • 传统方式在jsp中获取数据的弊端

使用脚本段语句获取作用域中的数据的缺陷,书写比较繁琐;需要导包;需要强转。

  • EL表达式的作用:

让 jsp 书写起来更加的方便。简化在 jsp 中获取作用域或者请求数据的写法。也会搭配 Jstl 来进行使用。

2.EL表达式获取请求头数据:

(1)${header} 返回所有的请求头数据,键值对形式。

(2)${header["键名"]} 返回指定的键的请求头数据。

(3)${headerValues["键名"]}。

3.EL表达式获取Cookie数据:

(1)${cookie} 获取所有的Cookie对象 键值对。

(2)${cookie.Cookie对象的键名} 获取存储了指定Cookie数据的Cookie对象。

(3)${cookie.Cookie对象的键名.name}:获取存储了指定Cookie数据的Cookie对象的存储的键。

(4)${cookie.Cookie对象的键名.value}获取存储了指定Cookie数据的Cookie对象的存储的值。

<h3>获取Cookie数据</h3>
${cookie} <br />
${cookie.JSESSIONID} <br />
${cookie.JSESSIONID.name}--${cookie.JSESSIONID.value}

4.获取请求实体数据:

(1)${param.键名}:获取请求实体中一个键一个值的数据。

(2)${paramValues.键名}:获取请求实体中同键不同值的数据,返回的是String数组,可以使用角标直接获取。

<h3>获取用户请求数据(请求实体)</h3>
<%=request.getParameter("uname") %>--${param.uname} <br />
<%=request.getParameterValues("fav")[1] %>--${paramValues.fav[1]}

5.EL表达式获取作用域数据:

(1)获取作用域字符串数据的格式:${键名};

(2)获取作用域对象数据的格式:${键名.属性名};

(3)获取List集合和Map集合的数据的格式:

List:${键名[角标]}。

Map:${map集合作用域存储的键名.map集合存储的数据的键名}。

(4)获取指定作用域数据的格式:

${pageScope.键名}:指明获取pageContext作用域中的数据。

${requestScope.键名}:指明获取request作用域中的数据。

${sessionScope.键名}:指明获取session作用域中的数据。

${applicationScope.键名}:指明获取application作用域中的数据。

(5)EL获取指定作用域数据的查找顺序:

pageContext-->request-->session-->application;

<h3>EL获取作用域数据时作用域的查找顺序</h3>
<%
    pageContext.setAttribute("hello", "hello pageContext");
    request.setAttribute("hello","hello request");
    session.setAttribute("hello", "hello session");
    application.setAttribute("hello", "hello application");
%>
${requestScope.hello}--${a}

6.EL表达式中的运算和empty判断:

(1)算术运算:和普通的加减乘除没什么区别;
(2)逻辑运算:EL中只有&&和||没有&和|。
(3)empty的作用:

作用:判断该键是否有存储有效数据。
使用格式:${empty 键名};

<h3>EL表达式的empty判断</h3>
<%
    request.setAttribute("str","");
    User u=new User();
    request.setAttribute("u", u);
    ArrayList la=new ArrayList();
    request.setAttribute("la",la);

%>
${empty str}<br />
${empty u}<br />
${empty la}<br />

二、JSTL

1.JSTL的概念:

  • jstl的作用:

用来提升在 JSP 页面的逻辑代码的编码效率,使用标签来替换逻辑代码的直接书写,高效,美观,整洁,易读。

  • 使用流程:

(1)导包。
(2)使用 taglib 标签引入资源。
(3)使用jsit的核心标签。

  • 引入JSTL:

引入资源<%@tagliburi="http://java.sun.com/jsp/jstl/core"prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

2.核心标签:

  • out标签:

使用格式:<c:out value="${表达式}" default="默认值"></c:out>;
作用:结合EL表达式将数据响应给浏览器,如果EL表达式没有取到数据则可以使用default属性声明默认值。

  • set标签:

使用格式:set标签: <c:set value="数据" var="键名" scope="作用域名"></c:set>;
作用:将数据存储到指定的作用域中,默认是pageContext作用域。

  • remove标签:

使用格式:<c:remove var="要删除数据的键名" scope="作用域名"/>;
作用:删除作用域中的数据,默认是删除四个作用域中的符合要求的数据。

  • 注意使用remove:

(1)使用pageContext.removeAttriute("键名"),此方法会将四个作用域中的符合要求的数据全部删除。
(2)使用pageContext.removeAttriute(String name,int scope)指明要删除的作用域中的数据 scope的值为 1pageContext,2request ,3 session,4 application。
(3)使用request.removeAttibute("键名"):删除当前作用域符合要求的数据。
(4)使用session.removeAttibute("键名"):删除当前作用域符合要求的数据。
(5)使用application.removeAttibute("键名"):删除当前作用域符合要求的数据。

<%
    request.setAttribute("str","jstl学习");
 %>
 <!-- out标签学习 -->
 <%=request.getAttribute("str") %>--${str}--<c:out value="${str}" default="我是out标签"></c:out>
 <br />
 <!-- set标签学习 -->
 <%
    request.setAttribute("s1","set标签学习");
    
 %>
 <c:set value="set标签学习2" var="s2" scope="request"></c:set>
 <c:set value="hello pageContext" var="hello" scope="page"></c:set>
 <c:set value="hello request" var="hello" scope="request"></c:set>
 <c:set value="hello session" var="hello" scope="session"></c:set>
 <c:set value="hello application" var="hello" scope="application"></c:set>
 ${s1}--${requestScope.s2}
 <br />
 <!-- remove标签学习 -->
<%-- <%
    pageContext.removeAttribute("hello",4);
    //request.removeAttribute("hello");
    //session.removeAttribute("hello");
 %>  --%>
<c:remove var="hello" scope="request"/>
${hello}

3.if和choose标签:

  • if标签:

使用格式:<c:if test="${表达式}">数据</c:if>;
作用:可以根据el表达式进行一定程度的单分支逻辑判断。

  • 注意:

test属性中书写的是EL表达式,或者说是EL表达式的逻辑表达式。该标签只能进行EL表达式相关的逻辑判断。不能进行EL表达式不能获取的数据的逻辑处理。

<c:set var="a" value="12"></c:set>
<%
    int b=4;
    int a=Integer.parseInt((String)pageContext.getAttribute("a"));
    if(a>8){
%>
    <b>今天天气真好,适合学习1</b>
<%} %>
<c:if test="${a>8}">
    <b>今天天气真好,适合学习2</b>
</c:if>
  • choose标签:

<c:choose>
<c:when test="${表达式}"></c:when>

<c:when test="${表达式}"></c:when>
..
<c:otherwise></c:otherwise>
</c:choose>
作用:类似于switch-case。

  • 注意:

符合条件后只会执行一个分支,其他分支不会执行。

<!--多分支逻辑判断  -->
<c:set var="score" value="40"></c:set>
<c:choose>
    <c:when test="${score>=90}">
        <i>奖励苹果电脑一台</i>
    </c:when>
    <c:when test="${score<90&&score>=80}">
        <i>奖励苹果手机一部</i>
    </c:when>
    <c:when test="${score>=70&&score<80}">
        <i>无奖励无惩罚</i>
    </c:when>
    <c:otherwise>
        <i>男女混合双打</i>
    </c:otherwise>
</c:choose>

4.foreach循环标签:

  • foreach标签:

格式:<c:foreach>循环体</c:foreach>

  • foreach中的属性:

(1)begin:声明循环的开始位置。
(2)end:声明循环的结束位置。
(3)step:声明循环的步长。
(4)varStatus:声明变量记录循环状态。
(5)items:声明要遍历的数据,可以是集合和数组等。
(6)var:声明变量记录每次遍历的结果。可以做循环体中使用使用EL表达式获取遍历出来的数据。

  • varStatus属性获取循环状态:

(1)${i.index}获取当次循环的下标。

(2)${i.count}获取当次循环的次数。

(3)${i.first}判断是否是第一次循环。

(4)${i.last}判断是否是最后一次循环。

<c:forEach begin="0" end="5" step="1" varStatus="i">
    <c:if test="${i.count==3}">
        <u>我是第三次循环</u>
    </c:if>
    11111--${i.index}--${i.count}--${i.first}--${i.last}<br />
</c:forEach>

  • 遍历Map和List
<!-- 遍历List集合 -->
<%
    //创建测试数据list
    ArrayList<String> list=new ArrayList<String>();
    list.add("苹果");
    list.add("榴莲");
    list.add("荔枝");
    //将list存储到作用域中
    request.setAttribute("list",list);
    
%>
<c:forEach items="${list}" var="s" varStatus="i">
    ${s}--${i.index}--${i.count}<br />
</c:forEach>
<!--遍历map集合  -->
<%
    //声明Map集合测试数据
    HashMap<String,String> hs=new HashMap<String ,String>();
    hs.put("s1","唱歌");
    hs.put("s2", "跳舞");
    hs.put("s3", "敲代码");
    //将数据存储到作用域中
    request.setAttribute("hs", hs);
%>
<c:forEach items="${hs}" var="s">
    ${s.key}--${s.value}<br />
</c:forEach>

三、使用JSTL修改项目为项目增添查询用户信息功能

1.增添查询用户信息功能

  • 添加查询所用用户的信息:
/**
     * 用户查询
     */
    @Override
    public List<User> selUserInfoDao() {
        //声明jdbc变量
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        List<User> list = null;
        
                try {
                    //创建连接
                    conn = DBUtil.getConnection();
                    //创建sql语句
                    String sql="select * from t_user";
                    //创建slq命令对象
                    ps=conn.prepareStatement(sql);
                    //执行sql命令
                    rs = ps.executeQuery();
                    list = new ArrayList<User>();
                    //遍历rs
                    while(rs.next()){
                        //给变量赋值
                        User us=new User();
                        us.setUid(rs.getInt("uid"));
                        us.setUname(rs.getString("uname"));
                        us.setPwd(rs.getString("pwd"));
                        us.setSex(rs.getString("sex"));
                        us.setAge(rs.getInt("age"));
                        us.setBirthday(rs.getString("birthday"));
                        list.add(us);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }finally{
                    DBUtil.closeAll(rs, ps, conn);
                    
                }
                return list;
   }
  • 在DataServlet中增加查询用户信息方法:
//查询用户信息
    public void selUserInfo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        //获取请求信息
        //处理请求信息
            //创建业务层对象
            UserService us = new UserServiceImpl();
            //调用业务层方法
            List<User> lu = us.selUserInfoService();
            //响应处理结果
                //将结果存储到request作用域中
            request.setAttribute("lu", lu);
            //请求转发
            request.getRequestDispatcher("user/userList2.jsp").forward(request, response);
            return ; 
            
    }
  • 添加用户信息展示的userList.jsp页面:
<%@ page language="java" import="java.util.*,com.zlw.pojo.*" pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE html>
<html lang="zh-cn">
<head>
 <base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="renderer" content="webkit">
<title></title>
<link rel="stylesheet" href="css/pintuer.css">
<link rel="stylesheet" href="css/admin.css">
<script src="js/jquery.js"></script>
<script src="js/pintuer.js"></script>
</head>
<body>
<div class="panel admin-panel">
  <div class="panel-head"><strong class="icon-reorder"> 用户信息列表</strong></div>
  <table class="table table-hover text-center">
    <tr>
      <th width="5%">ID</th>
      <th width="15%">用户姓名</th>
      <th width="10%">密码</th>
      <th width="10%">性别</th>
      <th width="10%">年龄</th>
      <th width="10%">出生日期</th>
      <th width="10%">操作</th>
    </tr>
        <c:forEach items="${lu}" var="u">
            <tr>
              <td width="5%">${u.uid}</td>
              <td width="15%">${u.uname}</td>
              <td width="10%">${u.pwd}</td>
              <td width="10%">${u.sex}</td>
              <td width="10%">${u.age}</td>
              <td width="10%">${u.birthday}</td>
             <td><div class="button-group"> <a class="button border-main" href="cateedit.html"><span class="icon-edit"></span> 修改</a> <a class="button border-red" href="data?method=delUserInfo&uid=${u.uid}" onclick="return del(1,2)"><span class="icon-trash-o"></span> 删除</a> </div></td>
            </tr>
        </c:forEach>
  </table>
</div>
<script type="text/javascript">
function del(id,mid){
    if(confirm("您确定要删除吗?")){            
        
    }
}
</script>
</body>
</html>
新增界面

2.使用JSTL修改项目

  • 将传统的jsp方式获取全部替换为JSTL标签:
  • login.jsp
<!-- 声明jstl进行判断 -->
                        <c:choose>
                            <c:when test="${sessionScope.flag=='loginFalse' }">
                            <div style="text-align: center;color:red;">用户名或密码错误</div>
                            </c:when>
                            <c:when test="${sessionScope.flag=='regSuccess' }">
                            <div style="text-align:center;color:red;">用户注册成功</div>
                            </c:when>
                        </c:choose>
                        <c:remove var="flag" scope="session"/>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容