JSP

JSP 语法

JSP 指令【了解】

Page 指令

告诉 JSP 引擎如何操作文件中的内容

JSP指令格式:
    <%@ page 属性名1="属性值" 属性名2="属性值" ...%>

需要了解的属性:
    <%--【重点】导包,和Java中操作一致,导入当前JSP页面所需的资源--%>
    import 
        
    <%--设置页面的响应内容类型以及编码集--%>
    contentType="text/html; charset=UTF-8" 
        
    <%--解析当前JSP页面使用的语言--%>
    language="java" 
        
    <%--当前页面的编码集--%>
    pageEncoding="utf-8" 
        
    <%--JSP页面的默认缓冲大小为8KB,
    类型为java.servlet.jsp.JspWriter输出字符流--%>
    buffer="8kb" 
        
    <%--session 默认创建,如果选择不开启 session 属性值设为false--%>
    session="true" 
        
    <%--JSP页面是否支持EL表达式,默认支持,不支持属性值为false--%>
    isELIgnored="true" 
        
    <%--当前页面是否为错误页面,默认为false--%>
    isErrorPage="false" 

    <%--指定当前JSP页面发送错误之后,跳转到哪一个错误页面
    【注意】如果写“/”则代表当前应用的目录 下,绝对路径。  如果不写“/”则代表相对路径--%>
    errorPage="url" 

案例代码一

<%--导包--%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.fc.bean.Student" %>

<%@ page contentType="text/html;charset=UTF-8" 
         language="java"
         session="true"
         isErrorPage="false"
         pageEncoding="UTF-8"
         buffer="8kb"
         isELIgnored="true"
         errorPage="Demo1.jsp"
%>
<html>
    <head>
        <title>测试JSP的page指令</title>
    </head>
    <body>
        <%
            List<Student> list = new ArrayList<>();

            list.add(new Student("易烊千玺", 22));
            list.add(new Student("迪丽热巴", 26));
        %>

        <%=list%>
    </body>
</html>

案例代码二:两个数求和

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP案例一:两个数求和</title>
</head>
<body>
    <%
        int num1 = 4;
        int num2 = 5;

        out.print("两个数求和:");
    %>

    <%=num1 + num2%>
</body>
</html>

案例代码三:表格展示

<%@ page import="com.fc.bean.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>案例代码二:表格展示</title>
</head>
<body>
    <table border="1" align="center">
        <caption>用户列表</caption>
        <tr><td>编号</td><td align="center">姓名</td><td>年龄</td><td>性别</td><td>信息</td></tr>

        <%
            Student student1 = new Student(1, "易烊千玺", 20, "男", "真帅");
            Student student2 = new Student(2, "迪丽热巴", 28, "女", "真美");
        %>

        <tr>
            <td><%=student1.getId()%></td>
            <td><%=student1.getName()%></td>
            <td><%=student1.getAge()%></td>
            <td><%=student1.getGender()%></td>
            <td><%=student1.getInfo()%></td>
        </tr>

        <tr>
            <td><%=student2.getId()%></td>
            <td><%=student2.getName()%></td>
            <td><%=student2.getAge()%></td>
            <td><%=student2.getGender()%></td>
            <td><%=student2.getInfo()%></td>
        </tr>
    </table>
</body>
</html>

案例代码四:连接数据库

<%@ page import="com.fc.bean.Student" %>
<%@ page import="com.fc.utils.JdbcUtilsOnC3P0" %>
<%@ page import="org.apache.commons.dbutils.QueryRunner" %>
<%@ page import="org.apache.commons.dbutils.handlers.BeanListHandler" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>案例代码三:连接数据库</title>
</head>
<body>
    <table align="center" border="1px">
        <caption>用户列表</caption>
        <tr><th>编号</th><th>姓名</th><th>年龄</th><th>性别</th><th>信息</th></tr>

        <%
            // 获取核心类对象
            QueryRunner queryRunner = new QueryRunner();

            // 获取连接
            Connection connection = JdbcUtilsOnC3P0.getConnection();

            // 准备SQL语句
            String sql = "select * from student";

            // 提取结果集List
            List<Student> list = null;

            // 执行SQL语句
            try {
                list = queryRunner.query(connection, sql, new BeanListHandler<>(Student.class));
            } catch (SQLException e) {
                e.printStackTrace();
            }

            if (list != null) {
                for (Student student : list) {
            %>

            <tr>
                <td><%=student.getId()%></td>
                <td><%=student.getName()%></td>
                <td><%=student.getAge()%></td>
                <td><%=student.getGender()%></td>
                <td><%=student.getInfo()%></td>
            </tr>

            <%
                }
            }
        %>
    </table>
</body>
</html>

案例代码五:登陆注册

<%@ page import="com.fc.bean.Account" %>
<%@ page import="com.fc.utils.JdbcUtilsOnC3P0" %>
<%@ page import="org.apache.commons.dbutils.QueryRunner" %>
<%@ page import="org.apache.commons.dbutils.handlers.BeanHandler" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.SQLException" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP案例代码:登陆注册</title>
</head>
<body>
    <%
        // 设置请求编码集
        request.setCharacterEncoding("UTF8");

        // 获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 获取核心类对象
        QueryRunner queryRunner = new QueryRunner();

        // 获取连接
        Connection connection = JdbcUtilsOnC3P0.getConnection();

        // 准备SQL语句
        String sql = "select * from account where username = ? and password = ?";

        // 准备参数
        Object[] params = {username, password};

        // 提取对象
        Account student = null;

        try {
            // 执行SQL语句获取对应的实体类对象
            student = queryRunner.query(connection, sql, new BeanHandler<>(Account.class), params);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        // 判断实体类对象是否为null,如果不为null表示登录成功,否则登录失败
        if (student != null) {
            out.print("登陆成功");
        } else {
            out.print("登陆失败");
        }
    %>
</body>
</html>
include 指令【了解】

包含其他的 JSP 页面,可以是静态包含,也可以是动态包含

静态包含【重点】:
    <%@ include file="页面"%>

动态包含:
    <jsp:include page="页面"></jsp:include>

【注意】两者的区别:编译的时间段不同

  • 静态包含其他 JSP 页面。是将两个 JSP 页面编译时直接合并
  • 动态包含是当前 JSP 页面运行到 jsp:include 时才会加载对应的 JSP 资源,并不会合并两个 JSP 页面
<%@ include file="header.jsp"%>
content 内容
<%@ include file="bottom.jsp"%>
taglib 指令

导入其他资源标签库,比如 JSTL

<%@ taglib uri="路径" prefix="c" %>

    uri:资源
    prefix:前缀,可自定义,一般使用约定俗成的

JSP 动作【了解】

这里可以使用一部分的 JSP 标签来表示一定的 Java 代码

jsp:include     动态包含页面
jsp:forword     转发
jsp:param         请求设置参数
jsp:useBean     创建一个对象【稍微重要一点点】
jsp:setProperty 给指定的对象对应属性赋值【稍微重要一点点】
jsp:getProperty 从指定的对象对应属性取值【稍微重要一点点】

案例代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>测试JSP的动作</title>
    </head>
    <body>
        <%--声明一个Student类型的对象,变量名为student,作用域为page:代表整个页面有效--%>
        <jsp:useBean id="student" class="com.fc.bean.Student" scope="page"/>

        <%--设置,相当于setter--%>
        <jsp:setProperty name="student" property="age" value="1"/>
        <jsp:setProperty name="student" property="name" value="易烊千玺"/>

        <%--获取,相当于getter--%>
        <jsp:getProperty name="student" property="age"/>
        <jsp:getProperty name="student" property="name"/>
    </body>
</html>

JSP 内置对象【重点】

不需要定义,可以直接使用

对象名类型描述
requestjavax.servlet.http.HttpServletRequest用户请求对象
responsejavax.servlet.http.HttpServletResponse用户响应对象
sessionjavax.servlet.http.HttpSessionSession会话控制对象
applicationjavax.servlet.ServletContext整个项目的上下文对象
exceptionjava.lang.Exception异常,isErrorPage="true"
pagejava.lang.Object ==> this对象JSP ==> Servlet this对象(代表当前页面)
configjavax.servlet.ServletConfigServlet 配置对象
outjavax.servlet.jsp.JspWriter输出对象,能输出内容到页面上
pageContextjavax.servlet.jsp.PageContext当前页面对象上下文,可以获取其他对象【重点】

案例代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>测试内置对象</title>
</head>
<body>
   <%--请求对象request--%>
   <%
       StringBuffer url = request.getRequestURL();
       System.out.println(url);
   %>

   <%--响应对象response--%>
   <%
       String contentType = response.getContentType();
       System.out.println(contentType);
   %>

   <%--pageContext上下文对象--%>
   <%
       // 设置属性键值对
       pageContext.setAttribute("msg", "pageContext");
   %>

   <%--pageContext上下文对象,获取键对应的值--%>
   <%=pageContext.getAttribute("msg")%>

   <%--out对象--%>
   <%
       // 注意,response.getWriter().append("response")优先级最高,不管写到哪里都最先显示
       out.print("out");
       response.getWriter().append("response");
   %>

</body>
</html>

域对象【重点】

域对象分类

域对象作用范围
pageContext当前 JSP 页面有效
request请求中有效
session会话控制中有效
application整个项目中有效

域对象的方法

域对象都可以操作以下三个方法

// 设置属性键值对
void setAttribute(String name, Object value)

// 根据键获取对应的值
Object getAttribute(String name);    

// 移除键所对应的键值对
void removeAttribute(String name);

pageContext【重重重点!!】

这个对象代表页面上下文,该对象主要用于访问 JSP 之间的共享数据。

获取其他内置对象的方法

<%--获取请求对象--%>
ServletRequest getRequest();

<%--获取响应对象--%>
ServletResponse getResponse();

<%--获取Session--%>
HttpSession getSession();

<%--获取异常对象--%>
Exception getException();

<%--获取当前页对象--%>
Object getPage();

<%--获取Servlet配置对象--%>
ServletConfig getServletConfig();

<%--获取Servlet上下文对象,即Application对象--%>
ServletContext getServletContext();

<%--获取页面输出对象--%>
JspWriter getOut();

操作其他域对象的方法

pageContext 存在一定的特权,通过 pageContext 可以操作其他域对象

// 在指定域环境中设置属性
void setAttribute(String name, Object value, int scope);

// 根据键获取指定域环境中的属性
Object getAttribute(String name, int scope);

//  移除指定域对象中的键值对
void removeAttribute(String name, int scope);

// 按page、request、session、application的共享范围依次搜索已命名的属性
Object findAttribute(String var1);

【注意】scope 是域对象标记,这里使用了一个常量来表示(PageContext中的静态常量)

域对象常量值
PageContext.PAGE_SCOPE1
PageContext.REQUEST_SCOPE2
PageContext.SESSION_SCOPE3
PageContext.APPLICATION_SCOPE4

案例代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试pageContext对象</title>
</head>
<body>

    <%--通过pageContext可以获取到其他对象--%>
    <%
        pageContext.getRequest();
        pageContext.getResponse();
        pageContext.getSession();
        pageContext.getException();
        pageContext.getPage();
        pageContext.getServletConfig();
        pageContext.getServletContext();
        pageContext.getOut();
    %>

    <%--分别给各个作用域设置属性键值对--%>
    <%
        pageContext.setAttribute("username", "易烊千玺", PageContext.PAGE_SCOPE);
        pageContext.setAttribute("username", "迪丽热巴", PageContext.REQUEST_SCOPE);
        pageContext.setAttribute("username", "古力娜扎", PageContext.SESSION_SCOPE);
        pageContext.setAttribute("username", "欧阳娜娜", PageContext.APPLICATION_SCOPE);
    %>

    <%--获取当前页面中属性对应的值--%>
    <%=pageContext.getAttribute("username")%>

    <%--获取请求对象中属性对应的值--%>
    <%
        Object username1 = request.getAttribute("username");
        System.out.println(username1);
    %>

    <%--获取session中属性对应的值--%>
    <%
        Object username2 = session.getAttribute("username");
        System.out.println(username2);
    %>

    <%--获取ServletContext中属性对应的值--%>
    <%
        Object username3 = application.getAttribute("username");
        System.out.println(username3);
    %>
    
    <%-- 按page、request、session、application的共享范围依次搜索已命名的属性--%>
    <%
        Object username = pageContext.findAttribute("username");
        System.out.println(username);
    %>
</body>
</html>

两个简易方法

// 该方法用于向当前的页面中包含其他文件
void include(String var1);
    
// 转发页面
void forward(String var1);

案例代码一

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>pageContext的转发方法</title>
</head>
<body>
    <%--测试转发--%>
    <%
        pageContext.forward("forward.jsp");
    %>
</body>
</html>

案例代码二

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试pageContext的包含方法</title>
</head>
<body>
    <%
        pageContext.include("forward.jsp");
    %>
</body>
</html>

EL 表达式【简单又重点】

概述

表达式语言(Expression Language),或称EL表达式,简称 EL,是 Java 中的一种特殊的通用编程语言,借鉴于 JavaScript 和 XPath。主要作用是将Java Web应用程序嵌入到网页(如JSP)中,用以访问页面的上下文以及不同作用域中的对象、取得对象属性的值或执行简单的运算或判断操作。EL 在得到某个数据时,会自动进行数据类型的转换。

【注意】EL 不是一种开发语言,是 JSP 中获取数据的一种规范

作用

目的:简化 JSP 中 Java 代码的编写,用于获取参数

格式

${EL表达式}

【注意】

1. 等价于 findAttribute(name);

2. JSP默认支持EL表达式的。如果要忽略EL表达式
   1、设置jsp中page指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式
   2、${/表达式} :忽略当前这个EL表达式

EL 的使用

基础使用

案例代码一:获取实体类中的属性值

<%@ page import="com.fc.bean.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式</title>
</head>
<body>
    <%
        // 声明一个对象
        Student student = new Student(1, "易烊千玺", 20, "男", "真帅");

        // 将对象作为值存入pageContext中
        pageContext.setAttribute("student", student);
    %>

    <table align="center" border="1px">
        <tr>
            <th>ID</th><th>姓名</th><th>年龄</th><th>性别</th><th>信息</th>
        </tr>
        <tr>
            <%--通过EL表达式获取对应的值--%>
            <td>${student.id}</td>
            <td>${student.name}</td>
            <td>${student.age}</td>
            <td>${student.gender}</td>
            <td>${student.info}</td>
        </tr>
    </table>
</body>
</html>

【注意】可以使用任意域对象存储数据,一般常用 pageContext

使用 List 和 Map

案例代码一:使用 List

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.fc.bean.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式测试List</title>
</head>
<body>
    <%
        List<Student> list = new ArrayList<>();

        list.add(new Student(1, "易烊千玺", 20, "男", "送你一朵小红花"));
        list.add(new Student(2, "迪丽热巴", 22, "女", "迪丽热巴"));
        list.add(new Student(3, "古力娜扎", 18, "女", "古力娜扎"));

        pageContext.setAttribute("list", list);
    %>

    <table align="center" border="1px">
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Age</th>
            <th>Gender</th>
            <th>Info</th>
        </tr>

        <tr>
            <td>${list[0].id}</td>
            <td>${list[0].name}</td>
            <td>${list[0].age}</td>
            <td>${list[0].gender}</td>
            <td>${list[0].info}</td>
        </tr>
        <tr>
            <td>${list[1].id}</td>
            <td>${list[1].name}</td>
            <td>${list[1].age}</td>
            <td>${list[1].gender}</td>
            <td>${list[1].info}</td>
        </tr>
        <tr>
            <td>${list.get(2).id}</td>
            <td>${list.get(2).name}</td>
            <td>${list.get(2).age}</td>
            <td>${list.get(2).gender}</td>
            <td>${list.get(2).info}</td>
        </tr>
    </table>
</body>
</html>
最后修改:2021 年 01 月 24 日 12 : 08 PM
如果觉得此文章有用,请随意打赏