JavaWeb(2)——servlet+tomcat实现用户登陆

本文详细介绍了如何从创建Web项目开始,通过Servlet实现用户登录功能的完整流程,包括数据库连接、DAO层设计、Servlet业务逻辑以及前端HTML页面的创建。通过这个示例,读者可以学习和理解Servlet的基础应用。

servlet实现用户登陆

本文实现从前端页面-》servlet-》业务逻辑-》数据库全流程打通,利用用户登陆,最简单的实现逻辑,了解,掌握servlet技术。


idea2.3创建web项目并配置本地tomcat地址:https://blog.youkuaiyun.com/CSU174712009/article/details/113816885

本文整体目录结构:

1.导入项目所需要的jar包

包括:javax,mysql,junit

2.数据库创建和测试数据

CREATE DATABASE `test` DEFAULT CHARSET=utf8mb4;

USE test;

CREATE TABLE `user`(
id 		INT(12)		NOT NULL,
`name`		VARCHAR(20)	NOT NULL,
pwd		VARCHAR(20)	NOT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

INSERT INTO `user` VALUES
(1,'李四',123456);

3.pojo也就是过去的bean

package com.ycw.express.section2.pojo;

public class User {
    private int id;
    private String uname;
    private String password;

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

    public void setUname(String uname) {
        this.uname = uname;
    }

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

    public String getUname() {
        return uname;
    }

    public String getPassword() {
        return password;
    }
}

4.jdbc连接数据库

这里我们编写了一个数据库连接的工具代码JDBCUtil代码如下:

package com.ycw.express.section2.Util;

import java.sql.*;

public class JDBCUtil {
    String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
    String user = "root";
    String password = "qq783339536";

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }

    /**
     * 关闭数据库连接资源
     * @param conn
     * @param pstate
     * @param rs
     */
    public static void close(Connection conn, PreparedStatement pstate, ResultSet rs){
        try {
            if (rs != null){
                rs.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            if (pstate != null){
                pstate.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            if (conn != null){
                conn.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

数据库连接成功后

5.编写jdbc需要的sql,也就是dao层

package com.ycw.express.section2.dao;

import com.ycw.express.section2.Util.JDBCUtil;
import com.ycw.express.section2.pojo.User;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserLoginDao {

    JDBCUtil jdbcUtil = new JDBCUtil();
    User user = new User();
    //通过用户名+密码都正确则返回该user对象
    public User findByUAndP(String username, String password) throws SQLException {
        Connection conn = jdbcUtil.getConnection();
        String sql = "select * from users where uname = ? and upassword = ?";
        PreparedStatement pstate = conn.prepareStatement(sql);
        pstate.setString(1,username);
        pstate.setString(2,password);
        ResultSet rs = pstate.executeQuery();
        while (rs.next()){
            user.setId(rs.getInt("id"));
            user.setUname(rs.getString("uname"));
            user.setPassword(rs.getString("upassword"));
            return user;
        }
        jdbcUtil.close(conn,pstate,rs);
        return null;
    }
}

 测试是否成功。

通过测试会对象地址,不存在则会返回null。

package com.ycw.express.section2.dao;

import org.junit.Test;

import java.sql.SQLException;

public class UserLoginDaoTest {

    @Test
    public void findByUAndPTest() throws SQLException {
        UserLoginDao userLoginDao = new UserLoginDao();
        System.out.println(userLoginDao.findByUAndP("admin", "1"));
    }
}

6.创建servelt实现业务逻辑判断

package com.ycw.express.section2.servlet;

import com.ycw.express.section2.dao.UserLoginDao;
import com.ycw.express.section2.pojo.User;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

public class UserLoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username = " + username + " password = " + password);
        UserLoginDao userLogin = new UserLoginDao();
        User user = new User();
        try {
            user = userLogin.findByUAndP(username,password);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        if (user != null){
//            req.getRequestDispatcher("/success.html").forward(req,resp);
            resp.sendRedirect("/success.html");
        }else {
//            req.getRequestDispatcher("/error.html").forward(req,resp);
            resp.sendRedirect("/error.html");
        }
    }
}

 至此后台的代码已经完成。

7.创建html页面

设计了3个页面,登陆login、登陆成功success、登陆失败error

login

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
    <style>
        h1{
            text-align: center;
            margin: 100px auto;
        }
        .login{
            text-align: center;
            width: 100%;
            margin: 40px auto;
            /*background-color: orangered;*/
        }

    </style>
</head>
<body>
<h1>用户登录</h1>
<div class = "login">
    <form action="/login" method="post">
        用户:<input type="text" name="username"/><br/><br/>
        密码:<input type="password" name="password"/><br/><br/>
        <input type="submit" value="提交"/> <input type="reset" value="重置"/>
    </form>
</div>
</body>
</html>

其中,表单登陆是提交到的路径是action="/login" ,提交方式为method="post" 。

成功和失败都是初始的html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <h1>登录成功</h1>
  <!-- <h1>登录失败</h1> -->
</body>
</html>

8.添加前后端映射关系

在我们创建的web项目中自动生成的web.xml文件中添加前后端的映射关系

其中前端我们是通过表单<form action="/login" method="post">提交到login中;

而我们后端servelt接收请求的doGet和doPost是在UserLoginServlet中。

所以在web.xml中添加

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>bb</servlet-name>
        <servlet-class>
            com.ycw.express.section2.servlet.UserLoginServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>bb</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

</web-app>

其中<servlet-class>表示配置了后端的UserLoginServlet,<url-pattern>配置了前端的/login,<servlet-name>bb</servlet-name>表示前后端的一个映射联系,其中bb名字可以随意取,保证在web.xml中唯一即可。在前端发送登陆请求后,会通过该文件的映射关系找到对应的servlet进行处理。

至此整个登陆的业务逻辑代码已经实现。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值