代码编织梦想

案例:用户登录

* 用户登录案例需求:

 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()方法来写

 也能成功输出:

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/clover_oreo/article/details/127973774

[jsp暑假实训] 二.jsp网站创建及servlet实现注册表单提交、计算器运算_eastmount的博客-爱代码爱编程_1.制作一个注册表单页面registerfrom.jsp,如果账号、密码不为空,则将表单提交给reg

本系列文章是作者暑假给学生进行实训分享的笔记,主要介绍MyEclipse环境下JSP网站开发,包括JAVA基础、网页布局、数据库基础、Servlet、前端后台数据库交互、DAO等知识。 本篇文章开始讲解MyEclipse环境

javaweb学习(八)---案例:servlet实现注册和登录页面的处理_dogiooh的博客-爱代码爱编程

JavaWeb学习(八)—案例:Servlet实现注册和登录页面的请求处理 本案例主要实现了以下功能: ​ 1.首页点击注册跳转至注册页面,点击登录跳转至登陆页面。 ​ 2.注册页面提交表单验证,注册成功跳转至登录页面

Servlet——Request和Response-爱代码爱编程

目录 Request体系结构HttpServletRequest常用方法请求转发共享数据注册案例请求的中文乱码处理HttpServletResponse常用方法重定向操作Request体系结构 跳转到目录 ServletRequest:是一个接口HttpServletRequest:是一个接口org.apache.catalina.connector

Request 综合应用案例——登录界面\JDBC\Druid\Servlet-爱代码爱编程

用户登录案例需求: 编写login.html登录页面: username & password两个输入框使用Druid数据库连接池技术,操作mysql,USERS数据库中user表;使用JdbcTemplate技术封装JDBC登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您!登录失败跳转到FailServlet展示:登录失

编程小白的计算机毕业设计指导开发教程-JSP+Servlet实现注册登陆功能-爱代码爱编程

一、Servlet+JSP+JavaBean开发模式(MVC)介绍   Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式。   

用MyEclipse实现html提交表单form跳转到指定Servlet,解决中文乱码-爱代码爱编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、跳转是什么?二、步骤1.创建Servlet类2.新建html文件实现跳转3.解决中文乱码总结 前言 首先写html: 用html解决中文乱码和跳转的问题 提示:以下是本篇文章正文内容,下面案例可供参考 一、跳转是什么? html跳转servlet,或者

Servlet实现页面跳转-爱代码爱编程

请求重定向 web服务器接收到客户端的请求后,可能由于某些条件限制,不能访问当前请求url所指向的web资源,而是指定了一个新的资源路径,让客户端重新发送请求。地址栏会变成重定向之后页面的url。 方法一:response对象的setHeader()方法 //2秒后跳转到指定的url response.setHeader("Refresh", "2;

Servlet跳转之转发以后目标界面元素、内容丢失,404问题-爱代码爱编程

本文解释如有误,欢迎各位代佬批评指正。 问题描述:从根目录首页访问一个路径为子目录下的servlet再转发跳转到根目录下的页面时,页面访问不到目标页面中原本应该包含的资源(包括css、首页框架包含的jsp文件等) 一、文件结构 二、test.jsp的正常显示界面 三、通过流程访问 流程:index.jsp -> test/test.

求救:Servlet登录案例跳转出现404错误-爱代码爱编程

今天学习servlet在做一个登录的小案例的时候遇到404错误 跟着网课一边检查了一遍代码应该没有问题 而且单元测试也没有问题 写完接受前端参数然后到数据库中查找这个功能之后出问题了 需求如下 用户登录案例需求: 1.编写login.html登录页面 username & password 两个输入框 2.使用Druid数据库连接池技术,操

从JSP跳转到Servlet的两种方式-爱代码爱编程

前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、法一 通过response.sendRedirect()进行跳转 1.java代码 代码如下(示例): package kedun.dhy; import javax.servlet.*; import javax.servlet.http.*; @SuppressWarni

java跳转到jsp_Servlet跳转到jsp页面的几种方法-爱代码爱编程

1.sendRedirect方式 sendRedirect("/a.jsp"); 可以将页面跳转到任何路径,不局限于web应用中,跳转的过程中url地址变化,无法使用request.setAttribute来传递。 2.forward方式 request.getRequestDispatcher("/a.jsp").forward(reques

Servlet之间跳转-爱代码爱编程

Servlet之间跳转 Servlet之间的跳转:转发Forward请求转发原理Forward相关方法重定向Redirect重定向和请求转发的区别 Servlet之间的跳转: Servlet之间可以实现跳转,从一个Servlet跳转到另一个Servlet,利用Servlet的跳转技术可以很方便的把一块业务模块分开,比如使用一个Servlet接

五、JavaWeb基础(servlet、http协议、request和response请求详解、ServletContext对象)-爱代码爱编程

一、Servlet:server applet 1. 概念: 运行在服务器端的小程序 Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。我们只要实现Servlet接口,复写其中的方法即可。 2. Servlet简单案例入门: 实现步骤: 创建JavaEE项目定义一个类,实现Servlet接口publ

linux上如何搭建java环境_java-呆萌老师的博客-爱代码爱编程

一 linux软件安装常用的方式对比 Linux下的软件安装,主要有如下三种,“正规”程度依次递减: 1、使用标准的yum/apt/yast包管理程序安装 2、使用标准rpm/deb或厂商自己的安装包(比如nVidia

[附源码]java毕业设计望湘人电子商城_邻居科技的博客-爱代码爱编程

项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。