JSP笔记
PS:还是Ajax+Servlet+html好用
概念
Java Server Pages,Java的服务端页面
这是一种动态的网页技术,既可以定义html、css等静态的内容,也可以使用Java代码的动态内容
简单来说,jsp=java+html
作用:
简化开发,避免了在Servlet中直接输出html内容
快速入门
导入坐标
<dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> <scope>provided</scope> </dependency>创建jsp文件
编写代码
原理
JSP本质上是一个Servlet
浏览器访问jsp页面—>tomcat会将name.jsp转换为name_jsp.java的Servlet文件—>tomcat再将文件转换到name_jsp.class文件
最后执行class字节码文件,提供服务

public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
可以看到这个java文件是继承自org.apache.jasper.runtime.HttpJspBase这个类的
在tomcat的源码中找到这个类

发现是继承HttpServlet的,所以jsp本质是一个Servlet
在这个java文件中实际还是将标签在输出流中输出

Jsp脚本
JSP 脚本有如下三个分类:
<%…%>:内容会直接放到_jspService()方法之中
<%=…%>:内容会放到out.print()中,作为out.print()的参数
<%!…%>:内容会放到_jspService()方法之外,被类直接包含
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="POJO.Brand" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// 查询数据库,这里用的假数据
List<Brand> brands = new ArrayList<Brand>();
brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" value="新增"><br>
<hr>
<table border="1" cellspacing="0" width="800">
<tr>
<th>序号</th>
<th>品牌名称</th>
<th>企业名称</th>
<th>排序</th>
<th>品牌介绍</th>
<th>状态</th>
<th>操作</th>
</tr>
<%--这里的循环和判断可以截断来写,在最后转换的java文件中会拼接成完整的代码--%>
<%
for (int i = 0; i < brands.size(); i++) {
Brand brand = brands.get(i);
%>
<tr align="center">
<td><%=brand.getId()%></td>
<td><%=brand.getBrandName()%></td>
<td><%=brand.getCompanyName()%></td>
<td><%=brand.getOrdered()%></td>
<td><%=brand.getDescription()%></td>
<%
if(brand.getStatus() == 1){
//显示启用
%>
<td><%="启用"%></td>
<%
}else {
// 显示禁用
%>
<td><%="禁用"%></td>
<%
}
%>
<td><a href="#">修改</a> <a href="#">删除</a></td>
</tr>
<%
}
%>
</table>
</body>
</html>
缺点
书写麻烦
阅读麻烦等

EL表达式
概述
EL(全称Expression Language )表达式语言,用于简化 JSP 页面内的 Java 代码。
EL 表达式的主要作用是 获取数据。其实就是从域对象中获取数据,然后将数据展示在页面上。
而 EL 表达式的语法也比较简单,${expression} 。例如:${brands} 就是获取域中存储的 key 为 brands 的数据。
域对象
JavaWeb中有四大域对象,分别是:
page:当前页面有效
request:当前请求有效
session:当前会话有效
application:当前应用有效
el 表达式获取数据,会依次从这4个域中寻找,直到找到为止。而这四个域对象的作用范围如下图所示

如:${brands},el 表达式获取数据,会先从page域对象中获取数据,如果没有再到 requet 域对象中获取数据,如果再 没有再到 session 域对象中获取,如果还没有才会到 application 中获取数据。
使用
定义servlet,在 servlet 中封装一些数据并存储到 request 域对象中并转发到jsp页面
package Servlet;
import POJO.Brand;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet(name = "demo1", value = "/demo1")
public class demo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 查询数据库,这里用的假数据
List<Brand> brands = new ArrayList<Brand>();
brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
//存储到域中
request.setAttribute("brands",brands);
//转发
request.getRequestDispatcher("demo.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
在jsp中通过 EL表达式 获取数据
<%--
Created by IntelliJ IDEA.
User: Li
Date: 2022/1/18
Time: 18:03
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>demo.jsp</h1>
${brands}
</body>
</html>
JSTL标签
概述
JSP标准标签库(Jsp Standarded Tag Library) ,使用标签取代JSP页面上的Java代码。
一般会使用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>
引入JSTL标签库
在jsp页面中引入
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
这里记下循环的使用
第一种
类似于 Java 中的增强for循环。
涉及到的 中的属性如下
items:被遍历的容器
var:遍历产生的临时变量
varStatus:遍历状态对象 这个对象有两个属性:index(从0开始)和count(从1开始)
<c:forEach items="${brands}" var="brand" varStatus="id">
<tr align="center">
<%-- <td>${brand.id}</td>--%>
<td>${id.count}</td>
<td>${brand.brandName}</td>
<td>${brand.companyName}</td>
<td>${brand.description}</td>
</tr>
</c:forEach>
第二种
类似于 Java 中的普通for循环。涉及到的 中的属性如下
begin:开始数
end:结束数
step:步长
从0循环到10,变量名是 i ,每次自增1
<c:forEach begin="0" end="10" step="1" var="i">
${i}
</c:forEach>
