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

news2025/2/23 10:16:44

目录

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

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() 方法之前,确保已经将内容写入缓冲区,否则返回的值可能等于缓冲区的大小。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网工】学习笔记1

windows&#xff1a;ipconfig ens40&#xff1a;和别人通信的网卡 lo本地回环和自己通信的网卡 ifconfig down/up 进程&#xff1a;运行起来的程序 使用浏览器访问网站&#xff1a;http&#xff1a;电脑上的程序和网站上的程序之间的通信。 主要用于服务器和客户端之间上传和…

18、matlab信号生成与预处理--剔除异常值:hampel()函数

1、信号生成与预处理--剔除异常值简介 在信号生成和预处理过程中&#xff0c;有时候需要剔除异常值&#xff08;outliers&#xff09;以确保信号数据的准确性和可靠性。MATLAB提供了一些方法来识别和去除异常值&#xff0c;以下是一些常用的方法&#xff1a; 箱线图检测异常值…

多语言版在线出租车预订完整源码+用户应用程序+管理员 Laravel 面板+ 司机应用程序最新版源码

源码带PHP后台客户端源码 Flutter 是 Google 开发的一款开源移动应用开发 SDK。它用于开发 Android 和 iOS 应用&#xff0c;也是为 Google Fuchsia 创建应用的主要方法。Flutter 小部件整合了所有关键的平台差异&#xff0c;例如滚动、导航、图标和字体&#xff0c;可在 iOS 和…

返回值处理器器【Spring源码学习】

定义返回值类型处理器的组合&#xff1b; public static HandlerMethodReturnValueHandlerComposite getReturnValueHandler(){HandlerMethodReturnValueHandlerComposite composite new HandlerMethodReturnValueHandlerComposite();// 处理ModelAndViewcomposite.addHandle…

秋招突击——7/5——设计模式知识点补充——适配器模式、代理模式和装饰器模式

文章目录 引言正文适配器模式学习篮球翻译适配器 面试题 代理模式学习面试题 装饰器模式学习装饰模式总结 面试题 总结 引言 为了一雪前耻&#xff0c;之前腾讯面试的极其差&#xff0c;设计模式一点都不会&#xff0c;这里找了一点设计模式的面试题&#xff0c;就针对几个常考…

加密(3)非对称加密

一、介绍 1、概念 非对称加密&#xff0c;又称现代加密算法&#xff0c;非对称加密是计算机通信安全的基石&#xff0c;保证了加密数据不会被破解。加密和解密使用的是两个不同的密钥&#xff0c;这种算法叫作非对称加密算法。 2、示例 首先生成密钥对, 公钥为(5,14)&#…

docker中实现多机redis主从集群

redis主从集群是每个使用redis的小伙伴都必需知道的&#xff0c;那如何在docker中快速配置呢&#xff1f;这篇来教你快速上手&#xff0c;跟着复制完全就能用&#xff01;&#xff01; 1. 前置准备 1.1 docker安装 以防有小伙伴没预先安装docker&#xff0c;这里提供安装步骤…

小白学python(第五天)if语句的拓展

上次因为个人原因才匆忙讲解完python的顺序条件&#xff0c;导致if语句中有部分知识点没讲完&#xff0c;那么本篇文章将带大家继续学习python的if语句。 前情回顾 上集说到 if语句的模板&#xff0c;并且让大家注意了if后面直接跟条件无需加括号以及条件后冒号也不能忘&…

Android Camera2 集成人脸识别算法

这可能是全网唯一一篇介绍Android Camera2接口集成人脸算法的文章了~ 写在前面&#xff1a; 说起人脸识别&#xff0c;相信大家都不会感到陌生&#xff0c;在我们平时的工作生活中&#xff0c;人脸打卡、刷脸支付等等已经是应用的非常广泛了&#xff0c;人脸识别也给我们的生活…

如何给gitlab其他访问者创建账号并增加权限

嗨&#xff0c;今天创建了项目之后&#xff0c;我想把项目链接发送给其他人&#xff0c;让他下载这个项目&#xff0c;结果发现对方打开显示登录的界面&#xff0c;没错&#xff0c;他要想使用这个git下载项目&#xff0c;首先他的有一个git账号 接下来我找有权限的相关人员给他…

Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method--论文笔记

论文笔记 资料 1.代码地址 https://github.com/iBelieveCJM/pseudo_label-pytorch 2.论文地址 3.数据集地址 论文摘要的翻译 本文提出了一种简单有效的深度神经网络半监督学习方法。基本上&#xff0c;所提出的网络是以有监督的方式同时使用标记数据和未标记数据来训练的…

机器学习——决策树及其可视化

1、决策树概念 顾名思义&#xff0c;决策树是利用数据结构中树结构来进行判断&#xff0c;每一个结点相当于一个判断条件&#xff0c;叶子结点即是最终的类别。以鸢尾花为例&#xff0c;可以得到如下的决策树&#xff1a; 2、决策树分类的依据是什么&#xff1f; 根据前面分…

MySQL---事务管理

1.关于事务 理解和学习事务&#xff0c;不能只站在程序猿的角度来理解事务&#xff0c;而是要站在使用者&#xff08;用户&#xff09;的角度来理解事务。 比如支付宝转账&#xff0c;A转了B100块前&#xff0c;在程序猿的角度来看&#xff0c;是两条update操作&#xff0c;A …

电源设计技巧:DDR内存电源

CMOS逻辑系统的功耗主要与时钟频率、系统内各栅极的输入电容以及电源电压有关。器件形体尺寸减小后&#xff0c;电源电压也随之降低&#xff0c;从而在栅极层大大降低功耗。这种低电压器件拥有更低的功耗和更高的运行速度&#xff0c;允许系统时钟频率升高至千兆赫兹级别。在这…

非参数检测1——概述

在绝大多数的检测理论研究中&#xff0c;都着重于设计最优的检测器&#xff0c;最优检测器拥有最优的性能&#xff0c;但需要知道对输入信号和噪声的完整的统计学描述&#xff0c;这在实际应用中很可能无法实现。 实际情况&#xff1a; 设计检测系统时&#xff0c;无法得知完…

Kafka的简介、架构、安装使用、生产者、消费者、高吞吐、持久化及与Flume整合

Apache Kafka是一个分布式流处理平台&#xff0c;最初由LinkedIn公司开发&#xff0c;后来成为Apache软件基金会的一个顶级项目。Kafka主要用于构建实时数据管道和流处理应用程序。Kafka广泛应用于日志聚合、实时分析、事件源、流处理等场景。它与各种数据处理框架和数据库集成…

纯javascript实现图片批量压缩打包zip下载后端ThinkPHP多国语言切换国际站

最近在做一个多国语言的工具站&#xff0c;需要实现多国语言切换&#xff0c;说到多国语言站&#xff0c;肯定是有2种方式&#xff0c;第一是子域名&#xff0c;第二就是子目录。根据自己的需要来确定。 后台配置如下&#xff1a; 前台显示&#xff1a; 前端纯javascript实现…

VS code修改底部的行号的状态栏颜色

VSCode截图 相信很多小伙伴被底部的蓝色状态栏困扰很久了 处理的方式有两种&#xff1a; 1、隐藏状态栏 2、修改其背景颜色 第一种方法大伙都会&#xff0c;今天就使用第二种方法。 1、点击齿轮进入setting 2、我现在用的新版本&#xff0c;设置不是以前那种json格式展示&…

im即时通讯哪家好?WorkPlus im即时通讯集成底座为企业保驾护航

在当今数字化时代&#xff0c;即时通讯是企业内部沟通和协作的重要工具&#xff0c;提高工作效率和团队协作效果。在众多IM即时通讯提供商中&#xff0c;WorkPlus作为一家具有独特优势的企业IM即时通讯集成底座&#xff0c;为企业提供了全面的功能和安全保障&#xff0c;为企业…

一道有意思的简单题 [NOIP2010 普及组] 接水问题

题目&#xff1a; 题解&#xff1a; 每一次新来的同学的接水时间都加在现在已有的水龙头中接水时间最短的&#xff0c;总时间就为n次操作后水龙头中接水时间的最长值。 #include<bits/stdc.h> using namespace std; multiset<int>s;int main(){int n,m;scanf(&qu…