EL和JSTL表达式

1.EL表达式
1.1 EL表达式定义

Expression Language(表达式语言)

1.2 EL功能

替代JSP页面中数据访问时的复杂编码

1.3为什么使用EL

A.<%= ( (User) request.getAttribute(“user”) ) .getName() %>
jsp要导包tomcat jsp.api servlet.api

B.${user.name}
EL不用导包

A等价于B,所以B更方便。

1.4 EL表达式语法

${ EL expression }

2.JSTL表达式
2.1 JSTL表达式定义

JSP标准标签库(JSP Standard Tag Library)

2.2为什么使用JSTL

使用EL表达式可以简化JSP页面编码,
但是如果需要进行逻辑判断和循环控制怎么办?

EL表达式封装了数据访问的功能,
而JSTL标签库则封装了逻辑控制、循环控制以及数据格式化等功能,
二者结合使用才能完整实现动态页面的开发需求。

2.3JSTL表达式语法

(1)导JSTL的jar包
jstl.jar
standard.jar

(2)JSTL指令

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

(3)企业常用标签

A.条件标签

if

choose

B.迭代标签

forEach

3.企业实战

3.1需求1:利用Servlet,JSP实现如下效果
EL和JSTL表达式
3.2需求1-实现步骤:

(1)创建工程(web)

(2)在WEB-INF下创建lib导入jstl.jar,standard.jar
然后 Add As Library

最好也导入tomcat的jsp-api / servlet-api.jar

(3)创建cn.kgc.entity/User.java
[entity存放的实体类]
User类里:
private Integer id;
private String name;
private String pwd;
和get()、set()方法,无参构造和有参构造。

(4) cn.kgc.servlet;/UserServlet

import cn.kgc.entity.User;
import javax.servlet.*;
import java.io.IOException;
import java.util.ArrayList;

public class UserServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.准备数据
        ArrayList<User> list = new ArrayList<>();
        User user1 = new User(1,"zs","123");
        User user2 = new User(2, "lisi", "456");
        User user3 = new User(3, "wangwu", "789");
        list.add(user1);
        list.add(user2);
        list.add(user3);

        //2.绑定值,将list数据塞入到request对象中的key为list的value中
        request.setAttribute("list",list);
        //3.转发到index.jsp页面
        request.getRequestDispatcher("index.jsp").forward(request,response);
    }
}

(5)web.xml

<servlet>
        <servlet-name>UserServlet</servlet-name>
        <servlet-class>cn.kgc.servlet.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>UserServlet</servlet-name>
        <url-pattern>/UserServlet</url-pattern>
</servlet-mapping>

(6)index.jsp(导入jstl指令)

<c:forEach>,<c:forTokens>

这些标签封装了Java中的for,while,do-while循环。
相比而言,<c:forEach>标签是更加通用的标签,
因为它迭代一个集合中的对象。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <table border="1px " cellpadding="0" cellspacing="0">
      <tr>
        <td>用户id</td>
        <td>用户名称</td>
        <td>用户密码</td>
      </tr>
      <c:forEach var="user" items="${list}">
<%-- var 是 临时变量 items 绑定的是key值 获得绑定域中的value--%>
        <tr>
          <td>${user.id}</td>
          <td>${user.name}</td>
          <td>${user.pwd}</td>
        </tr>
      </c:forEach>
    </table>
  </body>
</html>

(7)测试访问

http://localhost:8080/UserServlet

不访问jsp,那是静态的。

3.3需求2:
基于以上工程,利用jstl表达式中
<c:if>实现如下效果

用户量少的用这个,多的用<c:choose>
EL和JSTL表达式

注意点:
以后我们数据库是碰不到的, 如果是英文 用jsp代码来封装实现中文。

3.4需求2-实现步骤:

index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
    <meta charset="utf-8">
  </head>
  <body>
    <table border="1px " cellpadding="0" cellspacing="0">
      <tr>
        <td>用户id</td>
        <td>用户名称</td>
        <td>用户密码</td>
      </tr>
      <c:forEach var="user" items="${list}">
        <tr>
          <td>${user.id}</td>
          <c:if test="${user.name eq 'zs'}"><td>张三</td></c:if>
          <c:if test="${user.name eq 'lisi'}"><td>李四</td></c:if>
          <c:if test="${user.name eq 'wangwu'}"><td>王武</td></c:if>
		<%-- eq 等价于 --%>
          <td>${user.pwd}</td>
        </tr>
      </c:forEach>
    </table>
  </body>
</html>

3.3需求3:
基于以上工程,利用jstl表达式中
<c:choose>实现如下效果

除了。。。否则。。。
多样性就用不了这个。

EL和JSTL表达式
3.4需求3-实现步骤:
index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
    <meta charset="utf-8">
  </head>
  <body>
    <table border="1px " cellpadding="0" cellspacing="0">
      <tr>
        <td>用户id</td>
        <td>用户名称</td>
        <td>用户密码</td>
      </tr>
      <c:forEach var="user" items="${list}">
        <tr>
          <td>${user.id}</td>
          <c:choose>
            <c:when test="${user.name eq 'zs'}"><td>好人</td></c:when>
            <c:otherwise><td>大好人</td></c:otherwise>
          </c:choose>
          <td>${user.pwd}</td>
        </tr>
      </c:forEach>
    </table>
  </body>
</html>

题外话:
**1. 从数据库中导入数据: **
记得要导包 – 》mysql-connector-java-8.0.16.jar
web.xml和User都不变。

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
    <meta charset="utf-8">
  </head>
  <body>
    <table border="1px " cellpadding="0" cellspacing="0">
      <tr>
        <td>用户id</td>
        <td>用户名称</td>
        <td>用户密码</td>
      </tr>
      <c:forEach var="user" items="${list}">
        <tr>
          <td>${user.id}</td>
          <td>${user.name}</td>
          <td>${user.pwd}</td>
        </tr>
      </c:forEach>
    </table>
  </body>
</html>

UserServlet类:

import cn.kgc.entity.User;
import javax.servlet.*;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;

public class UserServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ArrayList<User> list = new ArrayList<>();
        /*************访问数据库*****************/
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true",
                    "root", "zjj");
            //发送sql语句
            ps = conn.prepareStatement("select * from t_user");
            //执行sql语句
            rs = ps.executeQuery();
            User user = null;
            //循环遍历rs结果集对象塞入User对象,并塞入list集合中
            while (rs.next()){
                user = new 
User(rs.getInt("id"),rs.getString("name"),rs.getString("pwd"));
                list.add(user);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if(rs!=null)rs.close();
                if(ps!=null)ps.close();
                if(conn!=null)conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        /*************访问数据库*****************/
        //2.绑定值,将list数据塞入到request对象中的key为list的value中
        request.setAttribute("list", list);
        //3.转发到index.jsp页面
        request.getRequestDispatcher("index.jsp").forward(request, response);

    }
}

http://localhost:8080/UserServlet
结果展示的是数据库的这个表的数据。

2. 实现添加功能:
AddUserServlet类:

import javax.servlet.*;
import java.io.IOException;
import java.sql.* ;
public class AddUserServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test ?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true",
                                             "root", "zjj");
            ps = conn.prepareStatement("insert into t_user(`name`,pwd) values(?,?)" );
            ps.setObject(1,name);
            ps.setObject(2,pwd);
            ps.executeUpdate();
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if(ps!=null)ps.close();
                if(conn!=null)conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

web.xml

<servlet>
    <servlet-name>AddUserServlet</servlet-name>
    <servlet-class>cn.kgc.servlet.AddUserServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>AddUserServlet</servlet-name>
    <url-pattern>/AddUserServlet</url-pattern>
</servlet-mapping>

add.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/AddUserServlet" style = "border: 1px solid black ;width: 300px">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="name"></td>
            </tr>
            <tr>
                <td>用户密码:</td>
                <td><input type="text" name="pwd"></td>
            </tr>
            <tr>
                <td><input type="submit" name="添加"></td>
            </tr>
        </table>
    </form>
</body>
</html>

结果是

  1. 先在http://localhost:8080/add.jsp里面
    写东西。
    EL和JSTL表达式
  2. 点击提交
  3. http://localhost:8080/UserServlet里面看是否有增加
    或者在数据库中有没有添加。

3.把两个Servlet合并成一个

如果不管用,可以选择清空浏览器缓存。

User类已省略

IndexServlet类:

public class IndexServlet extends HttpServlet {
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String action = request.getParameter("action");//action可以随便写
        if(action.equals("list")){
           1 == > 导入数据库的数据: UserServlet类:
        }else if(action.equals("add")){
           2 == > 实现添加功能:AddUserServlet类:
request.getRequestDispatcher("/IndexServlet?action=list").forward(request,response);
        }
    }
}

index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<table border="1px" cellpadding="0" cellspacing="0">
    <tr><input type="button" value="添加功能" onclick="javascript:window.location.href='add.jsp'"></tr>
<%--    window.location.href;//当前页面打开URL页面--%>
    <tr>
        <td>用户id</td>
        <td>用户名称</td>
        <td>用户密码</td>
    </tr>
    <c:forEach var="user" items="${list}">
        <tr>
            <td>${user.id}</td>
            <td>${user.name}</td>
            <td>${user.pwd}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

add.jsp

<form action="/IndexServlet?action=add" method="post" style="border: 1px solid black; width: 300px;">
    <table>
        <tr>
            <td>用户名称</td>
            <td><input type="text" name="name"></td>
        </tr>
        <tr>
            <td>用户密码</td>
            <td><input type="text" name="pwd"></td>
        </tr>
        <tr>
            <td>
                <input type="submit" value="添加"/>
            </td>
        </tr>
    </table>
</form>

web.xml

<servlet>
    <servlet-name>IndexServlet</servlet-name>
    <servlet-class>cn.kgc.servlet.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>IndexServlet</servlet-name>
    <url-pattern>/IndexServlet</url-pattern>
</servlet-mapping>

结果为:
http://localhost:8080/IndexServlet?action=list
页面为一个添加功能按钮和数据库数据的展示
点击按钮
http://localhost:8080/add.jsp
EL和JSTL表达式
输完内容以后,点击添加,跳转到
http://localhost:8080/IndexServlet?action=add
页面为一个添加功能按钮和数据库数据的展示和增加的数据

----2021.10.20&10.21

上一篇:Torch基础


下一篇:JSTL中的 c:set 和 c:out 标签-老技术了