【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: 86189Date: 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: 86189Date: 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: 86189Date: 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: 86189Date: 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));}
//    将计数器重置为0boolean resetCounter = Boolean.parseBoolean(request.getParameter("resetCounter"));if (resetCounter) {count = 0;application.setAttribute("num", count);}%>

HTML代码

<%--Created by IntelliJ IDEA.User: 86189Date: 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.xdnf.cn/news/1473309.html

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

相关文章

MySQL数据库树状结构查询

一、树状结构 MySQL数据库本身并不直接支持树状结构的存储&#xff0c;但它提供了足够的灵活性&#xff0c;允许我们通过不同的方法来模拟和实现树状数据结构。具体方法看下文。 数据库表结构&#xff1a; 实现效果 查询的结果像树一样 二、使用 以Catalog数据表&#xff0c…

Vite: 近几个版本的更新

概述 在 2021 年 2 月&#xff0c;尤大正式推出了 Vite 2.0 版本&#xff0c;可以说是 Vite 的一个重要转折点&#xff0c;自此之后 Vite 的用户量发生了非常迅速的增长&#xff0c;很快达到了每周 100 万的 npm 下载量。同时&#xff0c;Vite 的社区也越来越活跃&#xff0c;…

HTTP协议格式

目录 正文&#xff1a; 1.概述 2.主要特点 3.请求协议格式 4.响应协议格式 5.响应状态码 总结&#xff1a; 正文&#xff1a; 1.概述 HTTP 协议是用于传输超文本数据&#xff08;如 HTML&#xff09;的应用层协议&#xff0c;它建立在传输层协议 TCP/IP 之上。当我们在…

stm32定时器与pwm波

文章目录 4 TIM4.1 SysTick系统定时器4.2 TIM定时器中断与微秒级延时4.3 TIM使用PWM波4.3.1 PWM介绍4.3.2 无源蜂鸣器实现 4.4 TIM ,PWM常用函数 4 TIM 4.1 SysTick系统定时器 ​ Systick系统滴答&#xff0c;&#xff08;同时他有属于自己的中断&#xff0c;可以利用它来做看…

Unity 使用AVProMovieCapture实现Game视图屏幕录制

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity 使用AVProMovieCapture实现Game视图屏幕录制 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心…

【二】Ubuntu24虚拟机在Mac OS的VMware Fusion下无法联网问题

文章目录 1.环境背景2. 需求背景3. 解决方法3.1 在mac的终端查看虚拟机NAT网络3.2 查看unbuntu节点2的网络配置3.3 问题定位与解决3.3.1 检查是否有冲突3.3.2 冲突解决方法 4. 总结4.1 NAT 网关的原理4.2 VMware Fusion 的 NAT 模式4.3 为什么网关冲突会引起问题4.4 理解配置冲…

Linux 程序卡死的特殊处理

一、前言 Linux环境。 我们在日常编写的程序中&#xff0c;可能会出现一些细节问题&#xff0c;导致程序卡死&#xff0c;即程序没法正常运行&#xff0c;界面卡住&#xff0c;也不会闪退... 当这种问题出现在客户现场&#xff0c;那就是大问题了。。。 当我们暂时还无法排…

利用 STM32 实现多协议物联网网关:Modbus/Zigbee 到以太网/Wi-Fi 的数据桥接

摘要: 随着物联网技术的飞速发展&#xff0c;不同通信协议之间的互联互通成为了构建智能化系统的一大挑战。本文将以实战项目为例&#xff0c;详细介绍如何利用 STM32 微控制器实现 Modbus/Zigbee 与以太网/Wi-Fi 之间的协议转换&#xff0c;从而打通传感器数据上传至服务器的“…

代码随想录Day69(图论Part05)

并查集 // 1.初始化 int fa[MAXN]; void init(int n) {for (int i1;i<n;i)fa[i]i; }// 2.查询 找到的祖先直接返回&#xff0c;未进行路径压缩 int.find(int i){if(fa[i] i)return i;// 递归出口&#xff0c;当到达了祖先位置&#xff0c;就返回祖先elsereturn find(fa[i])…

实现沉浸式体验的秘诀:深入了解折幕投影技术!

在当今多媒体技术的浪潮中&#xff0c;投影技术已蜕变成为超越传统内容展示范畴的非凡工具&#xff0c;它深度融合了互动性与沉浸感&#xff0c;成为连接观众与虚拟世界的桥梁。折幕投影技术&#xff0c;作为这一领域的璀璨明珠&#xff0c;更是以其独特而神奇的手法&#xff0…

如何从相机的存储卡中恢复原始照片

“不好了。” 当您意识到自己不小心从存储卡中删除了照片&#xff0c;或者错误地格式化了相机的记忆棒时&#xff0c;您首先会喊出这两个词。这是一种常见的情况&#xff0c;每个人一生中都会遇到这种情况。幸运的是&#xff0c;有办法从相机的 RAW 记忆棒中恢复已删除的照片。…

笛卡尔集的情况 rows 1

running ~ 1 hour and TEMP Space using > 450 GB 1000*4.9k4.9M 1*4.9K4.9K

【LabVIEW学习篇 - 3】:程序结构——顺序结构、for循环、while循环

文章目录 顺序结构案例一案例二 for循环while循环 顺序结构 LabVIEW中的顺序结构是一种常用的控制结构&#xff0c;用于按顺序执行程序的不同部分。顺序结构在程序中按照从左到右的顺序依次执行各个子结构&#xff0c;类似于传统的文本编程语言中的顺序执行。 案例一 案例一…

查询数据库下所有表的数据量

个人思路: 首先把库里Schema下表名拿出来放记事本(EmEditor)里, 用一下正则匹配替换 (\w) → select \1 tableName,count(1) from \1 union all 然后把最后的union all删除掉,替换为order by tableName

C++部分复习笔记上

C语法复习 1. C入门基础 缺省参数 半缺省参数必须从右往左依次来给出&#xff0c;不能间隔着给缺省参数不能在函数声明和定义中同时出现缺省值必须是常量或者全局变量C语言不支持&#xff08;编译器不支持&#xff09; 函数重载 函数重载是函数的一种特殊情况&#xff0c;…

红薯小眼睛接口分析与Python脚本实现

文章目录 1. 写在前面2. 接口分析3. 算法脚本实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Py…

数据库系统原理练习 | 作业2-第2章关系数据库(附答案)

整理自博主本科《数据库系统原理》专业课完成的课后作业&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方&#xff0c;欢迎各位斧正。 专业课本&#xff1a; 目录 一、选择题 二、填空题 三、简答题 四、关系代数 1.课本p70页&…

Vatee万腾平台:引领智能互联新时代

在科技浪潮的推动下&#xff0c;我们正步入一个前所未有的智能互联新时代。在这个时代里&#xff0c;万物皆可互联&#xff0c;数据成为新的生产要素&#xff0c;智能技术深刻改变着人类社会的每一个角落。而Vatee万腾平台&#xff0c;正是这一新时代的引领者&#xff0c;以其卓…

盘点各个国家的国宝

中国&#xff1a;熊猫 熊猫已有800万年的历史&#xff0c;和它们同时代的动物都已灭绝&#xff0c;大熊猫生存至今成为“活化石”。 俄罗斯&#xff1a;北极熊 北极熊是世界上最大的陆地食肉动物&#xff0c;体型巨大&#xff0c;性格凶猛。 美国&#xff1a;白头海雕 白头海雕…

事件分发机制:demo复现自定义ViewGroup点击事件不起作用

几年前遇到的一个bug&#xff0c;不弄清楚心里就是不舒服&#xff01; 平时应用开发中&#xff0c;经常遇到的UI需求&#xff0c;例如抖音的设置界面&#xff0c;如下图所示&#xff1a; 很容易想到&#xff0c;自定义一个Layout&#xff0c;左边一个图标&#xff0c;中间文…