JavaWeb = EL表达式,jstl标签库详解

EL表达式,jstl标签库,三层架构

一.EL表达式

1.概述:

表达式语言(Expression Language)

作用:主要用来代替jsp中脚本的功能,简化对java代码的操作。

语法:${表达式}

2.使用

获取值:获取域中的值:EL表达式==只能==从域对象(4个域)中获取数据

语法:

* 标准
	1. ${pageScope.键名} 
			从page域中获取指定键名对应的值

	2. ${requestScope.键名} 
			从request域中获取指定键名对应的值

	3. ${sessionScope.键名} 
			从session域中获取指定键名对应的值

	4. ${applicationScope.键名} 
			从servletContext域中获取指定键名对应的值
		
* 简化
	${键名}
		特点:默认从最小域开始找,找到后直接显示,不在继续寻找
		小结:要求四个域键名唯一
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo1</title>
</head>
<body>
<h3>el表达式基本语法</h3>
<%
    /*模拟servlet向域中存值....*/
    // pageContext.setAttribute("username", "老师");
    request.setAttribute("username", "小老师");
    request.setAttribute("age", 33);
    session.setAttribute("sex", "女");
    application.setAttribute("address", "小本");
%>
<h5>标准语法</h5>
${pageScope.username} <br> <%--不会出现空指针异常问题--%>
${requestScope.age} <br>
${sessionScope.sex}<br>
${applicationScope.address}<br>
<h5>简化语法</h5>
${username} <br>
${age} <br>
${sex}<br>
${address}<br>
</body>
</html>

获取集合的值语法:

1. 获取字符串
		${键名}
		
2. 获取对象(User)
		${键名.属性名}

3. 获取List(Array)集合
		${键名[索引]}

4. 获取Map集合
		${键名.key}
		${键名["key"]}
		
5. 注意
	el不会出现null和索引角标越界问题
<%@ page import="cn.wsl.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo2</title>
</head>
<body>
<h3>获取user对象</h3>
<%
    User user = new User("大名", 13, "男");
    request.setAttribute("user", user);
%>
${user} <br> <%--执行该对象的toString方法--%>
${user.username} | ${user.age} | ${user.sex} <br>


<h3>获取list集合</h3>
<%
    List<Object> list = new ArrayList<>();
    list.add("胖");
    list.add("夫");
    list.add("静");
    list.add(user);
    request.setAttribute("list", list);
%>
${list}<br><%--执行该对象的toString方法--%>
${list[0]} | ${list[1]} | ${list[2]} | ${list[3].username} | ${list[10]} <br> <%--el表达式不会出现 集合(数组)角标越界异常--%>


<h3>获取map集合</h3>
<%
    Map<String, Object> map = new HashMap<>();
    map.put("key1", "僧");
    map.put("key2", "子");
    map.put("key3", "青");
    map.put("key.4", user);
    request.setAttribute("map", map);
%>
${map}<br><%--执行该对象的toString方法--%>
${map.key1} | ${map.key2} | ${map.key3} | ${map["key.4"].username}<br>
</body>
</html>

2.执行运算

算数运算符
		语法: + - * /(div) %(mod)
		
比较运算符
		语法:> < >= <= ==(eq) !=(ne)
		
逻辑运算符
		语法:&&(and) ||(or) !(not)
		
 三元运算符
		语法:${条件表达式?为真:为假}

------------------------------

 空运算符
 		语法:${not empty 对象}
 		功能:
 			可以判断字符串和对象是否为空
 			可以判断一个集合的长度是否为0
<%@ page import="cn.wsl.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo3</title>
</head>
<body>
<%
    int a = 4;
    int b = 3;
    request.setAttribute("a", a);
    request.setAttribute("b", b);
%>
<h5>算数运算符</h5>
${a / b} | ${a div b} <br>
${a % b} | ${a mod b}<br>

<h5>比较运算符</h5>
${a == b} | ${a eq b}<br>
${a !=b } | ${a ne b} <br>

<h5>三元运算符</h5>
${a == b ? "a相等b" : "a不等b"} <br>

<h5>非空判断</h5>
<%
    User user = new User();
    request.setAttribute("user", user);

    List list = new ArrayList();
    list.add("aa" );
    request.setAttribute("list", list);
%>
user对象:${not empty user} <br> <%--  if(user !=null ){} --%>
list集合:${not empty list} <br> <%-- if(list !=null && list.size>0 ){}--%>

<h5>空值判断</h5>
user对象:${empty user} <br> <%--  if(user ==null ){} --%>
list集合:${empty list} <br> <%-- if(list ==null || list.size==0 ){}--%>
</body>
</html>

3.隐式对象

* el表达式中有11个隐式对象

        pageContext
            就是jsp九大内置对象之一,他可以获得其他八个内置对象
        cookie
            可以获取浏览器指定cookie名称的值

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo4</title>
</head>
<body>
<h3>el隐式对象..</h3>
${pageContext.request.contextPath}  动态获取:项目名称(虚拟路径) <br>

${cookie.JSESSIONID.value} 获取指定cookie名称的值... <br>
</body>
</html>

注意事项:

* jsp默认支持el表达式
        servlet2.3规范中,默认不支持el表达式

* 如果要忽略el表达式
    1)忽略当前jsp页面中所有的el表达式
        设置jsp中page指令中:isELIgnored="true" 属性
    2)忽略单个el表达式
        \${表达式}

isELIgnored="false"

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>demo4</title>
</head>
<body>
<h3>el隐式对象..</h3>
${pageContext.request.contextPath}  动态获取:项目名称(虚拟路径) <br>

\${cookie.JSESSIONID.value} 获取指定cookie名称的值... <br>
</body>
</html>

JavaBean:他其实就是一个普通的java类

使用规范

  1. 所有字段(成员变量)为private

  2. 提供无参构造方法

  3. 提供getter、setter和is方法

  4. 实现serializable接口

二.JSTL标签库

1.概述:

Jsp 标准标签库(Jsp Standard Tag Library),是由Apache组织提供的开源的jsp标签库

作用:替换和简化jsp页面中java代码的编写

JSTL标准标签库有5个子库,但随着发展,目前常使用的是它的核心库(Core)

标签库 标签库的URI 前缀
Core http://java.sun.com/jsp/jstl/core c
国际化(几乎不用) http://java.sun.com/jsp/jstl/fmt fmt
SQL(过时) http://java.sun.com/jsp/jstl/sql sql
XML(过时) http://java.sun.com/jsp/jstl/xml x
Functions(几乎不用) http://java.sun.com/jsp/jstl/functions fn
JSTL 标签库提供 5 大功能:
1. core jstl 的核心标签库。
2. fmt :格式化(国际化)的标签(使用较少,对页面显示数据,格式化,现在都交给前端去做)
3. functions jstl 中提供对字符串操作的函数库 ( 不再使用,建议在数据显示在页面之前,在后台程序中,先格式
化好字符串,然后直接显示,不再页面做处理,如果有前端,交给前端处理( javascript   解析 json 格式数据)
4. sql jstl 提供的在 jsp 页面上书写 sql ,操作数据库,目前已经不再(不允许)使用( jsp 开发模式二,这个开发模
式不允许,在页面操作数据库)
5. xml jstl 操作 xml 文件的。目前已经不再使用(页面传递数据,页面解析数据,使用 json 格式字符串代替 xml
 

2.jstl标签的使用:

使用步骤:当前web项目导入jar包,在当前的jsp页面tablib指令引入 即可

2.常用标签:

① c:if标签

就相当于,java中 if(){}
    语法
        <c:if test="boolean值"></c:if>
            true:显示标签体内容
            false:隐藏标签体内容
        通常与el表达式一起使用
        注意:此标签没有else功能,如果想实现else效果,请让条件取反

<%@ page import="cn.wsl.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo1</title>
</head>
<body>
<%
    User user = new User();
    user.setUsername("jck");
    request.setAttribute("user", user);
%>

<c:if test="${empty user}">
    你好,请登录...
</c:if>

<c:if test="${not empty user}">
    你好,${user.username}
</c:if>
</body>
</html>

② c:forEach标签

相当于java中的for循环
    1)普通for
        for(int i=1; i<=5; i++){
            i
        }
        <c:forEach begin="1" end="5" step="1" var="i">
            ${i}
        </c:forEach>
            begin="1" 起始值(包含)
            end="5"   结束值(包含)
            step="1"  步长为1
            var="i"   当前输出临时变量
    2)增强for
        for(User user : list){
            user
        }
        <c:forEach items="${list}" var="user" varStatus="vs">
            ${user}
        </c:forEach>
            items="list" 集合
            var="user"   当前输出的临时变量
            varStatus="vs" 变量状态
                index 当前索引 从0开始
                count 计数器   从1开始

<%@ page import="java.util.List" %>
<%@ page import="cn.wsl.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo</title>
</head>
<body>
<h3>普通for循环</h3>
<c:forEach begin="1" end="5" step="1" var="i"> <%--for循环将临时变量存储到了 pageContext域空间--%>
    ${i} <br>
</c:forEach>

<h3>增强for循环</h3>
<%
    List<User> list = new ArrayList<>();
    list.add(new User("dilireb", 27, "女"));
    list.add(new User("娜扎", 23, "女"));
    list.add(new User("扎哈", 127, "中"));
    request.setAttribute("list", list);
%>

<c:forEach items="${list}" var="user" varStatus="vs">
   索引:${vs.index} |  计数器: ${vs.count} | ${user.username} <br>
</c:forEach>
</body>
</html>

③ c:choose标签

相当于java中switch语句
    <c:choose>  等价于 switch
    <c:when>    等价于 case+break
    <c:otherwise> 等价于 default

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo</title>
</head>
<body>
<h3>choose标签</h3>
<%
    Integer money = 7000;
    request.setAttribute("money", money);
%>
<c:choose>
    <c:when test="${money == 7000}">
        单身汪....
    </c:when>
    <c:when test="${money == 15000}">
        撩小
    </c:when>
    <c:when test="${money > 30000}">
       上完人呢.
    </c:when>
    <c:otherwise>
        奋斗吧骚年....
    </c:otherwise>
</c:choose>
</body>
</html>

三.三层架构

JSP 模式是理论基础,但实际开发中,我们常将服务器端程序,根据逻辑进行分层。一般比较常见的是分三层,我们
称为:经典三层体系架构。三层分别是:表示层、业务逻辑层、数据访问层。
表示层:又称为 web 层,与浏览器进行数据交互的。
业务逻辑层:又称为 service 层,专门用于处理业务数据的。
数据访问层:又称为 dao 层,与数据库进行数据交换的。将数据库的一条记录与 JavaBean 进行对应。

1.概述:

通常意义上的三层架构就是将整个业务应用划分为:表示(现)层、业务逻辑层、数据访问层。

区分层次的目的 为了高内聚低耦合的思想

表示(现)层:又称为web层,与浏览器进行数据交互(控制器和视图)

业务逻辑层:又称为service层,处理业务数据(if判断,for循环)

数据访问(持久)层:又称为dao层,与数据库进行交互的(每一条(行)记录与javaBean实体对应)

项目目录建立规则:

* com.wsl.基本包(公司域名倒写)

* com.wsl.dao 持久层

* com.wsl.service 业务层

* ccom.wsl.web 表示层

* com.wsl.domain 实体(JavaBean)

* com.wsl.util 工具

mvc架构:

各层之间会传递一些实体对象,cn.wsl.项目名.domain(pojo,vo)

优点:降低各层之间的耦合性,提高各层代码的复用性

一个项目的完整的分包如下:

cn.wsl公司域名倒写
cn.wsl.xxx 项目名称
cn.wsl.xxx.yyy 子模块
cn.wsl.xxx.yyy.dao 子模块dao层接口
cn.wsl.xxx.yyy.dao.impl 子模块dao层实现类
cn.wsl.xxx.yyy.service 子模块service层接口
cn.wsl.xxx.yyy.service.impl 子模块service层实现类
cn.wsl.xxx.yyy.domain 子模块JavaBean (子模块yyy可省略)
cn.wsl.xxx.yyy.web.servlet 子模块web层,servlet
cn.wsl.xxx.yyy.web.filter 子模块web层,filter
cn.wsl.xxx.util 工具
cn.wsl.xxx.exception 自定义异常
cn.wsl.xxx.constant 常量

四.案例:

coding:

进行简单的分包

index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>索引</title>
  </head>
  <body>
  <h1><a href="${pageContext.request.contextPath}/FindAllServlet">用户列表查询</a></h1>
  </body>
</html>

list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>列表</title>

    <style type="text/css">
        #content {
            margin: 0 auto;
            border: red solid 1px;
            width: 800px;
            height: 600px;
        }
        table {
            width: 800px;
        }
        td{
            border: red solid 1px;
        }
    </style>
</head>
<body>

<div id="content">
    <table>
        <tr>
            <td>编号</td>
            <td>姓名</td>
            <td>年龄</td>
            <td>性别</td>
            <td>QQ</td>
        </tr>
        <c:forEach items="${list}" var="user" varStatus="sl">
            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.age}</td>
                <td>${user.sex}</td>
                <td>${user.QQ}</td>
            </tr>
        </c:forEach>
    </table>
</div>
</body>
</html>


User.java

package com.wsl.demo.domain;

public class User {
    private String id;

    private String name;

    private String age;

    private String sex;

    private String QQ;

    public User() {
    }

    public User(String id, String name, String age, String sex, String QQ) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.QQ = QQ;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getQQ() {
        return QQ;
    }

    public void setQQ(String QQ) {
        this.QQ = QQ;
    }
}
UserDao.java

package com.wsl.demo.dao;

import com.wsl.demo.domain.User;

import java.util.ArrayList;
import java.util.List;

public class UserDao {

    private static List<User> list = new ArrayList<>();

    static {
        list.add(new User("1","王明明","32","男","9876543"));
        list.add(new User("1","李天一","39","女","8756543"));
        list.add(new User("1","张明天","26","女","4566543"));
        list.add(new User("1","董永","31","男","1298743"));
        list.add(new User("1","李明","35","女","9456743"));
        list.add(new User("1","尚明","22","男","3890543"));
    }


    public List<User> findAll() {
        return list;
    }
}
UserService.java

package com.wsl.demo.service;

import com.wsl.demo.dao.UserDao;
import com.wsl.demo.domain.User;

import java.util.List;

public class UserService {
    public List<User> findAll() {
        UserDao userDao = new UserDao();
       List<User> list = userDao.findAll();
        return list;
    }
}
FindAllServlet.java

package com.wsl.demo.web;

import com.wsl.demo.domain.User;
import com.wsl.demo.service.UserService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/FindAllServlet")
public class FindAllServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        UserService userService = new UserService();

        List<User> list = userService.findAll();

        request.setAttribute("list",list);

        request.getRequestDispatcher("/list.jsp").forward(request,response);

    }

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

资料

JSTL标签与EL表达式

发布了141 篇原创文章 · 获赞 27 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/u010581811/article/details/105684897