实验十一 Servlet(二)

news/2025/2/4 9:38:52 标签: hive, hadoop, 数据仓库

实验十一 Servlet(二)

【实验目的】
1.了解Servlet运行原理
2.掌握Servlet实现方式

【实验内容】
改造实验10,引入数据库,创建用户表,包括用户名和密码:客户端通过login.jsp发出登录请求,请求提交到loginServlet处理。如果用户名和密码跟用户表匹配则视为登录成功,跳转到loginSuccess.jsp页面,显示“欢迎你”+用户名;否则跳转到loginFail.jsp页面,显示“登录失败”,通过超链接返回login.jsp。
说明:把用户名和密码跟用户表匹配的功能放到loginServlet并实现相应请求转发或跳转即可。可以暂时不考虑创建其它java类。
login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="loginServlet" method="post">
    <label for="username">用户名:</label>
    <input type="text" id="username" name="username" required><br>
    <label for="password">密码:</label>
    <input type="password" id="password" name="password" required>
    <input type="submit" value="登陆">
</form>
</body>
</html>

loginServlet

package servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.*;
import java.sql.*;
//使用@WebServlet注解
@WebServlet(name = "loginServlet" )
public class loginServlet extends HttpServlet {
    private static final String url = "jdbc:mysql://localhost:3306/test9";
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从请求中获取用户名(stuId)和密码(stuPwd)
        String stuId = request.getParameter("username");
        String stuPwd = request.getParameter("password");
        try {
            // 加载和注册JDBC驱动
            Class.forName("com.mysql.jdbc.Driver");

            Connection conn = DriverManager.getConnection(url, "root", "123456");

            String sql = "select * from password where stuId = ? and stuPwd = ?";

            //创建PreparedStatement对象,这有助于防止SQL注入攻击
            PreparedStatement stmt = conn.prepareStatement(sql);

            //使用setString方法设置SQL查询中的参数值
            stmt.setString(1,stuId);
            stmt.setString(2,stuPwd);


            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
                //从结果集中获取用户名
                String stuname = rs.getString("stuId");

                //将用户名保存到会话中
                HttpSession session = request.getSession();
                session.setAttribute("username",stuname);

                //重定向到loginSuccess.jsp页面
                response.sendRedirect("loginSuccess.jsp");
            } else {
                //重定向到loginFail.jsp页面
                response.sendRedirect("loginFail.jsp");
            }
            rs.close();
            stmt.close();
            conn.close();
        } catch (SQLException se) {
            se.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

loginSuccess.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陆成功</title>
</head>
<body>
    <h4>欢迎你,${sessionScope.username}</h4>
</body>
</html>

loginFail.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陆失败</title>
</head>
<body>
    <h4>登录失败</h4>
    <a href="login.jsp">返回登陆页面</a>
</body>
</html>

结果:
登录成功:
在这里插入图片描述
在这里插入图片描述

登录失败:
在这里插入图片描述
在这里插入图片描述

[实验心得]
通过本次Servlet实验,理解了Servlet的运行原理。


http://www.niftyadmin.cn/n/5841447.html

相关文章

预防和应对DDoS的方法

DDoS发起者通过大量的网络流量来中断服务器、服务或网络的正常运行&#xff0c;通常由多个受感染的计算机或联网设备&#xff08;包括物联网设备&#xff09;发起。 换种通俗的说法&#xff0c;可以将其想象成高速公路上的一次突然的大规模交通堵塞&#xff0c;阻止了正常的通勤…

WebSocket 实时通信详解:原理、应用与实践

WebSocket 实时通信详解&#xff1a;原理、应用与实践 WebSocket 实时通信详解&#xff1a;原理、应用与实践引言什么是WebSocket&#xff1f;主要特点 WebSocket 工作原理1. 握手过程2. 协议转换3. 数据帧传输 WebSocket 协议与API1. 协议版本2. HTTP头部3. JavaScript API4. …

Windows 安装Linux子系统

文章目录 一、启用虚拟化二、安装子系统1. 查看所有官方支持的 WSL 发行版2. 安装 Ubuntu3. 安装非官方发行版(如 CentOS)三、启动和更新子系统1. 启动Ubuntu终端2. 更新系统四、管理已安装的发行版在 Windows 的 WSL(Windows Subsystem for Linux)中,除了 Ubuntu,你还可…

测试相关基础

考虑问题 项目架构是分布式的吗&#xff1f; 用到了缓存和消息队列没有&#xff1f; 高并发的业务有没有特殊处理&#xff1f; 数据库设计是否合理&#xff1f; 系统用到的算法是否还需要优化&#xff1f; 系统是否存在内存泄露的问题&#xff1f; 项目使用的 Redis 缓存…

HAO的Graham学习笔记

前置知识&#xff1a;凸包 摘录oiwiki 在平面上能包含所有给定点的最小凸多边形叫做凸包。 其定义为&#xff1a;对于给定集合 X&#xff0c;所有包含 X 的凸集的交集 S 被称为 X 的 凸包。 说人话就是用一个橡皮筋包含住所有给定点的形态 如图&#xff1a; 正题&#xff1a…

7-4 西安距离

小明来到了古都西安&#xff0c;想去参观大唐西市&#xff01; 西安的道路可以看做是与x轴或y轴垂直的直线&#xff0c;小明位于(a,b)&#xff0c;而目的地位于(c,d)&#xff0c;问最少几步可以到达。 输入格式: 一行中四个整数&#xff0c;a,b,c,d&#xff0c;表示坐标为(a…

寒假day10

第十天&#xff1a;请写出以下几个数据的类型 整数 a int a的地址 int* 存放a的数组b …

类和对象(下)——类型转化 static成员 内部类 匿名对象 拷贝对象优化

一、类型转换 1.1 类型转化特点 C支持内置类型隐式类型转换为类类型对象&#xff0c;需要有相关内置类型为参数的构造函数。构造函数前面加explicit就不再支持隐式类型转换。类类型的对象之间也可以隐式转换&#xff0c;需要相应的构造函数支持 内置类型转换为类类型对象&#…