前不久打算开始学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
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 {
}
UserDao.java
package com.jiang.dao;
import java.util.List;
import java.util.Map;
import com.jiang.entity.User;
public interface UserDao extends BaseDao{
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 extends SqlSessionDaoSupport implements BaseDao{
@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 implements UserDao{
public boolean findUserByName(Map map) {
// TODO Auto-generated method stub
if(map!=null) {
List 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 map=new HashMap();
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" %>
jiang's blog
Login
${errorMsg}
在我的controller里面有写错误返回,上面JSP代码表单下面就有加错误提示,本来还应该有空提示的,我偷懒就没写了,正经代码里面还是得写的,还有注释啥的也都要写,我是偷懒就没写了。
代码到这里就基本完成了,如果有写拦截器的话,拦截器的部分得好好写,什么时候放行什么时候重定向,我的是照着书敲的,这里就不贴了,也没多大作用。
前面一段时间几乎是一天一个小bug,然后花一天的时间才能解决,解决完之后又出现新的bug,今天这个登录虽然也有bug,但是从写代码到跑起来只花了一下午时间就解决了,心情甚好。