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

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值