使用jdbctemplate+servlet+tomcat实现一个登录案例

320 阅读3分钟

写在开头

先来看下这个登录案例的项目结构,主要是分为dao,domian,test,util,web几个包,然后在相应的包内写相应的类,可以看到如下截图:

image.png 当然,最开始还是需要在数据库创建一个user表 image.png

DOMIAN PACKAGE

这里面主要是定义一个User类,然后通过getter和setter设置拿到账号密码

package com.jserm.domian;

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 + '\'' +
                '}';
    }
}

DAO PACKAGE

主要是写一些对数据库的操作逻辑,方法使用jdbctemplate,代码如下

package com.jserm.dao;

import com.jserm.domian.User;
import com.jserm.util.JDBCUtils;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

/*
 * 操作数据库中的User表中的类
 * */
public class UserDao {
    // 声明JDBCTemplate对象共用
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    public User login(User loginUser) {
        try {
            String sql = "select * from user where username = ? and password = ?";
            User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), loginUser.getUsername(), loginUser.getPassword());
            return user;
        } catch (EmptyResultDataAccessException e) {
            e.printStackTrace();
            return null;
        }
    }
}

UITL PACKAGE

里面主要是抽取封装一个JDBCUtil工具类,该类主要是处理druid连接池的一些逻辑,代码如下:

package com.jserm.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;

// 使用druid连接池
public class JDBCUtils {
    private static DataSource ds;
    static {
        try {
            Properties properties = new Properties();
            InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(resourceAsStream);
            ds = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    /*
    * 获取connection对象
    * */
    public static Connection getConnection() throws SQLException {
        Connection connection = ds.getConnection();
        return connection;
    }
}

WEB PACKAGE

这个包主要是写一些servlet class静态文件

# servletCase
package com.jserm.web.servletcase;

import com.jserm.dao.UserDao;
import com.jserm.domian.User;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet(name = "ServletCase", value = "/loginServlet")
public class ServletCase extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post进来了");
        // 1.设置编码
        request.setCharacterEncoding("utf-8");
//        // 2.,获取请求参数
//        String username = request.getParameter("username");
//        String password = request.getParameter("password");
//        // 3.封装user对象
//        User user = new User();
//        user.setUsername(username);
//        user.setPassword(password);
        // 使用java BeanUtils做处理,该方法能拿到所有的请求参数
        Map<String, String[]> parameterMap = request.getParameterMap();
        User user = new User();
        try {
            BeanUtils.populate(user, parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        // 4. 调用userDao对象
        UserDao dao = new UserDao();
        User loginUser = dao.login(user);
        // 5. 判断user
        if (loginUser == null) {
            // 等于null表示登录失败
            System.out.println("失败了");
            request.getRequestDispatcher("/failServlet").forward(request, response);
        } else {
            // 登录成功
            System.out.println("成功了");
            request.setAttribute("user", loginUser);
            request.getRequestDispatcher("/successServlet").forward(request, response);
        }
    }
}
# FailServlet
package com.jserm.web.servletcase;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "FailServlet", value = "/failServlet")
public class FailServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("失败了");
        // 给页面写一句话
        // 设置页面编码
        response.setContentType("text/html;charset=utf-8");
        // 输出
        response.getWriter().write("登录失败,用户名密码错误");
    }
}
# SuccessServlet
package com.jserm.web.servletcase;

import com.jserm.domian.User;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "SuccessServlet", value = "/successServlet")
public class SuccessServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("成功了");
        // 获取request域中共享的user对象
        User user = (User) request.getAttribute("user");
        if (user != null) {
            // 给页面写一句话
            // 设置页面编码
            response.setContentType("text/html;charset=utf-8");
            // 输出
            response.getWriter().write("登录成功," + user.getUsername() + " 欢迎您");
        }
    }
}

创建一个登录页面

JavaEE项目下web application下面创建一个登录页面,这里需要注意action最好写一个相对路径,我这里写的是绝对路径,相对路径是相对你tomcat deployment那个路径,如果我这里改成相对就是action="loginServlet",因为我tomcat配置的就是/servlet

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录案例</title>
</head>
<body>
<div>
    <form action="/servlet/loginServlet" method="post">
        用户名: <input type="text" name="username"> <br>
        密码:<input type="password" name="password"> <br>
        <input type="submit">
    </form>
</div>
</body>
</html>

结语

学Java