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