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

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章