通过request请求和servlet实现注册跳转界面案例及问题解决

news2025/2/26 8:31:21

案例:用户登录

* 用户登录案例需求:

 1.编写login.html登录页面
        username & password 两个输入框
    2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表
    3.使用JdbcTemplate技术封装JDBC
    4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
    5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

案例分析:

  

 我的过程:

开发步骤

1. 创建项目,导入html页面,配置文件,jar包

2. 创建数据库环境

--新建数据库和数据表
CREATE DATABASE test01;
        USE test01;
        CREATE TABLE USER(
            id INT PRIMARY KEY AUTO_INCREMENT,
            username VARCHAR(32) UNIQUE NOT NULL,
            password VARCHAR(32) NOT NULL
        );

 3. src下创建包domain,创建类User

package domain;

/**
 * @author 乱码酱
 * @date :2022-11-20 16:21
 * @program: HTMLStudy
 * @create:用户的实体类user
 */
public class User {
    private int id;
    private String username;
    private String password;

    public User() {
    }

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

出现问题:同一个包内domain层的实体类导入不进去dao

 解决方法:

可以试试“清除缓存重启”:
第一步:菜单中选择file->invalidate caches / restart

 第二步:在弹出框中选择Invalidate and Restart。idea关闭并且自动重启,重启后问题解决。

4. 创建包util,编写工具类JDBCUtils

package example.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author 乱码酱
 * @date :2022-11-21 15:22
 * @program: HTMLStudy
 * @create:JDBC工具类 使用Durid连接池
 */
public class JDBCUtils {
    private static DataSource ds;
//静态代码块加载
    static {
    try {
        //加载配置文件
        Properties pro = new Properties();
//    使用ClassLoader加载配置文件,获取字节输入流
        InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
        pro.load(is);

//初始化连接池对象
        ds = DruidDataSourceFactory.createDataSource(pro);

    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

    //获取连接池对象
    public static DataSource getDataSource(){
        return ds;
    }

    //获取连接Connection对象
    public static Connection getConnection() throws SQLException {
        return  ds.getConnection();
    }

}



5. 创建包dao,创建类UserDao,提供login方法

 出错,测试不通过,连接不到druid连接池,初步猜想应该是之前的版本过低,mysql版本过高引起的兼容问题。更换对应版本jar包

配置好后不再出现连接不到连接池的问题了,但是出现了新的报错

 org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

出现这个异常是因为jdbcTemplate 在执行完代码以后 发现返回的结果为空 所以抛出这个异常
想要处理这个异常也很简单 只需要我们 把这个异常给处理了 如: 

 破案了,数据库没点保存,保存好就成了

6. 编写web.servlet.LoginServlet类

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置编码
        req.setCharacterEncoding("utf-8");
//2.获取请求参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
//3.封装user对象
        User loginuser = new User();
        loginuser.setUsername(username);
        loginuser.setPassword(password);

//        4.调用Dao层UserDao的login方法
        UserDao dao = new UserDao();
        User users = dao.login(loginuser);

//      5.  判断
        if (users == null) {
            //如果为空,登录失败,跳转到FailServlet展示:登录失败,用户名或密码错误
            req.getRequestDispatcher("/failServlet").forward(req, resp);
        } else {
            //如果非空,登录成功,跳转到SuccessServlet展示:登录成功!用户名,欢迎您
            //存储数据
            req.setAttribute("user",users);
//            转发
            req.getRequestDispatcher("/successServlet").forward(req, resp);
        }

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

 7. 编写FailServlet和SuccessServlet类  

@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//给页面输出一句话
//        设置编码
        response.setContentType("text/html;charset=utf-8");
//        输出
        response.getWriter().write("登录失败,用户名或密码错误");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
    }
}



@WebServlet("/successServlet")
public class SuccessServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//给页面输出一句话
//        设置编码
        response.setContentType("text/html;charset=utf-8");
        //        因为要输出用户名,所以获取request域中共享的user对象
        User user = (User) request.getAttribute("user");  //强制类型转换

        if (user != null) {
//        输出
            response.getWriter().write("登录成功!" +user.getUsername() +",欢迎您");
        }
    }
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

8. login.html中form表单的action路径的写法
        * 虚拟目录+Servlet的资源路径

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--form表中action路径的写法  虚拟路径+servlet路径资源-->
    <form action="/test01/loginServlet" method="post">
        用户名:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"><br>

        <input type="submit" value="登录">

    </form>
</body>
</html>

最后成果:

输入错误的输出展示:

 可是输入正确居然报错405HTTP Status 405 – Method Not Allowed

 查了一晚上,原来是servlet方法先后顺序有误,将doPost 方法写到doGet方法上了

 

改过来就好了

成了!

居然还有简单方法,可恶啊!

9. BeanUtils工具类,简化数据封装
        * 用于封装JavaBean的
        1. JavaBean:标准的Java类
            1. 要求:
                1. 类必须被public修饰
                2. 必须提供空参的构造器
                3. 成员变量必须使用private修饰
                4. 提供公共setter和getter方法
            2. 功能:封装数据

        2. 概念:
            成员变量:
            属性:setter和getter方法截取后的产物
                例如:getUsername() --> Username--> username

        3. 方法:
            1. setProperty()
            2. getProperty()
            3. populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中

使用:

添加jar包到web下的WEB-INF下的lib文件,添加为库

 

注释掉之前的2,3,用BeanUtils.populat()方法来写

 也能成功输出:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/24802.html

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

相关文章

机器人操作系统ROS(19) 雷达和摄像头融合的资料

搜集的有关雷达和摄像头融合的资料。仅供参考&#xff1a; #1 传感器融合&#xff1a;激光雷达摄像头 摄像头产生的数据是2D图像&#xff0c;对于物体的形状和类别的感知精度较高。深度学习技术的成功起源于计算机视觉任务&#xff0c;很多成功的算法也是基于对图像数据的处理…

图神经网络 | Python基于图卷积的U-Net架构进行交通流量和速度的预测

图神经网络 | Python基于图卷积的U-Net架构进行交通流量和速度的预测 目录 图神经网络 | Python基于图卷积的U-Net架构进行交通流量和速度的预测效果分析基本描述程序实现核心概念参考资料效果分析 基本描述 此版本包含了训练和评估模型的代码,以预测Traffic4Cast挑战数据的交…

ssh-keygen和openssl的区别

OpenSSL OpenSSL是用于应用程序的软件库&#xff0c;该应用程序可保护计算机网络上的通信免遭窃听或需要识别另一方的身份&#xff0c;是SSL和TLS协议的开源实现。采用C语言作为开发语言&#xff0c;具备了跨平台的能力&#xff0c;支持Unix/Linux、Windows、Mac OS等多种平台…

力扣LeatCode算法题第9题-回文数

要求&#xff1a; //给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 //回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 //例如&#xff0c;1…

百世的数智化供应链凭何融入企业生命周期?

在供应链这个词出现前&#xff0c;供应链的本体就已经存在。 萨缪尔森说&#xff0c;现代经济生活的命脉是交换。当不同的物资、资金、信息在产业链上流动起来时&#xff0c;产业才能形成模型&#xff0c;经济才会有活力。然而&#xff0c;供应商增加、活动变多、地理距离拉长…

智慧气象解决方案-最新全套文件

智慧气象解决方案-最新全套文件一、建设背景二、建设架构传统气象所面临的挑战&#xff1a;1、气象数据大幅快速增长&#xff0c;导致计算能力不足2、人工智能应用不足&#xff0c;短临预报精度较低3、气象数据分散&#xff0c;数据融合困难4、气象服务方式单一&#xff0c;体验…

外卖项目04---菜品管理业务开发

效果展示: 目录 一、文件上传下载 50 1.1文件上传 50​编辑 1.2文件下载 1.3文件上传下载---文件上传代码实现1 1.4文件上传下载---文件上传代码实现2 1.5文件上传下载---文件下载代码实现 53 二、新增菜品 54 2.1需求分析 54 2.2数据模型 2.3新增菜品---代码开发--…

uniapp使用nfc功能及详解

公司使用uniapp在android手机端要增加一个nfc识别的功能。在此记录一下实现的过程。 资料查找 我的代码逻辑主要来源于找到的这篇文章&#xff1a; uniapp-安卓NFC读取 - 我要找到我的全世界 - 博客园 文章内附有代码&#xff0c;为防止文章失效代码消失&#xff0c;在这篇文…

向中央超算平台进化 哪吒汽车发布技术品牌“浩智”

电子电气架构是汽车的“大脑和神经系统”&#xff0c;决定了智能汽车的体验上限。为了实现高阶智能&#xff0c;车企须将汽车的电子电气架构从分布式&#xff0c;向集中式转变&#xff0c;打造出中央超算平台 11月21日&#xff0c;哪吒汽车举行“浩智战略2025”全球技术品牌发布…

Mentor Xpedition VX2.11入门遇到的问题和解决方案 (1)

一、前言 平时使用AD绘制板子&#xff0c;最近又朋友强烈推荐Mentor Xpedition。说它的自动布线功能非常强。相比于pads&#xff0c;这款软件的教程很少。但好在B站还是又几个不错的视频。在相关视频的讲解下&#xff0c;慢慢入门。目前来看这款软件的易用性很差&#xff0c;操…

aws eks创建节点组的不同方式和逻辑

该问题来源于&#xff0c;eks节点组能否修改实例类型&#xff0c;不同创建方式修改节点参数的方式是否有区别。结论如下&#xff1a; eksctl创建托管节点组&#xff0c;无法通过修改启动模板修改节点类型&#xff08;在eks控制台update会报错&#xff09;&#xff0c;但是可以…

网络系统管理 - Server02配置

一、Server02系统基础环境配置 二、DISK配置服务器软RAID工作任务 三、DFS membe端配置工作任务 1.Server02系统基础环境配置 (1)请根据附件说明或提供的基础信息,配置服务器的主机名,IP 地址,创建要求的用户名及密码;

docker镜像、容器 常用命令,容器端口映射

文章目录前言一、docker基础命令二、docker镜像命令1、docker images&#xff1a;列出本地主机的镜像2、 docker search &#xff1a;查看镜像3、docker pull&#xff1a;拉取镜像4、docker rmi &#xff1a; 删除docker镜像三、docker容器命令1、环境准备2、运行容器3、启动、…

Python常见工厂函数用法

工厂函数&#xff1a;能够产生类实例的内建函数。 工厂函数是指这些内建函数都是类对象&#xff0c; 当调用它们时&#xff0c;实际上是创建了一个类实例。 Python中的工厂函数举例如下&#xff1a; int(),long(),float(),complex(),bool()aint(9.9) a 9 blong(45) b 45L ff…

JavaScript 虚拟键盘:Mindfusion JavaScript Keyboard

高度交互&#xff0c;高度可定制--JavaScript 虚拟键盘--Mindfusion JavaScript Keyboard 现在&#xff0c;您的 JavaScript 应用程序可以像本地移动应用程序一样处理屏幕输入。 特征 键盘布局 扩展、紧凑和标准布局模式。KeyboardLayout 工具可帮助您根据需要创建和排列自定义…

【Hack The Box】linux练习-- Traverxec

HTB 学习笔记 【Hack The Box】linux练习-- Traverxec &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月21日&#x1f334; &#x…

Spark学习(5)-Spark Core之RDD

1 RDD详解 1.1 为什么需要RDD 分布式计算需要: 分区控制Shuffle控制数据存储\序列化\发送数据计算API等一系列功能 这些功能, 不能简单的通过Python内置的本地集合对象(如 List\ 字典等)去完成。我们在分布式框架中, 需要有一个统一的数据抽象对象, 来实现上述分布式计算所需…

JavaScript面向对象:类的继承

继承 现实中的继承&#xff1a;子承父业&#xff0c;比如我们都继承了父亲的姓。 程序中的继承&#xff1a;子类可以继承父类的一些属性和方法。 语法&#xff1a; class Father{ // 父类 } class Son extends Father { // 子类继承父类 } 实例&#xff1a; cla…

手把手教你开通小程序流量主

手把手教你开通小程序流量主 开通条件是累计独立访客不低于 1000。也就是1000级以上&#xff0c;其实这个不难。 接下来以防火安全知识专项学习与竞答为例&#xff0c;写一篇开通流量主、创建广告和代码嵌入的图文教程。 功能介绍 广告展示位置灵活控制&#xff0c;接入简单…

操作系统复习【面试】

操作系统复习【面试】前言推荐操作系统复习第一章 操作系统引论 11.3 操作系统的基本特性 141.3.1 并发1.3.2 共享1.3.3 虚拟1.3.4 异步1.4 操作系统的主要功能 171.4.1 处理机管理功能1.4.2 存储器管理功能1.4.3 设备管理功能1.4.4 文件管理功能1.4.5 操作系统和用户之间的接口…