jsp=java+html可写html、js、css和java代码
避免了在servlet中直接输出html标签,如write.write("<h1>hello</h1>")
jsp本质是一个servlet。
快速入门
依赖
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
<!--编译和测试有效,运行环境无效。因为打包发布到的tomcat中也有servlet的jar包,运行会jar包冲突-->
</dependency>
webapp目录下new一个jsp/jspx文件jsp/Hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>hello jsp~</h1>
<% System.out.printf("jsp java代码...");%>
</body>
</html>
运行后生成的编译文件hello_jsp.java其实是一个servlet,里面自动生成了out = pageContext.out;out.write("<h1>hello jsp~/h1>")或pot.print()这两个输出方法到网页上。
<%...%>:内容放到_jspService方法中
<%=...%>:内容放到out.print()中,作为out.print()参数
<%!...%>:内容放到_jspService()方法之外,被类直接包含
Demo
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.kdy.pojo.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello</title>
</head>
<body>
<%
List<User> users = new ArrayList<User>();
Date birthday = new Date(2021, 02, 23);
users.add(new User(1, "zhangsan1", "zhangsan123111", "zhangsan@163.com111", birthday, "1", "englishTeacher1", 1));
users.add(new User(2, "zhangsan2", "zhangsan123222", "zhangsan@163.com222", birthday, "2", "englishTeacher1", 0));
users.add(new User(3, "zhangsan3", "zhangsan123333", "zhangsan@163.com333", birthday, "3", "englishTeacher1", 1));
%>
<table border="1px">
<tr align="center">
<td>ID</td>
<td>name</td>
<td>密码></td>
<td>email</td>
<td>生日</td>
<td>infoId></td>
<td>englishTeacher</td>
<td>status</td>
<td>操作</td>
</tr>
<%
for (int i = 0; i < users.size(); i++) {
User user = users.get(i);
%>
<tr align="center">
<td><%=user.getId()%>
</td>
<td><%=user.getName()%>
</td>
<td><%=user.getPassword()%>
</td>
<td><%=user.getEmail()%>
</td>
<td><%=user.getBirthday()%>
</td>
<td><%=user.getInfoId()%>
</td>
<td><%=user.getEnglishTeacher()%>
</td>
<%
if (user.getStatus() == 1) {
%>
<td><%="启用"%>
</td>
<%
} else {
%>
<td><%="禁用"%>
</td>
<%
}
%>
<td><a href="#">修改</a><a href="#">删除</a></td>
</tr>
<%
}
%>
</table>
</body>
</html>
鉴于jsp的复杂度高、阅读麻烦,现一般在servlet写处理逻辑的java代码并转发给jsp展示。
EL表达式
获取数据,简化JSP的展示数据的代码
${expression}:EL会按照page->request->session->applicaiton四个域对象去找expression.
el表达式获取page域的虚拟目录代码如下:
<form action="${pageContext.request.contextPath}/user/quick" method="post"></form>
JSTL
使用标签代替JSP中的Java代码。
常用<c:if test="${user.status==1}">开启</c:if>
<c:forEach items="${users}" var="user"></c:forEach>
需要引入jstl和standard依赖,并在jsp中引入jstl标签库uri
date格式化标签库:<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
input的date类型回显date格式化举例:<input name="birthday" type="date" value="<fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"/>" required="required">
练习使用EL和JSTL
JSTL坐标
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
servlet
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<User> users = new ArrayList<User>();
Date birthday = new Date(2021, 02, 23);
users.add(new User(1, "zhangsan1", "zhangsan123111", "zhangsan@163.com111", birthday, "1", "englishTeacher1", 1));
users.add(new User(2, "zhangsan2", "zhangsan123222", "zhangsan@163.com222", birthday, "2", "englishTeacher1", 0));
users.add(new User(3, "zhangsan3", "zhangsan123333", "zhangsan@163.com333", birthday, "3", "englishTeacher1", 1));
req.setAttribute("users",users);
req.getRequestDispatcher("/jsp/User.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
webapp目录下创建jsp/Useer.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!--引入jstl标签库URI-->
<html>
<head>
<title>User</title>
</head>
<body>
<table border="1px">
<tr align="center">
<td>jstl序号</td>
<td>ID</td>
<td>name</td>
<td>密码></td>
<td>email</td>
<td>生日</td>
<td>infoId</td>
<td>englishTeacher</td>
<td>status</td>
<td>操作</td>
</tr>
<c:forEach items="${users}" var="user" varStatus="order">
<tr align="center">
<td>${order.index}</td>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.password}</td>
<td>${user.email}</td>
<td>${user.birthday}</td>
<td>${user.infoId}</td>
<td>${user.englishTeacher}</td>
<c:if test="${user.status ==1}">
<td>启用</td>
</c:if>
<c:if test="${user.status ==0}">
<td>禁用</td>
</c:if>
<td><a href="#">修改</a>&<a href="#">删除</a></td>
</tr>
</c:forEach>
</table>
<h3>分页</h3>
<c:forEach begin="1" end="10" step="1" var="i">
<a href="#">${i}</a>
</c:forEach>
</body>
</html>