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实现如下效果
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>
<c:forEach var="user" items="${list}"> </c:forEach>
等价于
for(Uesrs user:list){}
(7)测试访问
http://localhost:8080/UserServlet
结果:
不访问jsp,那是静态的。
3.3需求2:
基于以上工程,利用jstl表达式中<c:if>
实现如下效果
<c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
用户量少的用这个,多的用
<c:choose>
注意点:
以后我们数据库是碰不到的, 如果是英文用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>实现如下效果
<c:choose>标签与Java switch语句的功能一样,
用于在众多选项中做出选择。
switch语句中有case,而<c:choose>标签中对应有<c:when>,
switch语句中有default,而<c:choose>标签中有<c:otherwise>。
意思 : 除了。。。否则。。。
多样性就用不了这个choose。
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();
}
}
/*************访问数据库*****************/
//绑定值,将list数据塞入到request对象中的key为list的value中
request.setAttribute("list", list);
//转发到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>
结果是
- 先在http://localhost:8080/add.jsp里面
写东西。
- 点击提交
- 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);
}
}
}
注意点:
如果浏览器不写action=list,
那么action就是null,会报空指针异常。
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
<meta charset = "utf-8">
<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>
注意点:
(表单)method 属性规定如何发送表单数据
Get和Post的区别:
- Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。
- Get是不安全的,因为在传输过程,数据被存放在请求的URL地址中,
这样就可能会有一些隐私的信息被第三方看到。 - Get传输的数据量小,这主要是因为受URL长度限制,但执行效率高;
而Post可以传输大量的数据,所以在上传文件只能使用Post。 - 使用Post传输的数据,可以通过设置编码的方式正确转化中文;
而Get传输的数据却没有变化。 - Get:请求能够携带的参数比较少,大小有限制,
会在浏览器的URL地址栏显示数据内容,不安全,但高效
Post:请求能够携带的参数没有限制,大小没有限制,
不会在浏览器的URL地址栏显示数据内容,安全,但不高效
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
输完内容以后,点击添加,跳转到
http://localhost:8080/IndexServlet?action=add
页面为一个添加功能按钮和数据库数据的展示和增加的数据
代码重复,不方便。
==》用DAO来解决这个问题
注意:
两个Servlet类合并成一个的语法
假设AServlet和BServlet合并成一个
CServlet类:
public class CServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter("action");
if(action.equals("a")){
request.getRequestDispatcher("index1.jsp").forward(request,response);
}else if(action.equals("b")){
request.getRequestDispatcher("index2.jsp").forward(request,response);
}
}
}
web.xml和User类省略
index1.jsp==》 AServlet控制器跳转到的jsp页面
index2.jsp==》 BServlet控制器跳转到的jsp页面
http://localhost:8080/CServlet?action=a
AServlet控制器跳转到的jsp页面
http://localhost:8080/CServlet?action=b
BServlet控制器跳转到的jsp页面
----2021.10.20&10.21