PS:还是Ajax+Servlet+html好用

概念

Java Server Pages,Java的服务端页面

这是一种动态的网页技术,既可以定义html、css等静态的内容,也可以使用Java代码的动态内容

简单来说,jsp=java+html

作用:

简化开发,避免了在Servlet中直接输出html内容

快速入门

  1. 导入坐标

    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>
  2. 创建jsp文件

  3. 编写代码

原理

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>