EL&JSTL

EL&JSTL&综合案例

案例一、显示所有用户案例

一、案例需求

在这里插入图片描述

二、技术分析

1、EL表达式
1.1.El概述

​ Expression Language:表达式语言, jsp2.0之后内置在jsp里面

​ 目的:为了使JSP写起来更加简单。(代替脚本 <% %>)

1.2.EL语法

​ ${el表达式}

1.3.EL表达式的用途

​ 1.获取数据. 获取的是域对象中存储的数据(先把数据存到域对象里面, 再通过el来获得)

​ 2.EL执行运算

1.4.El获取数据
1.4.1获取简单数据类型数据

​ 语法:${requestScope|sessionScope|applicationScope.key};

​ 快捷写法:${key},

​ 属性名就是存在域对象里面的key

<body>
    <%
        request.setAttribute("rKey","rrr");
        session.setAttribute("sKey","sss");
        /*application就是Servlet里面的ServletContext*/
        application.setAttribute("aKey","aaa");
    %>

    获得request里面存的数据:<br/>
    老方式:<%=request.getAttribute("rKey")%><br/>
    el方式: ${requestScope.rKey}<br/>
    <hr/>

    获得session里面存的数据:<br/>
    老方式:<%=session.getAttribute("sKey")%><br/>
    el方式: ${sessionScope.sKey}<br/>
    <hr/>

    获得application里面存的数据:<br/>
    老方式:<%=application.getAttribute("aKey")%><br/>
    el方式:${applicationScope.aKey}
    <hr/>

    简单方式的写法:<br/>
    <%--${rKey}: 依次的从最小的域往最大的域找,能找到就返回--%>
    获得request里面的数据:${rKey}<br/>
    获得session里面的数据:${sKey}<br/>
    获得servletContext里面的数据:${aKey}<br/>

</body>
1.4.2获取数组

​ 语法: ${数组属性名[index]};数组属性名就是存入域对象里面的key

1.4.3获取list

​ 语法: ${list属性名.get(index)} 或者 ${list属性名[index]};list属性名就是存入域对象里面的key

1.4.4获取Map

​ 语法: ${map属性名.get(键)}或者${map属性名.键} ,map属性名就是存入域对象里面的key

    <%
        String[] array = {"aaa","bbb","ccc"};
        request.setAttribute("a",array);

        List<String> list = new ArrayList<String>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        session.setAttribute("l",list);

        Map<String,String> map = new HashMap<String,String>();
        map.put("akey","aaa");
        map.put("bkey","bbb");
        map.put("ckey","ccc");
        request.setAttribute("m",map);
    %>

    获得数组里面的第2个值:<br/>
    老方式:<%=((String[])request.getAttribute("a"))[1]%><br/>
    el方式: ${a[1]} <br/>
    <hr/>
    获得list里面的第1个值:<br/>
    老方式:<%=((List<String>)session.getAttribute("l")).get(0)%><br/>
    el方式: ${l[0]}  <br/>
    <hr/>
    获得map里面的akey对应值:<br/>
    老方式:<%=((Map<String,String>)request.getAttribute("m")).get("akey")%><br/>
    el方式:${m.akey}   <br/>
1.4.5 获取bean

​ 语法:${key.javabean属性}

​ 依赖getxxx()方法; eg: getPassword()—去掉get–>Password()----首字母小写—>password

   <%
        User user = new User("zs", "123456", 18);
        request.setAttribute("u",user);
    %>

    获得密码:<br/>
    老方式:<%=((User)request.getAttribute("u")).getPassword()%><br/>
    el方式:${u.password}  <br/>
    <hr/>

[ ]和.方式的区别

​ 只要是能用.的都可以使用[ ]

​ 带下标(数组,list)要用[ ]

​ 有特殊字符的要用[ ]

  • 获取的是三个域范围的值,存入三个域中

  • 能获取到则获取,获取不到返回" "字符串 ,不是返回null

  • ${域中属性名}:依次从requestScope|sessionScope|applicationScope中查找指定的属性

    ​ 若找到,立即返回,且结束该次查找

    ​ 若找不到返回""

  • 若属性名中出现了".""+""-"等特殊的符号的时候,快捷获取的方式不好使,必须使用以下方式:

    ​ ${xxxScope[“属性名”]}

特殊情况:

 <%
    request.setAttribute("a.b.c.d","rrr");

    Map<String,String> map = new HashMap<String,String>();
    map.put("a.akey","aaa");
    map.put("bkey","bbb");
    map.put("ckey","ccc");
    request.setAttribute("m",map);
%>

    ${a.b.c.d}
    ${requestScope['a.b.c.d']}<br/>

    #{m['a.akey']}

    <br/>
1.4.EL执行运算

在这里插入图片描述

1.4.1算数运算

​ +,-,*,/

  • +不能拼接字符串.
1.4.2逻辑运算

​ < >= <= != ==

1.4.3关系运算

​ && || !

1.4.4非空判断(重点)

​ empty,判断一个对象是否为null,判断集合长度是否为0, 判断一个字符串是否为""

​ not empty

​ 语法: ${empyt key};属性名 就是域对象里面的key值

<body>
    <%
        //request.setAttribute("a",10);
        User user = null;
        request.setAttribute("u",user);

        User user1 = new User();
        request.setAttribute("u1",user1);

        List list = new ArrayList();
        request.setAttribute("l",list);

        List list02 = null;
        request.setAttribute("l2",list02);
    %>

    <%--a就是从域里面获得的a
        ${a+19}
        ${a>20}
    --%>
    <%--1.判断对象(user是)否为null--%>
    ${empty u} <%--true--%>
    ${empty u1} <%--false--%>

    ${not empty u}<%--false--%>
    <hr/>
    <%--2.判断一个集合的长度是否为0--%>
    ${empty l} <%--true--%>
    ${empty l2} <%--true--%>

</body>

注意的地方:

​ +只能做加法运算,不能拼接字符串

2,JSTL标签库
2.1.JSTL概述

​ JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。

​ 目的: 为了简化在jsp页面上展示数据 (遍历数据 判断数据)

2.2JSTL五大标签库

在这里插入图片描述

​ jstl的标签内容有很多,现在目前还常用的标签只有核心标签库里面的 if、choose、foreach标签,接下来我们一个一个学习。

​ jstl标签库,JSP并没有内置进来, 所以我们要使用的话, 就需要导入标签库的jar包

2.3.核心标签库
2.3.1使用步骤:
  • 导入jar包在这里插入图片描述
  • 在页面上导入核心标签库<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.3.2if标签【重点】

在这里插入图片描述

  • 语法
<c:if test="${el表达式}" [var="给之前的表达式的结果起个名字"] [scope="将结果保存在那个域中 默认page"]>
	
</c:if>
  • 实例
	<%request.setAttribute("a", 3); %>

	<c:if test="${a>1}" var="i" scope="page">
		a大于1
	</c:if>
	
	<c:if test="${a<=1}">
		a不大于1
	</c:if>
	
	${i }
2.3.2choose标签
  • ​实例
	<%
		request.setAttribute("a", "前端");
	%>

	<c:choose> 
		<c:when test="${a == 'java' }">
			java
		</c:when>

		<c:when test="${a == 'Android' }">
			Android
		</c:when>


		<c:when test="${a == 'IOS' }">
			IOS
		</c:when>
		
		<c:otherwise>
			其它
		</c:otherwise>
	</c:choose>
2.3.3foreach标签【重点】

在这里插入图片描述

  • 简单的使用:
    在这里插入图片描述

  • 复杂的使用:
    在这里插入图片描述

  • c:forEach中的varStatus属性。

    	  指向一个字符串,该字符串引用一个对象。  map.put("vs",一个对象);

     	  这个对象记录着当前遍历的元素的一些信息:

       		   index:返回索引。从0开始

        		   count:返回计数。从1开始

       		   last:是否是最后一个元素

        		   first:是否是第一个元素	

三、思路分析

在这里插入图片描述

四、代码实现

1.准备工作
  • 数据库的创建
CREATE TABLE user (
  id int primary key auto_increment,
  name varchar(50),
  sex varchar(50),
  age int,
  address varchar(50),
  qq varchar(50),
  email varchar(50)
);

INSERT INTO `user`  (`id`, `name`, `sex`, `age`, `address`, `qq`, `email`) VALUES
(null, '张三', '男', 11, '广东', '766335435', '766335435@qq.com'),
(null, '李四', '男', 12, '广东', '243424242', '243424242@qq.com'),
(null, '王五', '女', 13, '广东', '474574574', '474574574@qq.com'),
(null, '赵六', '女', 18, '广东', '77777777', '77777777@qq.com'),
(null, '钱七', '女', 15, '湖南', '412132145', '412132145@qq.com'),
(null, '王八', '男', 25, '广西', '412132775', '412132995@qq.com');
  • JavaBean的创建
public class User {

    private int id;
    private String name;
    private String sex;
    private int age;
    private String address;
    private String qq;
    private String email;
    
	// getter and setter and toString
  
}
  • 导入页面
  • 导入jar(连接池,JDBCTemplate,jstl标签库,驱动)和工具类
2.代码
  • 页面
<a href="${pageContext.request.contextPath}/userServlet">查询所有的用户</a>
  • UserServlet
@WebServlet(name = "UserServlet",value = "/userServlet")
public class UserServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            //1.调用业务
            UserService userService = new UserService();
            List<User> list =  userService.findAll();
            //2. 把list存到域对象里面
            request.setAttribute("list",list);
            request.getRequestDispatcher("/list.jsp").forward(request,response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

}
  • UserService
public class UserService {
    public List<User> findAll() throws Exception {
        UserDao userDao = new UserDao();
        return  userDao.findAll();
    }
}
  • UserDao
public class UserDao {

    public List<User> findAll() throws Exception {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(C3P0Utils.getDataSource());
        return jdbcTemplate.query("select * from user",new BeanPropertyRowMapper<>(User.class));
    }
}

五,开发模式

1.JSP的开发模式一

​ JSP + JavaBean

​ javaBean:实体类。特点:私有化的属性、公共的getter setter方法、无参的构造。
在这里插入图片描述

2.JSP的开发模式二

​ JSP + Servlet + JavaBean 称为MVC的开发模式.

​ MVC:开发模式、

​ M:model 模型 (javaBean:封装数据)

​ V:View 视图 (JSP:展示数据)

​ C:controller 控制器 (Servlet:处理逻辑代码,做为控制器)
在这里插入图片描述

3.三层架构

​ 高内聚,低耦合
在这里插入图片描述

三层架构包名:

简单:

com.viking.web

​ com.viking.service

​ com.viking.dao

​ com.viking.domain/bean/pojo

​ com.viking.utils

​ com.viking.constants

​ …

复杂:

com.viking.项目名.模块名.web

​ com.viking.项目名.模块名.service

​ com.viking.项目名.模块名.dao

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值