로그인 구현(2)

2024. 6. 20. 13:17개인 프로젝트

동작화면

 

 

 

 

화면을 보여주는데, 과정 이와 같다.

Controller -> service -> serviceImpl -> mapper.java -> mapper.xml

사실 service -> serviceimpl 로 가는 과정 없이, service -> mapper.java로 해도 되지만, 과정을 굳이 추가하하면서 공부해 보고 싶었다.

 

참고사항

(1) 추가 설명은 소스코드 안에 빨간색 글자로 나타내었다.

(2) 주석처리된 부분은 개인적으로 테스트 해본 내용이라 무시하면 된다.

 

Controller.java

package com.wonlee.spring.controller;

 

import com.wonlee.spring.User.UserInfo;

import com.wonlee.spring.User.UserList;

import com.wonlee.spring.service.UserService;

import com.wonlee.spring.form.LoginForm;

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

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.servlet.ModelAndView;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

 

import java.util.List;

 

//import static org.springframework.util.ObjectUtils.isEmpty;

 

@Controller

public class Woncontroller {

 

@Autowired

private UserService userService;

 

@RequestMapping("/login.do")

public String test() {

return "login";

}

@RequestMapping("/login_check.do")

public ModelAndView loginCheck(HttpServletRequest request, @ModelAttribute("loginForm") LoginForm form, Model model) throws Exception {

boolean islogin = true;

ModelAndView mav = new ModelAndView();

HttpSession session = request.getSession();

session.setMaxInactiveInterval(1800);

//session.getId();

// servlet 으로 파라미터 받기

//String id = request.getParameter("userid");

//String pw = request.getParameter("password");

 

//<form:form> 으로 파라미터 받기

//String id = form.getUserid();

//form.setPassword(pw);

//없어도 되는 코드임 login 상세보기 추가

/*model.addAttribute("loginch",islogin);

model.addAttribute("form",form);*/

 

LoginForm loginch = userService.loginCheck(form);

 

//loginch이 null이거나, loginch에 userid가 null일경우 islogin을 false로 바꾸고 login.jsp를 호출시킴

if(loginch == null || loginch.getUserid() == null) {

islogin = false;

session.invalidate();

model.addAttribute("islogin",islogin);

mav.setViewName("login");

return mav;

}

List<UserList> ulist= userService.getUserList();

model.addAttribute("userList",ulist);

mav.setViewName("userList");

 

return mav ;

}

 

@RequestMapping(value = "/view/{id}", method= RequestMethod.GET)

public ModelAndView userView (@PathVariable("id") String id, Model model) throws Exception {

ModelAndView mav = new ModelAndView();

UserInfo userinfo = userService.getuserinfo(id);

String datetime = userinfo.getJoin_date();

String joindate = datetime.substring(0,16);

userinfo.setJoin_date(joindate);

model.addAttribute("userInfo",userinfo);

mav.setViewName("userView");

return mav ;

}

}

 

LoginForm.java

package com.wonlee.spring.form;

 

public class UserForm {

public String userid;

public String password;

 

 

public String getUserid() {

return userid;

}

 

public void setUserid(String userid) {

this.userid = userid;

}

 

public String getPassword() {

return password;

}

 

public void setPassword(String password) {

this.password = password;

}

 

}

Userinfo.java

package com.wonlee.spring.User;

 

public class UserInfo {

//로그인 form 객체와는 엄연히 다른 역할이라 분리함.

public String userid;

public String password;

public String name;

public String email;

 

public String getJoin_date() {

return join_date;

}

public void setJoin_date(String join_date) {

this.join_date = join_date;

}

public String join_date;

 

 

public String getUserid() {

return userid;

}

 

public void setUserid(String userid) {

this.userid = userid;

}

 

public String getPassword() {

return password;

}

 

public void setPassword(String password) {

this.password = password;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public String getEmail() {

return email;

}

 

public void setEmail(String email) {

this.email = email;

}

}

UserList.java

package com.wonlee.spring.User;

 

import java.util.List;

 

public class UserList {

 

private List<UserInfo> userList;

 

public UserList(List<UserInfo> userList) {

this.userList = userList;

}

 

}

UserService.java

package cohttp://m.wonlee.spring.service;
import cohttp://m.wonlee.spring.User.UserInfo;
import cohttp://m.wonlee.spring.User.UserList;
import cohttp://m.wonlee.spring.form.LoginForm;
import java.util.List;
public interface UserService {
     public LoginForm loginCheck(LoginForm form);

     public List getUserList();

     public UserInfo getuserinfo(String id);
}

 

UserService.impl.java

package cohttp://m.wonlee.spring.service;
import cohttp://m.wonlee.spring.User.UserInfo;
import cohttp://m.wonlee.spring.User.UserList;
import cohttp://m.wonlee.spring.mapper.UserMapper;
import cohttp://m.wonlee.spring.form.LoginForm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

 

@Service
public class UserServiceImpl implements UserService  {
private final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
    @Autowired
    private UserMapper userMapper;
    @Override
    public LoginForm loginCheck(LoginForm form)   {
        try{
        LoginForm checkform = new LoginForm();
        checkform = userMapper.loginCheck(form);
       return checkform;
       
        } catch (Exception e) {
            log.error("loginCheck Error {}" ,e);
            e.printStackTrace();
            //null을 return하여 로그인을 막음
            LoginForm checkform = null;
            return checkform;
        }
    }

    @Override
    public List<UserList> getUserList() {
        try {
            List<UserList> userList;
            userList = userMapper.getuserList();
            return userList;
        }catch (Exception e) {
            log.error("getUserList Error {}" ,e);
            e.printStackTrace();
            List<UserList> userList = null;
            return userList;
        }
    }
    public UserInfo getuserinfo(String id) {
        try {
            UserInfo userinfo;
            userinfo = userMapper.getuserinfo(id);
            return userinfo;
        } catch (Exception e) {
            log.error(" getuserinfo Error {}", e);
            e.printStackTrace();
            UserInfo userInfo = null;
            return userInfo;
        }
    }
}

 

 

UserMapper.java

package cohttp://m.wonlee.spring.mapper;

import cohttp://m.wonlee.spring.User.UserInfo;
import cohttp://m.wonlee.spring.User.UserList;
import cohttp://m.wonlee.spring.form.LoginForm;
import org.mybatis.spring.annotation.MapperScan;
import java.util.List;

@MapperScan
public interface UserMapper {
      public LoginForm loginCheck(LoginForm form);

      public List getuserList();

      public UserInfo getuserinfo(String id);
}

 

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.wonlee.spring.mapper.UserMapper">

<!-- <resultMap id="loginFormResultMap" type="com.wonlee.spring.form.LoginForm">

<result column="userid" property="id"/>

<result column="passwd" property="pw"/>

</resultMap>-->

<!--<select id="loginCheck" parameterType="com.wonlee.spring.form.LoginForm" resultMap="loginFormResultMap">

select userid,passwd from userinfo where userid = #{id} and passwd = #{pw};

</select>-->

<!-- resultType을 form객체로 그대로 가져 오려면 vo의 필드값과 컬럼을 동일하게 맞춰야함. -->

<select id="loginCheck" parameterType="com.wonlee.spring.form.LoginForm" resultType="com.wonlee.spring.form.LoginForm">

select userid from userinfo where userid = #{userid} and password = #{password};

</select>

 

<select id="getuserList" resultType="com.wonlee.spring.User.UserInfo">

select userid from userinfo;

</select>

 

<select id="getuserinfo" parameterType="com.wonlee.spring.User.UserInfo" resultType="com.wonlee.spring.User.UserInfo">

select * from userinfo where userid = #{userid};

</select>

 

 

</mapper>

 

 

views

(1) login.jsp

<%@ page contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>

 

<head>

<meta charset="UTF-8">

<title>로그인 페이지</title>

<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/login.css">

</head>

<body>

<div class="container">

<h2>로그인</h2>

<%-- <form action="/login_check.do" method="post">--%>

<form:form modelAttribute="loginForm" id="loginForm" name="loginForm" action="/login_check.do" method="post">

<input type="text" name="userid" placeholder="사용자 아이디" required>

<input type="password" name="password" placeholder="비밀번호" required>

<input type="submit" value="로그인">

<%-- form으로 로그인 확인 처리 <h2>${form.id}님 안녕하세요 ^^</h2>--%>

<c:if test="${islogin == false}">

<!-- islogin이 false 일때, 아래 내용을 보여줌 -->

<h2>아이디 또는 비밀번호를 확인해 주세요</h2>

</c:if>

</form:form>

<%-- </form>--%>

</div>

</body>

 

</html>

 

(2) userList.jsp

<%@ page contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html lang="ko">

 

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>유저 아이디 목록</title>

<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/login.css">

</head>

<body>

<h1>유저 아이디 목록</h1>

<ul>

<c:forEach var="userlist" items="${userList}">

<li><a href="/view/${userlist.userid}">${userlist.userid}</a></li>

</c:forEach>

</ul>

</body>

</html>

 

(3) userView.jsp

<%@ page contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html lang="ko">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>유저 정보</title>

<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/login.css">

</head>

<body>

<h1>유저 정보</h1>

<div class="container">

<div class="user-info">

<div>

<label>아이디:</label> ${userInfo.userid}

</div>

<div>

<label>비밀번호:</label> ${userInfo.passwd}

</div>

<div>

<label>이름:</label> ${userInfo.name}

</div>

<div>

<label>이메일:</label> ${userInfo.email}

</div>

<div>

<label>가입일:</label> ${userInfo.join_date}

</div>

</div>

<a href="javascript:window.history.back();" class="btn-back">뒤로 가기</a>

</div>

</body>

</html>

 

webapp > css > login.css

/* 공통 스타일 */

body {

font-family: Arial, sans-serif;

background-color: #f4f4f4;

margin: 0;

padding: 0;

}

 

h1 {

text-align: center;

margin-top: 30px;

}

 

h2 {

text-align: center;

}

 

.container {

max-width: 600px;

margin: 100px auto;

background-color: #ffffff;

padding: 20px;

border-radius: 5px;

box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);

}

 

ul {

list-style-type: none;

padding: 0;

margin: 0;

text-align: center;

}

 

li {

margin-bottom: 10px;

}

 

a {

text-decoration: none;

color: #333;

background-color: #4CAF50;

padding: 10px 20px;

border-radius: 5px;

display: inline-block;

transition: background-color 0.3s;

}

 

a:hover {

background-color: #45a049;

}

 

input[type="text"], input[type="password"] {

width: calc(100% - 20px);

padding: 10px;

margin-bottom: 15px;

border: 1px solid #ccc;

border-radius: 3px;

}

 

input[type="submit"] {

width: 100%;

padding: 10px;

border: none;

border-radius: 3px;

background-color: #4CAF50;

color: white;

cursor: pointer;

}

 

input[type="submit"]:hover {

background-color: #45a049;

}

 

.user-info {

margin-top: 20px;

}

 

.user-info div {

margin-bottom: 10px;

}

 

.user-info label {

font-weight: bold;

}

 

.btn-back {

display: block;

width: 120px;

margin: 20px auto;

padding: 10px;

text-align: center;

background-color: #4CAF50;

color: #fff;

text-decoration: none;

border-radius: 5px;

transition: background-color 0.3s;

}

 

.btn-back:hover {

background-color: #45a049;

}

 

전체 디렉토리