【JavaWeb程序设计】JSP内置对象

目录

一、通过测试以下代码,了解各种隐含对象与作用域变量的使用

1. request隐含对象的使用(request.jsp)

2. out隐含对象的使用(out.jsp)

3. application隐含对象的使用(application.jsp)

4. session隐含对象的使用(session.jsp)

二、设计一个简单的后台管理系统,用户通过登陆页面的合法验证后才能使用其他页面,否则访问这些页面是跳转回登陆页面。

1. 要求设计用户类和用户账号的验证方法

2.  “其他页面”可以编写任意内容,用户在未进行登陆验证时,该页面无法直接访问,直接访问该页面会导致跳转到登录页。

(1)运行截图

(2)用户类User

(3)登录页面(login.jsp)

(4)判断账号是否存在,重定向(loginAction.jsp)

(5)其他页面(home.jsp)

三、编写一个猜数字的小游戏

        1. 当用户访问页面c1.jsp时,服务器随机分配给用户一个1~100的整数(Math.Random可以在[0.0,1.0]范围内产生随机数),然后将这个证书存在用户的session对象中。

        2. 用户单击超链接“去猜这个数”,将转到页面guess.jsp。在该页面中,如果猜测数大于机器生成的数,显示“您猜大了”和这是第几次猜测;如果猜小了,显示“您猜小了”和这是第几次猜测;如果相等,显示“您猜对了”和这是第几次猜测,同时下面显示一个超链接“重新获得随机数”,单击此链接返回c1.jsp页面重新开始猜数。

(1)运行截图

(2)c1.jsp

(3)guess.jsp


一、通过测试以下代码,了解各种隐含对象与作用域变量的使用

1. request隐含对象的使用(request.jsp)

<%@ page contentType="text/html;charset=gb2312" %>

<%

  String remoteAddr = request.getRemoteAddr();

  String remoteHost = request.getRemoteHost();

  int serverPort = request.getServerPort();

 %>

<html>

<body>

你的IP地址为:<%=remoteAddr %><br>

你的主机名为:<%=remoteHost %><br>

服务器的端口号为:<%=serverPort %><br>

</body>

</html>

      页面运行结果如下图所示:

图1 request.jsp页面的运行结果

我的运行结果如下:

表示客户端正在使用 IPv6 的本地回环地址 ::1 进行访问。

如果要获取IPV4地址,访问的时候把localhost换成127.0.0.1即可。

2. out隐含对象的使用(out.jsp)

<%@ page contentType="text/html;charset=gb2312" %>

<html><head><title>Out Example</title></head>

<body>

<h2>out对象的使用</h2>

<%

  out.print("学习使用out对象");

  int buffer = out.getBufferSize();

  int available = out.getRemaining();

 %>

 <br>

 out对象的类型为:<%= out.getClass().getName() %><br>

 BufferSize=<%= buffer %><br>

 Available=<%= available %>

</body></html>

上述页面运行结果如下图所示:

图2 out.jsp页面的运行结果

我的运行结果如下:

3. application隐含对象的使用(application.jsp)

<%@ page contentType="text/html;charset=gb2312" %>

<%

  int number = 0;

  Integer num =(Integer)application.getAttribute("num");

  if(num==null){

    application.setAttribute("num",new Integer(number));

  }

  else{

    number = num.intValue()+1;

    application.setAttribute("num",new Integer(number));

  }

 %>

<html><head><title>application example</title></head>

<body>

<center><font color="#0000ff" size="5">application对象示例</font>

</center>

<hr>

本页面文件的实际路径是:

<br><%=application.getRealPath("application.jsp") %><br>

application对象中变量num的值为:

<%=application.getAttribute("num") %>

</body>

</html>

上述页面运行结果如下图所示:

图3 application.jsp页面的运行结果

        对代码的理解(实现了一个计数器的功能,每次访问页面时将计数器加1,并将计数器的值存储在 application 对象中)

第一次访问,num的值初始化为0

第二次访问,num值+1

以此类推.....

4. session隐含对象的使用(session.jsp)

<%@ page contentType="text/html;charset=gb2312" %>

<%@ page session="true" %>

<%

  session.setAttribute("user","欧阳清风");

%>



<html>

<body>

您的会话ID是:<%=session.getId()%><br>

session对象中存放的变量user的值为:<%=session.getAttribute("user")%>

</body>

</html>

    上述页面运行结果如下图所示:

图4 session.jsp页面的运行结果 

我的运行结果如下:

二、设计一个简单的后台管理系统,用户通过登陆页面的合法验证后才能使用其他页面,否则访问这些页面是跳转回登陆页面。

1. 要求设计用户类和用户账号的验证方法

2.  “其他页面”可以编写任意内容,用户在未进行登陆验证时,该页面无法直接访问,直接访问该页面会导致跳转到登录页。

(1)运行截图

正确输入(跳转到home.jsp)

 错误输入(提示重新输入)

 重启TOMCAT服务器,访问home.jsp,自动进入登录页面

2用户类User

package com.ryx.web.sy6_2;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
    private String username;
    private String password;
}

【说明】 使用了 Lombok 注解来自动生成 无参构造、有参构造、getter、setter、toString、equals 等方法。

(3)登录页面(login.jsp)

<%------------------------JSP程序段---------------------------%>
<%
    request.setCharacterEncoding("UTF-8");
    String msg = request.getParameter("msg");
%>
<%
    if (msg != null) {
        String errorMessage = "账号或密码有误,请重新输入!";
%>
        <script>
            var error = '<%= errorMessage %>';
            alert(error);
        </script>
<%
    }
%>
<%------------------------------CSS样式---------------------------%>
    <style>
        body {
            display: flex;
            justify-content: center;
            padding-top: 40px;
        }

    </style>
<%--
  Created by IntelliJ IDEA.
  User: 86189
  Date: 2023/10/13
  登录页面
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>

<head>
    <title>登录页面</title>
</head>


<body>
<%-------------------------登录表单-----------------------------%>
<form action="loginAction.jsp" method="post">
    <h1 align="center">登录小测试</h1>
    <br>
    <table width="250px">
        <tr>
            <td>
                <laber for="username">用户名:</laber>
            </td>
            <td><input type="text" id="username" name="username" required></td>
        </tr>
        <tr>
            <td><label for="password">密码:</label></td>
            <td><input type="password" id="password" name="password" required></td>
        </tr>
        <tr>
            <td align="center"><input type="submit" value="登录"></td>
            <td align="center"><input type="reset" value="重置"></td>
        </tr>
    </table>

</form>
</body>
</html>

(4)判断账号是否存在,重定向(loginAction.jsp)

<%@ page import="com.ryx.web.sy6_2.User" %>
<%@ page import="java.sql.*" %>
<%--
  Created by IntelliJ IDEA.
  User: 86189
  Date: 2023/10/13
  判断输入的用户信息是否存在数据库
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%!
    public boolean validateUser(String username, String password) {
        // 使用JDBC连接数据库
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/dbname";  //数据库
        String user = "root"; //账户
        String psword = "abc1234"; //密码

        try {
            try {
                try {
                    Class.forName(driver);
                } catch (ClassNotFoundException e) {
                    throw new RuntimeException(e);
                }
                // 获取数据库连接
                connection = DriverManager.getConnection(url, user, psword);
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                // 构造查询语句
                String query = "SELECT * FROM user02 WHERE username= ? ";

                // 创建PreparedStatement对象,并设置参数
                statement = connection.prepareStatement(query);
                statement.setString(1, username);

                // 执行查询
                resultSet = statement.executeQuery();
                // 验证用户名和密码
                if (resultSet.next()) {
                    String storedPassword = resultSet.getString("password");
                    if (storedPassword.equals(password)) {
                        return true;
                    }
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

        } finally {
            // 关闭连接和释放资源
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
    }
 %>

<%
    request.setCharacterEncoding("UTF-8");
    String username = request.getParameter("username");
    String password = request.getParameter("password");

    boolean isValidUser = validateUser(username, password);
    //验证成功
    if (isValidUser) {
        // 创建形 Builder 构造者模式,链式编程
        User user = User.builder()
                    .username(username)
                    .password(password)
                    .build();
//      User user = new User(username, password);
        session.setAttribute("user", user);
        //跳转到其他页面
        response.sendRedirect("home.jsp");
    } else {
        //验证失败,提示出错
        response.sendRedirect("login.jsp?msg=failed");
    }
 %>

【JDBC连接MYSQL数据库获取用户信息】将用户数据存储在数据库中,进行用户账号验证。如果登录时输入相应的账号和密码,那么登录合法,否则,提示重新登录。

以下是我在数据库中存放的一些数据

(5)其他页面(home.jsp)

JSP程序代码

<%@ page import="com.ryx.web.sy6_2.User" %>

<%--
  Created by IntelliJ IDEA.
  User: 86189
  Date: 2023/10/13
  主页面:显示:欢迎您!xxx ;未登录用户跳转到登录页面
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    User user = (User) session.getAttribute("user");
    //    未登录用户跳转到登录页面
    if (user == null) {
        response.sendRedirect("login.jsp");
    }
%>

HTML代码 

<html>
<head>
    <title>主页面</title>
</head>
<body>
<h1 align="center">欢迎您! <%= user != null ? user.getUsername() : "" %>
</h1>
</body>
</html>

三、编写一个猜数字的小游戏

        1. 当用户访问页面c1.jsp时,服务器随机分配给用户一个1~100的整数(Math.Random可以在[0.0,1.0]范围内产生随机数),然后将这个证书存在用户的session对象中。

        2. 用户单击超链接“去猜这个数”,将转到页面guess.jsp。在该页面中,如果猜测数大于机器生成的数,显示“您猜大了”和这是第几次猜测;如果猜小了,显示“您猜小了”和这是第几次猜测;如果相等,显示“您猜对了”和这是第几次猜测,同时下面显示一个超链接“重新获得随机数”,单击此链接返回c1.jsp页面重新开始猜数

(1)运行截图

这里的随机数可以打印在控制台,开发者工具那里自行查看测试

第一次输入:

第二次输入:

第三次输入:

点击“重新获得随机数”(跳转回c1.jsp) 

重新点超链接,重置猜数次数为0,刷新随机数。

(2)c1.jsp

JSP程序代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    //生成1-100之间的随机数,并存入session中
    int randomNumber = (int) Math.floor(Math.random() * 100 + 1);
    session.setAttribute("random", randomNumber);
%>

 HTML代码

<%@ page import="java.util.Random" %>
<%--
  Created by IntelliJ IDEA.
  User: 86189
  Date: 2023/10/14
  开始界面,生成随机数
--%>

<html>
<head>
    <title>猜数字游戏</title>
</head>
<body>
<h1>猜数字小游戏</h1>
<p>系统已生成一个1-100的随机整数</p>
<a href="guess.jsp?resetCounter=true">去猜这个数</a>
</body>
</html>

(3)guess.jsp

JSP程序代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//   获取生成的随机数
//  int finalNumber = (int) application.getAttribute("random"); //空指针异常
    Integer finalNumberObj = (Integer) session.getAttribute("random");
    int finalNumber = finalNumberObj != null ? finalNumberObj : 0;
//    获取用户猜测的数字
    String guessParam = request.getParameter("guess");
    int guessNumber = 0;    //初始化为0,防止空指针异常
    if (guessParam != null && !guessParam.isEmpty()) {
        try {
            guessNumber = Integer.parseInt(guessParam);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
    }
//    计数器
    int count = 0;
    Integer num = (Integer) application.getAttribute("num");
    if (num == null) {
        application.setAttribute("num", new Integer(count));
    } else {
        count = num.intValue() + 1;
        application.setAttribute("num", new Integer(count));
    }
//    将计数器重置为0
    boolean resetCounter = Boolean.parseBoolean(request.getParameter("resetCounter"));
    if (resetCounter) {
        count = 0;
        application.setAttribute("num", count);
    }

%>

HTML代码

<%--
  Created by IntelliJ IDEA.
  User: 86189
  Date: 2023/10/14
  处理猜测是否正确和猜数次数
--%>

<html>
<head>
    <title>猜测结果</title>
</head>
<body>
<h1>猜测结果</h1>
<%--为了方便测试打印随机数--%>
<p>随机数为:<%out.println(finalNumber);%></p>

<form action="guess.jsp" method="post">
    <input type="hidden" name="final" value="<%= finalNumber %>">
    <input type="number" name="guess" placeholder="请输入您猜测的数字">
    <button type="submit">验证</button>
</form>
<%if(guessParam != null){ %>
    <% if (guessNumber > finalNumber) { %>
    <p>您猜大了,这是第<%= count %>次猜测</p>
    <% } else if (guessNumber < finalNumber) { %>
    <p>您猜小了,这是第<%= count %>次猜测</p>
    <% } else { %>
    <p>您猜对了,这是第<%= count %>次猜测</p>
    <% } %>
<% } %>
<a href="c1.jsp">重新获得随机数</a>
</body>
</html>

四、心得体会

1. out 对象:用于向响应输出流中写入响应信息的对象,它的 对象类型为org.apache.jasper.runtime.JspWriterImpl。在 JSP 页面中,可以直接使用 out 对象输出文本、HTML 标记等内容。

2. 在使用 out 对象的 print() 方法输出内容之前,不能调用 out 对象的其他方法,因为 print() 方法会触发响应的输出流

3. getBufferSize() 方法用于获取缓冲区的大小,表示已经写入到缓冲区的字符数。在调用 getBufferSize() 方法之前,确保已经将内容写入缓冲区,否则返回的值可能为 0。

4. getRemaining() 方法用于获取缓冲区剩余的可用空间,表示缓冲区还能存储多少个字符。同样,在调用 getRemaining() 方法之前,确保已经将内容写入缓冲区,否则返回的值可能等于缓冲区的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/778916.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ONLYOFFICE最新8.1版本——桌面编辑器简单测评

前言 大家好&#xff0c;我是小雨&#xff0c;看到最近ONLYOFFICE更新了最新的版本&#xff0c;更新了一下当前版本来具体的测评一下&#xff0c;先来看看官网提供的各类更新信息&#xff0c;下面是我找到的三个主页&#xff0c;包括功能演示链接&#xff0c;官网连接以及专门…

UDP协议:独特之处及其在网络通信中的应用

在网络通信领域&#xff0c;UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;是一种广泛使用的传输层协议。与TCP&#xff08;传输控制协议&#xff0c;Transmission Control Protocol&#xff09;相比&#xff0c;UDP具有其独特的特点和适用场景…

Go基础知识

目标 简单介绍一下 GO 语言的诞生背景&#xff0c;使用场景&#xff0c;目前使用方案简单介绍一下 GO的使用&#xff0c;GO的基础语法&#xff0c;简单过一下一些GO的语言例子着重介绍一下GO的特性&#xff0c;为什么大家都使用GO语言&#xff0c;GO的内存结构、为什么都说GO快…

python No interpreter

在 Python 的环境中&#xff0c;如果你遇到了 "No interpreter" 的错误或提示&#xff0c;这通常意味着你的开发环境或IDE&#xff08;如PyCharm、VS Code、Jupyter等&#xff09;没有找到 Python 解释器。要解决这个问题&#xff0c;你可以按照以下步骤操作&#xf…

基于Transformer神经网络的锂离子电池剩余使用寿命估计MATLAB实现【NASA电池数据集】

Transformer神经网络 基于Transformer神经网络的锂离子电池剩余使用寿命估计是一种先进的方法&#xff0c;它利用了Transformer模型在处理序列数据方面的优势。 Transformer能够有效地捕捉时间序列中的长程依赖关系和非线性模式&#xff0c;相比传统的基于循环神经网络&…

InnoDB中的表级锁、页级锁、行级锁详解

MySQL支持三种层级的锁定 我们知道&#xff0c;MySQL支持三种层级的锁定&#xff0c;分别为&#xff1a; 表级锁定 表级锁是MySQL中锁定粒度最大的一种锁&#xff0c;表示对当前操作的整张表加锁&#xff0c;它实现简单&#xff0c;资源消耗较少&#xff0c;被大部分MySQL引…

【C++/STL】优先级队列的介绍与模拟实现仿函数

✨ 万物与我皆是自由诗 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1…

深入理解TCP协议格式(WireShark分析)

传输控制协议&#xff08;TCP&#xff09;是互联网中最为关键的通信协议之一。了解TCP协议的细节不仅对于网络工程师至关重要&#xff0c;对于任何涉及网络通信的软件开发人员而言都是必备的知识。本文旨在深入探讨TCP协议&#xff0c;从协议的基本概述到其工作机制&#xff0c…

多维度多场景文档门户,鸿翼ECM文档云打造文档管理新范式

​在现代企业运营中&#xff0c;内容协作的效率直接影响到组织的整体表现和竞争力。传统的文档管理系统都是通过目录结构的方式进行文件管理&#xff0c;在实际业务中无法满足用户多视角、多维度、多场景的文档业务需求。因此&#xff0c;搭建结合文档体系的业务门户是许多企业…

AI绘画【光影模型】,穿越赛博迷雾,重塑光影艺术本真魅力

有时候是不是觉得单纯依靠大模型产生的图片作品光线方面平平无奇&#xff0c;依靠提示词&#xff0c;各种权重的调整费了九牛二虎之力才抽到一张感觉还算满意的作品。这个时候我们可以考虑结合相关Lora来进行。今天带来了一款光影氛围灯效果Lora——None-光染摄影&#xff0c;该…

进程的概念

一.进程和程序的理解 首先抛出结论&#xff1a;进程是动态的&#xff0c;暂时存在于内存中&#xff0c;进程是程序的一次执行&#xff0c;而进程总是对应至少一个特定的程序。 程序是静态的&#xff0c;永久的存在于磁盘中。 程序是什么呢&#xff1f;程序其实就是存放在我们…

Windows如何查看端口是否占用,并结束端口进程

需求与问题&#xff1a;前后端配置了跨域操作&#xff0c;但是仍然报错&#xff0c;可以考虑端口被两个程序占用&#xff0c;找不到正确端口或者后端接口书写是否规范&#xff0c;特别是利用Python Flask书写时要保证缩进是否正确&#xff01; Windows操作系统中&#xff0c;查…

Matlab中collectPlaneWave函数的应用

查看文档如下&#xff1a; 可以看出最多5个参数&#xff0c;分别是阵列对象&#xff0c;信号幅度&#xff0c;入射角度&#xff0c;信号频率&#xff0c;光速。 在下面的代码中&#xff0c;我们先创建一个3阵元的阵列&#xff0c;位置为&#xff1a;&#xff08;-1,0,0&#x…

代码随想录算法训练Day57|LeetCode200-岛屿数量、LeetCode695-岛屿的最大面积

岛屿数量 题目描述 力扣200-岛屿数量 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此…

设计模式之单例模式(Java)

单例模式实现方式&#xff1a;懒汉式、饿汉式、双重检查、枚举、静态内部类&#xff1b; 懒汉式&#xff1a; /*** 懒汉式单例模式* author: 小手WA凉* create: 2024-07-06*/ public class LazySingleton implements Serializable {private static LazySingleton lazySinglet…

操作系统中的权限说明

什么是权限 权限在操作系统中是一个重要的功能&#xff0c;它允许你控制谁可以读取、写入或执行某个文件。不同的操作系统和文件系统可能有不同的权限模型&#xff0c;但在类Unix系统&#xff08;如Linux和macOS&#xff09;中&#xff0c;文件权限通常由三部分组成&#xff1a…

提升系统稳定性:熔断、降级和限流策略详解

文章目录 前言一、熔断&#xff08;Circuit Breaker&#xff09;二、降级&#xff08;Degradation&#xff09;三、限流&#xff08;Rate Limiting&#xff09;四、应用案例五、小结推荐阅读 前言 随着互联网业务的快速发展&#xff0c;系统稳定性和高可用性成为现代分布式系统…

Spring源码十三:非懒加载单例Bean

上一篇Spring源码十二&#xff1a;事件发布源码跟踪中&#xff0c;我们介绍了Spring中是如何使用观察者设计模式的思想来实现事件驱动开发的&#xff1a;实际上就是将所有监听器注册到广播器中&#xff0c;并通过监听该事件的监听器来处理时间的。结合前面十二篇文章我们将Spri…

电表读数检测数据集VOC+YOLO格式18156张12类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;18156 标注数量(xml文件个数)&#xff1a;18156 标注数量(txt文件个数)&#xff1a;18156 标…

cs224n作业4

NMT结构图&#xff1a;&#xff08;具体结构图&#xff09; LSTM基础知识 nmt_model.py&#xff1a; 参考文章&#xff1a;LSTM输出结构描述 #!/usr/bin/env python3 # -*- coding: utf-8 -*-""" CS224N 2020-21: Homework 4 nmt_model.py: NMT Model Penchen…