上一篇文章里创建了一个登录页面,但里面的用户名和密码都是写死的。

那么我们想让登录页面进数据库查查用户名,密码的话,该怎么做呢?

此处接着上一篇文章里创建好的项目继续进行操作。

当然,这一章要求你机器上得有 Mysql  服务器,没有的话自己找教程装一个吧。

以及在 Spring MVC  中我选用 Hibernate 与数据库进行操作,ORM 好处都有啥,自己上网搜搜吧。

网上没有全面的教程,我就自己来写一个吧。

1、先在数据库里创建一个库,并且创建一个表。

用户名:test_1

密码:z7xhnxDAtprOpfZ5

数据库名:test_1

表名:users

插入两条数据到时作为测试。

注意:实际的系统中储存的密码必须加密。

数据库准备就结束了。

2、然后就来开发了,先把 Hibernate 引入进去。

把 Hibernate 添加进去。

下面有个警告,点下 Fix.

选 Download,然后 OK 吧。

等待一会儿,就下载好了。然后点击 OK。

3、然后在项目里引入 Hibernate 支持。

选上 Hibernate(写到这里,话说上一步其实可以免了?谁试试),下面两个钩也选上,自动创建配置和自动导入实体。

然后就可以添加实体映射了。我们得先添加数据源。

然后我们就来创建一个包来放实体类,

然后把勾打上,

点击 OK.

Yes 即可。

得到我们要的实体类了。

4、来给数据库改个 Helper

看到那个 Main 了吗?

创建一个 Helpers  包,把这个扔里面,改名叫 DbConnection

5、然后来改下 LoginController,改成如下的样子

package Controllers;

import Helpers.DbConnection;
import Models.UsersEntity;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;
import java.util.List;


@Controller
public class LoginController {
    /**
     * @RequestParam注解的作用是:根据参数名从URL中取得参数值
     * @param username
     *            用户名,一定要对应着表单的name才行
     * @param password
     *            用户密码,也应该对应表单的数据项
     * @param model
     *            一个域对象,可用于存储数据值
     * @param session
     *            线程对象,用于往线程里丢东西
     * @return
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST) // @RequestMapping 注解可以用指定的URL路径访问本控制层,这里用 HTTP 动作来和下面区分
    public String login(@RequestParam("username") String username, @RequestParam("password") String password,
                        Model model, HttpSession session) {

        //创建数据库操作线程
        Session db_session = DbConnection.getSession();

        try{
            //创建初始创建条件
            Criteria criteria = db_session.createCriteria(UsersEntity.class);
            //往条件里加东西,等同于 where `username` = username
            criteria.add(Restrictions.eq("username", username));
            //列出所有查询结果
            List<UsersEntity> list = criteria.list();

            //告诉页面该显示哪个用户名
            model.addAttribute("username", username);
            if(list.isEmpty()) {
                //添加错误信息
                model.addAttribute("error_msg", " 用户不存在!");
                return "fail";
            } else {
                //获取结果里的第一个,对象类型为 UsersEntity,方法具体看 Models 里的 UsersEntity  类的定义
                UsersEntity user = list.get(0);
                //获取密码进行比较
                if(!user.getPassword().equals(password)) {
                    model.addAttribute("error_msg", "  密码错误!");
                    return "fail";
                }

                model.addAttribute("user_role_type", list.get(0).getUserRoleType());

                //把用户信息存 Session
                session.setAttribute("user", list.get(0));

                return "success";
            }
        }catch(Exception e) {
            //添加错误信息
            model.addAttribute("error_msg", " 系统发生了错误!");
            return "fail";
        }finally {
            //用完这个 数据库的 Session  记得关了
            db_session.close();
        }
    }

}

6、然后 success.jsp  和 fail.jsp  也得改改。

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功</title>
</head>
<body>
    <p>
        <p>用户名: ${username} 登录成功!用户角色:${user_role_type}</p>
    </p>
</body>
</html>

fail.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>失败</title>
</head>
<body>
<p>
<p>用户名: ${username} 登录失败!错误原因:${error_msg}</p>
</p>
</body>
</html>

7、然后还要把 Mysql  的 jdbc 库给加进去。

然后 OK 即可。

8、然后就运行试试吧,发现登录的时候提示这个。

应该是库没放进去,来放放。

像之前一样都添加进去即可。

9、然后又出这个错误了,

 

目测 hibernate.cfg.xml 也得改改,改成这样,把数据库连接信息补齐。

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:mysql://192.168.56.101:3306/test_1</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">test_1</property>
        <property name="connection.password">z7xhnxDAtprOpfZ5</property>
        <mapping class="Models.UsersEntity"/>

        <!-- DB schema will be updated if needed -->
        <!-- <property name="hbm2ddl.auto">update</property> -->
    </session-factory>
</hibernate-configuration>

10、OK,再试试。

正确运行了。