Spring Framework - 회사 점심 투표 웹사이트(3)
회사 점심 투표 웹사이트(3)
설명은 이제 줄이고 코드위주로 올려볼려고한다.(남는 시간에 작성하는거라 너무 자세하게 적어서 힘들었음.)
- 많은 소스들이 추가되었다. 똑같이 만들어준다.
- view 쪽도 header, nav, footer 추가하고 여러가지 추가되었다.
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.2</version>
</dependency>
<!-- jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.2</version>
</dependency>
- pom.xml에도 json데이터를 위해 pom에 추가해준다.
MainController
package com.ym.main.controller;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MainController {
@SuppressWarnings("unchecked")
@GetMapping(value="/")
public String MainPage(HttpServletRequest request, Model model) throws Exception {
HttpSession session = request.getSession();
Map<String, Object> userMap = (Map<String, Object>) session.getAttribute("userMap");
model.addAttribute("userMap", userMap);
return "main";
}
}
- MainService, MainServiceImpl, MainDAO는 아직 추가한 소스가 없으므로 PASS
MenuController
package com.ym.menu.controller;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import com.ym.menu.service.MenuService;
@Controller
public class MenuController {
@Inject
MenuService menuSerivce;
@GetMapping(value="/menu/menuList")
public String getMenuListPage() throws Exception {
return "menu/menuList";
}
}
MenuService
package com.ym.menu.service;
import java.util.Map;
public interface MenuService {
public Map<String, Object> getMenuList() throws Exception;
}
MenuServiceImpl
package com.ym.menu.service.impl;
import java.util.Map;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.ym.menu.dao.MenuDAO;
import com.ym.menu.service.MenuService;
@Service
public class MenuServiceImpl implements MenuService{
@Inject
MenuDAO menuDAO;
@Override
public Map<String, Object> getMenuList() throws Exception {
return menuDAO.getMenuList();
}
}
MenuDAO
package com.ym.menu.dao;
import java.util.Map;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
@Repository
public class MenuDAO {
@Inject
SqlSession sqlsession;
public Map<String, Object> getMenuList() throws Exception {
return sqlsession.selectOne("com.ym.menu.dao.MenuDAO.getMenuList");
}
}
Menu_SQL.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.ym.menu.dao.MenuDAO">
<!-- 메뉴 리스트 SELECT -->
<select id="getMenuList" resultType="map">
SELECT
rstrnt_id,
rstrnt_nm,
rstrnt_cl,
rstrnt_lc
FROM tb_rstrnt
</select>
</mapper>
- menuList 기능도 아직 개발중이라 저대로만 하고 일단 냅둠.
CREATE TABLE `tb_user` (
`seq` int NOT NULL AUTO_INCREMENT COMMENT '일련번호',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '사용자 ID',
`user_pw` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '사용자 패스워드',
`reg_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '가입일자',
`delete_at` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT 'N' COMMENT '삭제여부',
`del_date` timestamp NULL DEFAULT NULL COMMENT '삭제일자',
PRIMARY KEY (`seq`)
);
- 테이블을 먼저 생성해줌.
UserController
package com.ym.user.controller;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ym.user.service.UserService;
@Controller
public class UserController {
@Inject
UserService userService;
@GetMapping("/user/signUpPage")
public String signUpPage() throws Exception {
return "user/userSignUp";
}
@PostMapping("/user/signUpPost")
@ResponseBody
public Map<String, Object> signUpPost(@RequestParam Map<String, Object> requestMap) throws Exception {
return userService.signUpPost(requestMap);
}
@GetMapping("/user/signInPage")
public String signInPage() throws Exception {
return "user/userSignIn";
}
@PostMapping("/user/signInPost")
@ResponseBody
public Map<String, Object> signInPost(@RequestParam Map<String, Object> requestMap, HttpServletRequest request) throws Exception {
return userService.signInPost(requestMap, request);
}
@PostMapping("/user/signOutPost")
@ResponseBody
public Map<String, Object> signOutPost(HttpServletRequest request) {
Map<String, Object> resultMap = new HashMap<String, Object>();
HttpSession session = request.getSession();
try
{
session.invalidate();
resultMap.put("rst_cd","000");
resultMap.put("rst_msg","로그아웃되었습니다.");
}
catch (Exception e)
{
resultMap.put("rst_cd","001");
resultMap.put("rst_msg","로그아웃 실패되었습니다.");
}
return resultMap;
}
}
UserService
package com.ym.user.service;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
public interface UserService {
//회원가입
public Map<String, Object> signUpPost(Map<String, Object> requestMap) throws Exception;
//로그인
public Map<String, Object> signInPost(Map<String, Object> requestMap, HttpServletRequest request) throws Exception;
}
UserServiceImpl
package com.ym.user.service.impl;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Service;
import com.ym.user.dao.UserDAO;
import com.ym.user.service.UserService;
@Service
public class UserServiceImpl implements UserService{
@Inject
UserDAO userDAO;
//회원가입
@Override
public Map<String, Object>signUpPost(Map<String, Object> requestMap) throws Exception {
Map<String ,Object> resultMap = new HashMap<String, Object>();
//중복체크
if(userDAO.duplication_check(requestMap) == 0)
{
if(userDAO.signUpPost(requestMap) <= 0)
{
resultMap.put("rst_cd","001");
resultMap.put("rst_msg","내부 시스템 오류입니다.");
}
else
{
resultMap.put("rst_cd","000");
resultMap.put("rst_msg", "회원가입되었습니다.");
}
}
else
{
resultMap.put("rst_cd","002");
resultMap.put("rst_msg", "중복된 아이디입니다.");
}
return resultMap;
}
//로그인
@Override
public Map<String, Object>signInPost(Map<String, Object> requestMap, HttpServletRequest request) throws Exception {
Map<String, Object> resultMap = new HashMap<String, Object>();
if(userDAO.signInPost(requestMap) == 0)
{
resultMap.put("rst_cd","001");
resultMap.put("rst_msg","잘못된 정보입니다.");
}
else
{
resultMap.put("rst_cd","000");
resultMap.put("rst_msg","로그인되었습니다.");
HttpSession session = request.getSession();
session.setAttribute("userMap", requestMap);
}
return resultMap;
}
}
UserDAO
package com.ym.user.dao;
import java.util.Map;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
@Repository
public class UserDAO {
@Inject
SqlSession sqlSession;
public int signUpPost(Map<String ,Object> requestMap) throws Exception {
return sqlSession.insert("com.ym.user.dao.UserDAO.signUpPost", requestMap);
}
public int duplication_check(Map<String, Object> requestMap) throws Exception {
return sqlSession.selectOne("com.ym.user.dao.UserDAO.duplication_check", requestMap);
}
public int signInPost(Map<String, Object> requestMap) throws Exception {
return sqlSession.selectOne("com.ym.user.dao.UserDAO.signInPost", requestMap);
}
}
User_SQL.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.ym.user.dao.UserDAO">
<insert id="signUpPost" parameterType="map">
INSERT INTO tb_user
(
user_id,
user_pw
)
VALUES
(
#{user_id},
#{user_pw}
)
</insert>
<select id="duplication_check" parameterType="map" resultType="int">
SELECT COUNT(*)
FROM tb_user
WHERE user_id = #{user_id}
</select>
<select id="signInPost" parameterType="map" resultType="int">
SELECT COUNT(*)
FROM tb_user
WHERE 1=1
AND user_id = #{user_id}
AND user_pw = #{user_pw}
</select>
</mapper>
header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="description" content="점심식사를 고민하는 게 싫어서 만든 프로그램" />
<meta name="author" content="ym" />
<title>점심식사 뽑자</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<!-- Favicon-->
<link rel="icon" type="image/x-icon" href="../resources/assets/favicon.ico" />
<!-- Core theme CSS (includes Bootstrap)-->
<link href="../resources/css/styles.css" rel="stylesheet" />
<!-- Bootstrap core JS-->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- Core theme JS-->
<script src="../resources/js/scripts.js"></script>
</head>
<body>
navbar.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-bottom">
<div class="container px-4 px-lg-5">
<a class="navbar-brand" href="/">Home</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ml-auto">
<c:choose>
<c:when test = "${userMap != null}">
<li class="nav-item"><a class="nav-link" href="/user/myInfoPage">마이페이지</a></li>
<li class="nav-item"><a class="nav-link" href="javascript:signOutPost();">로그아웃</a></li>
<li class="nav-item"><a class="nav-link" href="#!">메뉴투표</a></li>
<li class="nav-item"><a class="nav-link" href="#!">메뉴조회</a></li>
</c:when>
<c:when test = "${userMap == null}">
<li class="nav-item"><a class="nav-link" href="/user/signUpPage">회원가입</a></li>
<li class="nav-item"><a class="nav-link" href="/user/signInPage">로그인</a></li>
</c:when>
</c:choose>
</ul>
</div>
</div>
</nav>
<script>
function signOutPost() {
$.ajax({
type:"POST",
url:"/user/signOutPost",
success:function(data) {
alert(data.rst_msg);
if(data.rst_cd == "001")
{
return false;
}
location.href="/";
},
error:function() {
alert("통신오류");
}
});
}
</script>
footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
</body>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.10.1/mdb.min.js"></script>
<!-- Font Awesome -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.1/css/all.min.css" rel="stylesheet"/>
<!-- Google Fonts -->
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet"/>
<!-- MDB -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/3.10.1/mdb.min.css" rel="stylesheet"/>
</html>
userSignUp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/include/header.jsp" %>
<%@ include file="/WEB-INF/include/navbar.jsp" %>
<script>
function signUpPost() {
var user_id= $("#user_id").val();
var user_pw = $("#user_pw").val();
var user_pw_confirm = $("#user_pw_confirm").val();
//validation 체크
if(user_id == '' || user_id == null) {
$("#user_id").focus();
alert("아이디를 입력해주세요.");
return false;
}
if(user_pw == '' || user_pw == null) {
$("#user_pw").focus();
alert("비밀번호를 입력해주세요.");
return false;
}
if(user_pw != user_pw_confirm) {
$("#user_pw").focus();
alert("비밀번호가 다릅니다.");
return false;
}
var param = {
user_id : $("#user_id").val(),
user_pw : $("#user_pw").val(),
user_pw_confirm : $("#user_pw_confirm").val()
};
$.ajax({
type:"POST",
url:"/user/signUpPost",
data:param,
success:function(data) {
alert(data.rst_msg);
if(data.rst_cd == "002")
{
return false;
}
location.href="/";
},
error:function() {
alert("통신오류");
}
});
};
</script>
<section class="vh-100 gradient-custom">
<div class="container py-5 h-100">
<div class="row d-flex justify-content-center align-items-center h-100">
<div class="col-12 col-md-8 col-lg-6 col-xl-5">
<div class="card bg-dark text-white" style="border-radius: 1rem;">
<div class="card-body p-5 text-center">
<div class="mb-md-5 mt-md-4 pb-5">
<h2 class="fw-bold mb-2 text-uppercase">회원가입</h2>
<p class="text-white-50 mb-5">정보를 입력해주세요.</p>
<div class="form-outline form-white mb-4">
<input type="text" id="user_id" class="form-control form-control-lg" autocomplete="off"/>
<label class="form-label" for="user_id">ID</label>
</div>
<div class="form-outline form-white mb-4">
<input type="password" id="user_pw" class="form-control form-control-lg" />
<label class="form-label" for="user_pw">Password</label>
</div>
<div class="form-outline form-white mb-4">
<input type="password" id="user_pw_confirm" class="form-control form-control-lg" />
<label class="form-label" for="user_pw_confirm">Password Confirm</label>
</div>
<button class="btn btn-outline-light btn-lg px-5" type="button" onclick="signUpPost();">회원가입</button>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<%@ include file="/WEB-INF/include/footer.jsp" %>
userSignIn.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/include/header.jsp" %>
<%@ include file="/WEB-INF/include/navbar.jsp" %>
<script>
function signInPost() {
var user_id= $("#user_id").val();
var user_pw = $("#user_pw").val();
//validation 체크
if(user_id == '' || user_id == null) {
$("#user_id").focus();
alert("아이디를 입력해주세요.");
return false;
}
if(user_pw == '' || user_pw == null) {
$("#user_pw").focus();
alert("비밀번호를 입력해주세요.");
return false;
}
var param = {
user_id : $("#user_id").val(),
user_pw : $("#user_pw").val()
};
$.ajax({
type:"POST",
url:"/user/signInPost",
data:param,
success:function(data) {
alert(data.rst_msg);
if(data.rst_cd == "001")
{
return false;
}
location.href = "/";
},
error:function() {
alert("통신오류");
}
});
}
</script>
<section class="vh-100 gradient-custom">
<div class="container py-5 h-100">
<div class="row d-flex justify-content-center align-items-center h-100">
<div class="col-12 col-md-8 col-lg-6 col-xl-5">
<div class="card bg-dark text-white" style="border-radius: 1rem;">
<div class="card-body p-5 text-center">
<div class="mb-md-5 mt-md-4 pb-5">
<h2 class="fw-bold mb-2 text-uppercase">Login</h2>
<p class="text-white-50 mb-5">ID와 PASSWORD를 입력하세요.</p>
<div class="form-outline form-white mb-4">
<input type="text" id="user_id" class="form-control form-control-lg" autocomplete="off"/>
<label class="form-label" for="user_id">ID</label>
</div>
<div class="form-outline form-white mb-4">
<input type="password" id="user_pw" class="form-control form-control-lg" />
<label class="form-label" for="user_pw">Password</label>
</div>
<!-- <p class="small mb-5 pb-lg-2"><a class="text-white-50" href="#!">Forgot password?</a></p> -->
<button class="btn btn-outline-light btn-lg px-5" type="button" onclick="signInPost();">Login</button>
</div>
<div>
<p class="mb-0">계정이 없으신가요? <a href="/user/signUpPage" class="text-white-50 fw-bold">회원가입</a></p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<%@ include file="/WEB-INF/include/footer.jsp" %>
style.css
.navbar-dark .navbar-toggler-icon {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") !important;
}
-
style.css 파일에서 해당 클래스의 !important를 적어준다. 모바일화면을 위해서!
-
menuList.jsp 는 아직 작업중이라 올리지않음.
댓글남기기