JSP核心技术

一、JSP的概述(熟悉)

1、JSP的概念

  • JSP是Java Server Pages的简称,跟Servlet一样可以动态生成HTML响应, JSP文件命名为xxx.jsp。
  • 与Servlet不同,JSP文件以HTML标记为主,然后内嵌Java代码段,用于处理动态内容。

2、JSP的示例

<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Hello Time</title>
  </head>
  <body>
    现在的时间是:<%= new Date()%>
  </body>
</html>

3、JSP和Servlet的关系

image-20210813080713684

二、JSP的语法(熟悉)

1、JSP的语法结构

  • 声明区
  • 程序代码区
  • 表达式
  • 注释
  • 指令和动作
  • 内置对象

2、声明区

  • 基本语法

    <%! %>

  • 说明:可以定义全局变量、方法、类。

<%!
    int i;
    public void setName(){… …}
%>

3、程序代码区

  • 基本语法:

    <%程序代码区%>

  • 说明:可以定义局部变量以及放入任何的Java程序代码。

<%
    int j;
    for (int k=0; k<10; k++) {
        … …
    }
%>

4、表达式

  • 基本语法:

    <%=… …%>

  • 说明:可以输出一个变量或一个具体内容,但=后面必须是字符串变量或者可以被转换成字符串的表达式。

  • 注意:不需要以;结束,只有一行

<%=“hello world”%>
<%=i+1%>
  • 案例题目
使用for循环输出一个html语言的表格,具体表头如下:
     id    name   age   salary   
     1      1      1     1
     2      2      2     2
     ...
     5      5      5     5
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 9:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现表格的绘制</title>
</head>
<body>
<table>
    <tr>
        <td>id</td>
        <td>name</td>
        <td>age</td>
        <td>salary</td>
    </tr>
    <%
        for (int i = 1; i < 6;i++) {
    %>
    <tr>
        <td> <%= i %> </td>
        <td> <%= i %> </td>
        <td> <%= i %> </td>
        <td> <%= i %> </td>
    </tr>
    <%
        }
    %>
</table>
</body>
</html>

5、注释

格式:
<!--… …-->    HTML文件的注释,浏览器可以查看到
<%--… …--%>   JSP文件的注释,浏览器看不到
<%//… …%>     Java语言中的单行注释,浏览器看不到
<%/*… …*/%>   Java语言中的多行注释,浏览器看不到
注释的内容不会被执行

6、指令和动作

  • 指令格式:

    ​ <%@指令 属性=“属性值”%>

  • 指令的属性可以设定多个。

  • JSP常用指令有:page、taglib、include。

1.page指令

  • page指令用于导包和设置一些页面属性,常用属性如下:
import        导入相应的包,惟一允许在同一文档中多次出现的属性
contentType   设置Content-Type响应报头,标明即将发送到浏览器的文档类型
pageEncoding  设置页面的编码
language      指定页面使用的语言
session       控制页面是否参与HTTP会话
errorPage     处理当前页面中抛出但未被捕获的任何异常 
isErrorPage   当前页是否可以作为其他页面的错误处理页面
<%@ page import="java.util.List" %> <%--导包--%>
<%@ page import="java.util.LinkedList" %>
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 10:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
    <title>page指令的使用</title>
</head>
<body>
<%
    List<String> list = new LinkedList<String>();
%>
</body>
</html>

2.taglib指令

  • taglib指令用来扩展JSP程序的标签元素,引入其他功能的标签库文件。
<!-- prefix属性用于指定库前缀 -->
<!-- uri属性用于指定库的标识 -->  
<%@taglib uri=“tagLibary” prefix=“prefix”%>

3.include指令

  • include指令用于引入另一个JSP程序或HTML文件等,格式如下:
<%@include file=“被包含的文件地址%>
  • JSP引擎会在JSP文件的转换时期先把file属性设定的文件包含进来,然后开始执行转换及编译的工作。

4.jsp:include/jsp:param

  • jsp:include动作用于引入另一个JSP程序或HTML文件等。
  • 执行到include时,被include的文件才会被编译。
  • 如果include的是jsp文件,那它不会被转换成Servlet文件。
<jsp:include page=“URLSpec” flush=“true”/>
<jsp:include page=“URLSpec” flush=“true”>
    <jsp:param name=“key” value=“value”/>
</jsp:include>
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 10:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%-- 表示包含或者引入head.jsp文件 --%>
<%--<%@ include file="head.jsp"%>--%>
<%-- include动作的方式 动态包含  推荐使用--%>
<jsp:include page="head.jsp"></jsp:include>
<html>
<head>
    <title>文件引入使用</title>
</head>
<body>

</body>
</html>

5.include指令和include动作的区别

  • include指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入再编译执行(静态包含)(先包含在编译)。
  • include动作在转换时期是不会被编译的,只有在客户端请求时期被执行到才会被动态的编译载入(动态包含,推荐)(先编译再包含)。

6.jsp:forward/jsp:param

  • forward动作用于在JSP中实现转发,将请求转发到另一个指定的JSP程序或者Servlet中处理。
<jsp:forward page=“urlSpec” flush=“true”/>
<jsp:forward page=“urlSpec”>
       <!-- 用于指定参数和其对应的值 -->
       <jsp:param name=“key” value=“value”/>
</jsp:forward>

三、JSP内置对象(重点)

1、基本概念

  • 在JSP程序中有9个内置对象由容器为用户进行实例化,程序员可以不用定义就直接使用这些变量。
  • 在JSP转换成Servlet后,会自动追加这些变量的定义,使用内置对象可以简化JSP的开发。

2、对象名称

image-20210813081832300

3、out内置对象

  • out内置对象是一个缓冲的输出流,用来给客户端输出信息。

  • 常用方法如下:

image-20210813081916640

<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 14:32
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>out内置对象的使用</title>
</head>
<body>
<%
    out.println("<h1>");
    out.println("Hello World!");
    out.println("</h1>");
    // out.close();

    int bufferSize = out.getBufferSize();
    System.out.println("缓冲区的大小为:" + bufferSize);

    int remaining = out.getRemaining();
    System.out.println("缓冲区的剩余字节数为:" + remaining);
    System.out.println("已经使用的字节数为:" + (bufferSize-remaining));

    out.clear();
    remaining = out.getRemaining();
    System.out.println("缓冲区的剩余字节数为:" + remaining);
%>
</body>
</html>

4、request内置对象

  • equest对象封装的是调用JSP页面的请求信息,它是HttpServletRequest接口的一个实例。
  • 该对象的属性值只在一个请求中保存。
  • 常用方法如下:

image-20210813082012819

<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 14:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>request内置对象的使用</title>
</head>
<body>
<%
    String serverName = request.getServerName();
    System.out.println("获取到的服务器的名称为:" + serverName);
    int serverPort = request.getServerPort();
    System.out.println("获取到的服务器的端口号为:" + serverPort);

    // 通过内置对象设置属性信息,也就是存储数据
    request.setAttribute("name", "马超");
%>
<%-- 实现转发效果,也就是服务器跳转 --%>
<jsp:forward page="requestTarget.jsp"></jsp:forward>
</body>
</html>



<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 14:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>转发获取属性值</title>
</head>
<body>
<%
    Object attribute = request.getAttribute("name");
    out.println("获取到的属性的值为:" + attribute);
%>
</body>
</html>

5、response内置对象

  • response对象用于给客户端相应输出处理结果,它是HttpServletResponse接口的一个实例。
  • 经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL。
  • 常用方法如下:

image-20210813082101691

<%@ page import="javax.xml.crypto.Data" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %><%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 14:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>响应的内置对象</title>
</head>
<body>
<%
    // 表示每个一秒刷新一次
    response.addHeader("refresh", "1");

    // 获取当前的系统时间
    Date date = new Date();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String time = simpleDateFormat.format(date);
    out.println("当前系统的时间为:" + time);
%>
</body>
</html>

6、session对象

  • session对象表示浏览器和服务器之间的一次会话,一次会话可以包含多次请求,在多次请求之间可以借助session对象存储信息,它是HttpSession类型的一个实例。
  • 该对象的属性值在一次会话范围中保存,保存在服务器端,只要不关闭浏览器,默认半个小时内都可以访问。
  • 常用方法如下:

image-20210813082201483

<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 15:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>session内置对象的使用</title>
</head>
<body>
<%
    session.setAttribute("name", "吕布");
    System.out.println("设置成功");
%>
</body>
</html>

7、application内置对象

  • application对象是一个web程序的全局变量,它是ServletContext类型的一个实例。
  • 在整个服务器上保存数据,所有用户共享。
  • 常用方法如下:

image-20210813082238317

<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 15:17
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>application内置对象</title>
</head>
<body>
<%
    application.setAttribute("name", "典韦");
    System.out.println("application属性值设置成功");
%>
</body>
</html>

8、pageContext内置对象

  • pageContext对象是PageContext类型的对象,可以使用这个对象来管理其他的隐含对象。
  • 只在一个页面中保存数据。

image-20210813082316347

<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 15:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>pageContext内置对象</title>
</head>
<body>
<%
    pageContext.setAttribute("name", "太史慈");
    System.out.println("pageContext内置对象的数据设置成功");
%>
<%= "获取到的pageContext数据值为:" + pageContext.getAttribute("name")%>
</body>
</html>

9、exception内置对象

  • exception 对象是Throwable的实例,表示的是JSP的异常信息。
  • 如果要使用它,必须将对应页面page指令的isErrorPage属性设置成true。
  • 单个页面的处理方式
<%@page errorPage="error.jsp" %>
  • 在web.xml中配置统一的异常处理页面。
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error.jsp</location>
</error-page>

四、JavaBean组件(熟悉)

1、基本概念

  • JavaBean 是使用 Java 语言开发的一个可重用的组件,在 JSP 开发中可以使用 JavaBean 减少重复代码,使整个 JSP 代码的开发更加简洁。
  • JavaBean本质上就是Java类,通常要求如下:
    • 属性:全部私有化,通过get和set方法进行访问。
    • 方法:必须是public关键字修饰。
    • 构造器 :必须有无参构造方法。

2、使用方式

  • 使用jsp:useBean的方式创建javaBean实例
<jsp:useBean id=“对象名” scope=“保存范围 class=“包名.类名” />
保存范围有:page|request|sessin|application,默认为page范围。
  • 使用jsp:setProperty的方式设置javaBean的属性值
<jsp:setProperty name="对象名" property="属性名" value="属性值" param="参数名"/>
  • 使用jsp:getProperty的方式获取javaBean的属性值
<jsp:getProperty name="对象名" property="属性名"/>

3、保存范围

  • JavaBean的保存范围有page、request、session以及application,默认是page范围。

4、删除方式

<%
    内置对象.removeAttribute(“JavaBean的名字”); 
%>
package com.soldier.demo02;

public class Student {

    private int id;
    private String name;

    public Student() {
    }

    public Student(int id, String name) {
        /*this.id = id;
        this.name = name;*/
        setId(id);
        setName(name);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>实现JavaBean传入参数的使用</title>
</head>
<body>
<form action="bean2.jsp" method="post">
    学号:<input type="text" name="id1"/><br/>
    姓名:<input type="text" name="name1"/><br/>
    <input type="submit" value="向JavaBean组件传参"/><br/>
</form>
</body>
</html>
<%@ page import="com.soldier.demo02.Student" %><%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 15:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JavaBean组件的使用</title>
</head>
<body>
<%-- 表示创建Student类型的对象由student引用变量负责记录 有效范围是当前页面 --%>
<jsp:useBean id="student" scope="page" class="com.soldier.demo02.Student" />
<%-- 表示student对象中名字为id的属性值设置为1002--%>
<jsp:setProperty name="student" property="id" value="1002" />
<jsp:setProperty name="student" property="name" value="张辽"/>
学号:<jsp:getProperty name="student" property="id"/><br/>
姓名:<jsp:getProperty name="student" property="name"/><br/>
<%
    // 创建Student类型的对象并设置成员变量的数值
    //Student student = new Student();
//    student.setId(1001);
//    student.setName("赵云");
%>
<%--<%="获取到的学号是:" + student.getId() %>
<%="获取到的姓名是:" + student.getName() %>--%>
</body>
</html>




<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 16:06
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现前端页面传入过来的参数的接收和设置</title>
</head>
<body>
<span><% request.setCharacterEncoding("utf-8");%></span>
<jsp:useBean id="student" scope="session" class="com.soldier.demo02.Student"/>
<jsp:setProperty name="student" property="id" param="id1" />
<jsp:setProperty name="student" property="name" param="name1" />
</body>
</html>



<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 16:08
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现JavaBean组件中对象属性值的打印</title>
</head>
<body>
<jsp:useBean id="student" scope="session" class="com.soldier.demo02.Student"/>
<%-- 获取student对象中属性为id的数值--%>
经过参数赋值后获取到的学号:<jsp:getProperty name="student" property="id"/><br/>
经过参数赋值后获取到的姓名:<jsp:getProperty name="student" property="name"/><br/>
</body>
</html>




<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 16:23
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现JavaBean的删除</title>
</head>
<body>
<%
    // 表示从session对象中删除student的属性值
    session.removeAttribute("student");
%>
<%= "删除数据成功" %>
</body>
</html>

五、MVC设计模式

1、基本概念

  • MVC是模型(Model)和视图(View)以及控制器(Controller)的简写,是一种将数据、界面显示和业务逻辑进行分离的组织方式,这样在改进界面及用户交互时,不需要重新编写业务逻辑,从而提高了代码的可维护性。
  • M:主要用于封装业务数据的JavaBean(Bean) 和 业务逻辑的JavaBean(Service)及访问数据库的DAO对象。
  • V:主要负责数据收集 和 数据展现,通常由JSP文件完成。
  • C:主要负责流程控制 和 页面跳转,通常由Servlet完成。

2、基本模型

image-20210813082912732

案例:登陆功能的实现

<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/13
  Time: 16:32
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>实现一个简单的登陆功能</title>
</head>
<body>
<form action="login" method="post">
  用户名:<input type="text" name="userName"/><br/>
  密&nbsp;&nbsp;&nbsp;码:<input type="text" name="passWord"/><br/>
  <input type="submit" value="登陆"/>
</form>
</body>
</html>

/**
 * 数据库的连接
 */
package com.soldier.demo03.util;

import java.sql.*;

public class DbUtil {
    private static String jdbcName;   // 用于描述驱动信息
    private static String dbUrl;      // 用于描述URL信息
    private static String dbUserName; // 用于描述用户名信息
    private static String dbPassWord; // 用于描述密码信息

    // 进行静态成员成员的初始化操作
    static {
        jdbcName = "com.mysql.jdbc.Driver";
        dbUrl = "jdbc:mysql://localhost:3306/db_web";
        dbUserName = "root";
        dbPassWord = "123456";
        try {
            Class.forName(jdbcName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**获取连接
     *
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        Connection con = DriverManager.getConnection(dbUrl,dbUserName,dbPassWord);
        return con;
    }

    /**
     * 关闭连接
     * @param connection
     * @throws SQLException
     */
    public static void close(Connection connection) throws SQLException {
        if (null != connection){
            connection.close();
        }
    }
    public static void close(Connection connection, Statement statement) throws SQLException {
        if (null != connection && null != statement) {
            statement.close();
            connection.close();
        }
    }

    public static void close(Connection connection, Statement statement, ResultSet resultSet) throws SQLException {
        if (null != connection && null != statement && null != resultSet) {
            resultSet.close();
            statement.close();
            connection.close();
        }
    }
}

/**
 * 提供一个用户类
 */
package com.soldier.demo03.bean;

public class User {
    private int id;
    private String userName;
    private String passWord;

    public User() {
    }

    public User(String userName, String passWord) {
        this.userName = userName;
        this.passWord = passWord;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", passWord='" + passWord + '\'' +
                '}';
    }
}

package com.soldier.demo03.dao;

import com.soldier.demo03.bean.User;

import java.sql.SQLException;

public interface UserDao {

    // 自定义抽象方法描述登陆功能的实现
    public abstract User userLogin(User user) throws SQLException;
}


/**
 * 从数据库中查找用户信息
 */
package com.soldier.demo03.dao;

import com.soldier.demo03.bean.User;
import com.soldier.demo03.util.DbUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDaoImp implements UserDao {

    @Override
    public User userLogin(User user){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            // 1.获取数据库连接
            connection = DbUtil.getConnection();

            // 2.编写sql语句
            String sql = "select * from t_user where userName = ? and passWord = ?;";
            // 3.执行sql语句并获得结果
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,user.getUserName());
            preparedStatement.setString(2,user.getPassWord());
            resultSet = preparedStatement.executeQuery();

            if (resultSet.next()) {
                User tu = new User(resultSet.getString("userName"), resultSet.getString("passWord"));
                return tu; // 表示查找成功
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {

            // 4.释放资源
            try {
                DbUtil.close(connection, preparedStatement, resultSet);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return null; // 表示查找失败
    }
}

package com.soldier.demo03.factory;

import com.soldier.demo03.bean.User;
import com.soldier.demo03.dao.UserDao;
import com.soldier.demo03.dao.UserDaoImp;

public class UserDaoFactory {

    /**
     * 通过静态工厂方法模式来实现UserDao实现类对象的创建并返回
     * @return
     */
    public static UserDao getUserDao() {

        return new UserDaoImp();
    }
}

package com.soldier.demo03.service;

import com.soldier.demo03.bean.User;
import com.soldier.demo03.dao.UserDao;
import com.soldier.demo03.factory.UserDaoFactory;

import java.sql.SQLException;

public class UserService {

    private UserDao userDao;

    public UserService() {

        this.userDao = UserDaoFactory.getUserDao();
    }
    /**
     * 自定义成员方法实现根据参数指定的User对象来调用DAO层实现登陆功能
     * @param user
     * @return
     */
    public User userLoginService(User user) {

        try {
            return userDao.userLogin(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

/**
 * 校验用户信息完成登陆
 */
package com.soldier.demo03.servlet;

import com.soldier.demo03.bean.User;
import com.soldier.demo03.service.UserService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "LoginServlet", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求中的用户名和密码信息并打印出来
        String userName = request.getParameter("userName");
        System.out.println("获取到的用户名为:" + userName);
        String passWord = request.getParameter("passWord");
        System.out.println("获取到的密码为:" + passWord);

        // 2.创建UserService类型的对象去实现数据的校验功能
        UserService userService = new UserService();
        User user = userService.userLoginService(new User(userName, passWord));
        if (null == user) {
            System.out.println("登陆失败,用户名或密码错误!");
        } else {
            System.out.println("登陆成功,欢迎使用!");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

posted on 2021-08-13 17:30  寒露凝珠  阅读(64)  评论(0编辑  收藏  举报

导航