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

本文介绍了一个简单的用户登录系统的实现过程,包括使用Druid数据库连接池技术、JdbcTemplate封装JDBC操作、Servlet处理登录请求等关键技术点。

案例:用户登录

* 用户登录案例需求:

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

 也能成功输出:

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值