SSM实现简单的登录

SSM实现简单的登录

前不久打算开始学SSM框架,听说现在很多企业都是用SSM和springboot,于是就买了一本书在学习。我的很多代码都是照着书上敲的,测试的代码就是按照书上一点一点敲进去的,但是到登录注册这一块,书上的代码看不太懂,于是按照之前测试的代码思路自己写了一个简单的登录验证,这是打算用来做我自己的博客站的,所以是单用户,没有写注册模块,以后有机会再用SSM写登录注册再记录注册的模块吧。

前面提到我说书上的逻辑看不太懂,于是自己百度了一下代码,有一篇博文还提供了SSM框架的搭建流程,我觉得很适合新手,因为我本人也是新手,按照这个流程搭建感觉思路很清晰,找问题也可以一层一层的找下去,蛮方便的。

这个就是流程,为了方便我接下来贴代码,把这一部分单独截下来了,上面那篇文章里面也有登录注册的代码。

1、首先是数据库,我数据库就一个user表,只有name和password两个字段,这里就不贴代码了。

2、接着是entity

package com.jiang.entity;

public class User {
	private String name;
	private String password;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	

}

这个也是跟user表一样的,其实也没啥

3、UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jiang.mapper.UserMapper">
	<resultMap type="com.jiang.entity.User" id="userRM">
		<result property="name" column="name"/>
		<result property="password" column="password"/>
	</resultMap>
	<select id="selectByName" parameterType="map" resultMap="userRM">
		select * from user where 
		<if test="name!=null">name=#{name}</if>
		<if test="password!=null">and password=#{password}</if>
	</select>
</mapper>

4、接下来应该是mapper.java但是我用了spring整合,所以这里就没有,但是在spring的配置文件中一定要配置包扫描文件,而且这个路径很重要,一定不能搞错了

5、然后就是Dao层,Dao可以分成Dao和DaoImpl两个包,我这里是分开写的,所以我会把代码分别贴出来

BaseDao.java(这个类是因为之前按照书上来的,所以建了,之后也没删除,这里可以忽略)

package com.jiang.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface BaseDao<T> {

}

UserDao.java

package com.jiang.dao;

import java.util.List;
import java.util.Map;

import com.jiang.entity.User;

public interface UserDao extends BaseDao<User>{
	public boolean findUserByName(Map map);

}

BaseDaoImpl.java

package com.jiang.dao.impl;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import com.jiang.dao.BaseDao;

public abstract class BaseDaoImpl<T> extends SqlSessionDaoSupport implements BaseDao<T>{
	@Autowired
	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
		super.setSqlSessionFactory(sqlSessionFactory);
	}

}

这里继承了SqlSessionDaoSupport类,这个类是会话工厂的数据库连接层辅助类,通过为其注入sqlSessionFactory对象就可以直接调用getSqlSession方法获取会话对象并进行增删改查操作。

UserDaoImpl.java

package com.jiang.dao.impl;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.jiang.dao.UserDao;
import com.jiang.entity.User;

@Repository
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{

	public boolean findUserByName(Map map) {
		// TODO Auto-generated method stub
		if(map!=null) {
			List<User> u=getSqlSession().selectList("com.jiang.mapper.UserMapper.selectByName", map);
			if(!u.isEmpty()) {
				return true;
			}else {
				return false;
			}
		}else {
			return false;
		}	
	}

}

6、service层,这里也是接口和实现类分开的

UserService.java

package com.jiang.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.jiang.entity.User;

public interface UserService {
	public boolean findUserByName(Map map);

} 

UserServiceImpl.java

package com.jiang.service.impl;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jiang.dao.UserDao;
import com.jiang.entity.User;
import com.jiang.service.UserService;

@Service
public class UserServiceImpl implements UserService{
	@Autowired
	private UserDao userDao;

	public boolean findUserByName(Map map) {
		// TODO Auto-generated method stub
		return userDao.findUserByName(map);
	}

	
	

}

7、controller层,同样还是接口和实现类分开

BaseController.java

package com.jiang.controller;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;

public abstract class BaseController {
	@InitBinder
	public void initBinder(WebDataBinder binder) {
		DateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd");
		dateFormat.setLenient(true);
		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat,true));
	}

}

这里面的方法用于日期的转换,如果页面里的日期格式转换错误会报400错误

UserController.java

package com.jiang.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.jiang.entity.User;
import com.jiang.service.UserService;

@Controller
public class UserController extends BaseController{
	@Autowired
	UserService userService;
	
	@RequestMapping("/user/toLogin.action")
	public String toLogin() {
		return "/login.jsp";
	}
	@RequestMapping("/user/login.action")
	public String login(User user,Model model,HttpServletRequest request) {
		Map<String,String> map=new HashMap<String,String>();
		map.put("name", user.getName());
		map.put("password", user.getPassword());
		if(userService.findUserByName(map)) {
			request.getSession().setAttribute("user","jiang");
			return "/admin/index.jsp";
		}
		model.addAttribute("errorMsg", "登录失败!账号或密码错误!");
		return "/login.jsp";
		
	}

}

8、接下就是登录页面了

login.jsp

<%@ page language="java"  contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jiang's blog</title>
    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/css/uploading.css">
    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/css/reset.css">
    <script type="text/javascript" src="${pageContext.request.contextPath }/js/bootstrap.min.js"></script>
</head>
<body class="upload_page">
    <div class="login">
        <div class="top">
            Login
        </div>
        <form action="login.action" method="post" onsubmit="return validate()">
          <div class="input-group login_input">
            <span class="input-group-addon" id="basic-addon1">
                <span class="glyphicon glyphicon-user" aria-hidden="true"></span>
            </span>
            <input name="name" type="text" class="form-control" placeholder="Username" aria-describedby="basic-addon1">
          </div>
          <div class="input-group login_input">
            <span class="input-group-addon" id="basic-addon1">
                <span class="glyphicon glyphicon-asterisk" aria-hidden="true"></span>
            </span>
            <input name="password" type="password" class="form-control" placeholder="Password" aria-describedby="basic-addon1">
          </div>
          <button type="submit" class="btn btn-info login_btn">登录</button>
        </form>
        <div class="error"><c:if test="${errorMsg!=null }"><font color="red">${errorMsg}</font></c:if></div>
    </div>
</body>
<script type="text/javascript">
 
</script>
</html>

在我的controller里面有写错误返回,上面JSP代码表单下面就有加错误提示,本来还应该有空提示的,我偷懒就没写了,正经代码里面还是得写的,还有注释啥的也都要写,我是偷懒就没写了。

代码到这里就基本完成了,如果有写拦截器的话,拦截器的部分得好好写,什么时候放行什么时候重定向,我的是照着书敲的,这里就不贴了,也没多大作用。

前面一段时间几乎是一天一个小bug,然后花一天的时间才能解决,解决完之后又出现新的bug,今天这个登录虽然也有bug,但是从写代码到跑起来只花了一下午时间就解决了,心情甚好。

 

 

 

 

 

 

没有更多推荐了,返回首页