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,但是從寫代碼到跑起來只花了一下午時間就解決了,心情甚好。