目录
一、通过测试以下代码,了解各种隐含对象与作用域变量的使用
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() 方法之前,确保已经将内容写入缓冲区,否则返回的值可能等于缓冲区的大小。