Spring
[Spring] Day07 (Code)
jnk1m
2022. 3. 24. 21:56
1. memberController
package com.member.controller;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.member.domain.MemberVO;
import com.member.service.MemberService;
@Controller
@RequestMapping("/member/")
public class memberController {
@Autowired
private MemberService memberService;
//회원가입 폼
@GetMapping("signup")
public void signup() {
System.out.println("signup 폼 요청!");
}
//회원가입 처리
@PostMapping("signup")
public String signupPro(@ModelAttribute("member") MemberVO member, Model model) { //model 통해서 자료 넘겨주기
System.out.println("signup 처리 요청!");
//넘어온 MemberVO의 회원정보 DB 저장 -> 서비스야 회원가입처리 진행해~(위에 서비스 주입받음)
int result =memberService.addMember(member); //위에 멤버VO 던질테니 처리해~ 처리결과 1이 넘어옴
//처리 결과 화면까지 보내줘
model.addAttribute("result", result); //signPro.jsp까지 모델을 들고가라
return "member/signupPro";
}
//메인페이지
@GetMapping("main")
public void main() {
System.out.println("main 요청");
}
//로그인 폼
@GetMapping("login")
public void login() {
System.out.println("로그인 폼 요청!");
}
//로그인 처리
@PostMapping("login")
/*
//#1.세션 꺼내기 방법
컨트롤러에서 매개변수로 받아, 서비스에 전달해주기.
public String loginPro(MemberVO member,Model model,HttpSession session) { //session 얻어오기.
System.out.println("로그인 처리 요청!");
//서비스야 로그인 처리 해
int result = memberService.idPwCheck(member,session); //멤버 던져줄테니 아이디랑 비번 체크해~
//loginPro jsp페이지에 결과 전달
model.addAttribute("result", result);
return "member/loginPro";
}*/
//#2. 세션 바로 꺼내기
public String loginPro(MemberVO member,Model model) { //session 얻어오기.
System.out.println("로그인 처리 요청!"); int result = memberService.idPwCheck(member);
model.addAttribute("result", result);
return "member/loginPro";
}
@GetMapping("logout")
public String logout(HttpSession session) {
//서비스 구현은 생략
//session.invalidate(); //session에 들어있는 속성 모두 삭제
session.removeAttribute("memId"); //memId 속성만 삭제
return "redirect:/member/main"; //메인으로 바로 이동
}
}
2. MemberService (Interface)
package com.member.service;
import javax.servlet.http.HttpSession;
import com.member.domain.MemberVO;
//서비스 인터페이스: 비즈니스 로직 처리
public interface MemberService {
//회원 추가(가입처리)
public int addMember(MemberVO member);//레코드가 추가 됐으면 1, 아니면 0 리턴. 분기 처리해주기 위해 인트로 받음
//로그인 처리
//#1.세션꺼내기 public int idPwCheck(MemberVO member,HttpSession session);
//#2. 세션 바로 꺼내기
public int idPwCheck(MemberVO member);
}
3. MemberServiceImpl
package com.member.service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.member.domain.MemberVO;
import com.member.mapper.MemberMapper;
//서비스 구현 클래스: 기능 구현
@Service
public class MemberServiceImpl implements MemberService{
@Autowired
private MemberMapper memberMapper;
//회원 추가(가입 처리) 구현
@Override
public int addMember(MemberVO member) {
//DB 접근해서 추가
int result = memberMapper.addMember(member);
return result; //실행하고 난 결과를 result에 담아서 리턴. 1이 리턴됨.
}
//로그인 처리
@Override
/*
#1. 세션 컨트롤러에서 받아 꺼내는 방법
public int idPwCheck(MemberVO member, HttpSession session) {
int result = memberMapper.idPwCheck(member);
//result 결과를 확인하고 1= 로그인 = session에 속성을 추가
// 0 = 로그인 실패. 끝.
if(result==1) {
//session에 memID라는 이름으로 사용자 id 추가 -> 로그인 확인 용으로 사용할 것임.
session.setAttribute("memID", member.getId()); //사용자의 값이 어떻게 되던 이름은 다 memID
}
return result; //값을 리턴해서 이제 컨트롤러로 가져가야 함.
}
*/
//#2. 세션 바로 꺼내는 방법
public int idPwCheck(MemberVO member) {
int result = memberMapper.idPwCheck(member);
//두줄로 풀어쓰기
// ServletRequestAttributes sra=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
// HttpServletRequest request = sra.getRequest(); //request 객체 (요청 관련 정보 담은 거)
//한줄로 줄이기
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();//request 객체 (요청 관련 정보 담은 거)
HttpSession session= request.getSession();
if(result==1) {
session.setAttribute("memId", member.getId()); }
return result;
}
}
4. MemberMapper (Interface)
package com.member.mapper;
import com.member.domain.MemberVO;
//회원 가입 mapper
public interface MemberMapper {
//회원 추가
public int addMember(MemberVO member);//결과 들어왔는지 int로 리턴
//로그인 처리 (id, pw 확인)
public int idPwCheck(MemberVO member);
}
5. MemberMapper.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.member.mapper.MemberMapper">
<!-- 회원 추가 -->
<insert id="addMember">
insert into springMember values(#{id},#{pw},#{name},#{email},#{gender},#{age},sysdate)
</insert>
<!-- 로그인 처리 카운트해서 받은 결과1이면 로그인 성공, 0이면 실패-->
<select id="idPwCheck" resultType="int">
select count(*) from springMember where id=#{id} and pw=#{pw}
</select>
</mapper>
MemberVO
package com.member.domain;
import java.sql.Timestamp;
import lombok.Data;
@Data
public class MemberVO {
private String id;
private String pw;
private String name;
private String email;
private String gender;
private Integer age;
private Timestamp reg;
}
테이블 생성 SQL문
create table springMember(
id varchar2(50) primary key,
pw varchar2(50) not null,
name varchar2(20) not null,
email varchar2(100),
gender varchar2(20),
age number default 1,
reg date default sysdate
);
desc springMember;
select * from springMember;
6. login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<br/>
<h1 align="center"> 로그인</h1>
<form action="/member/login" method="POST">
<table>
<tr>
<td>아이디</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="password" name="pw"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit"value="로그인"/>
<input type="button" value="회원가입" onclick="window.location='/member/signup/'"/>
<input type="button" value="메인" onclick="window.location='/member/main/'"/>
</td>
</tr>
</table>
</form>
</body>
</html>
7. loginPro.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login Pro</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<br/>
<h2 align="center">loginPro Page</h2>
<h3>memID ${sessionScope.memId}</h3>
<c:if test="${sessionScope.memId != null}">
<script>
alert("로그인 성공")
window.location.href="/member/main";
</script>
</c:if>
<c:if test="${sessionScope.memId == null}">
<script>
alert("로그인 실패... 다시 시도해주세요")
history.go(-1);
</script>
</c:if>
<!--
<c:if test="${result==1 }">
<script>
alert("로그인 성공!");
window.location.href="/member/main";
</script>
</c:if>
<c:if test="${result==0 }">
<script>
alert("로그인 실패... 다시 시도해주세요")
history.go(-1);
</script>
</c:if>
-->
</body>
</html>
8. main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Main</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<br/>
<h1 align="center">메인 페이지</h1>
<%--로그아웃 상태 --%>
<c:if test="${sessionScope.memId == null }">
<table>
<tr>
<td>
로그인을 원하시면 버튼을 누르세요. <br/>
<button onclick="window.location='/member/login'">로그인</button>
</td>
</tr>
<tr>
<td>
<a href="/member/signup">회원가입</a>
</td>
</tr>
</table>
</c:if>
<%--로그인 상태 --%>
<c:if test="${sessionScope.memId != null }">
<table>
<tr>
<td>
<button onclick="window.location='/member/mypage'">마이 페이지</button>
</td>
</tr>
<tr>
<td>
<button onclick="window.location='/member/logout'">로그아웃</button>
</td>
</tr>
</table>
</c:if>
<br/><br/><br/><br/>
<div align="center">
<img src="/resources/imgs/profileImage.png" width="400px"/>
</div>
</body>
</html>
9. signup.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입</title>
<link href="/resources/css/style.css" rel="stylesheet" type="text/css">
<!-- servlet보면 resources매핑이 되어 있음. 주소가 /리소시스/로 이어지는 파일들은 이미 저 안에서 찾겠다고 매핑이 되어있기에 resources로 주소 시작
이미지, js 파일은 WEB-INF 폴더에 들어가 있으면 절대!! 안됨!! 주소 요청을 못함 무조건 리소스 폴더 안에 넣기-->
</head>
<body>
<h1 align="center">회원 가입</h1>
<form action="/member/signup" method="POST">
<!-- 같은 주소로 get/ post 나뉘어서 쓸 수 있음. -->
<table>
<tr>
<td>아이디 *</td>
<td><input type="text" name="id"/></td>
</tr>
<tr>
<td>비밀번호 *</td>
<td><input type="password" name="pw"/></td>
</tr>
<tr>
<td>비밀번호 확인*</td>
<td><input type="password" name="pwch"/></td>
</tr>
<tr>
<td>이름*</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>이메일</td>
<td><input type="text" name="email"/></td>
</tr>
<tr>
<td>성별</td>
<td>
<input type="radio" name="gender" value="female" checked/>여자
<input type="radio" name="gender" value="male"/>남자
</td>
</tr>
<tr>
<td>연령대</td>
<td><input type="text" name="age"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="가입"/>
<input type="reset" value="reset"/>
<input type="button" value="취소" onclick="window.location='/member/main'"/>
</td>
</tr>
</table>
</form>
</body>
</html>
10. signupPro.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>signupPro</title>
</head>
<body>
<h2>signup Pro</h2>
<c:if test="${result==1}">
<h2>회원 가입 성공 ${member.id}님 환영합니다.</h2>
<button onclick="window.location='/member/main'">메인으로</button>
<!-- 3초 후 메인으로 이동 -->
<meta http-equiv="refresh" content="3;url=http://localhost:8080/member/main">
</c:if>
<c:if test="${result==0}">
<h2>회원 가입 실패... 다시 시도해주세요.</h2>
<button onclick="window.location='/member/main'">메인으로</button>
<button onclick="window.location='/member/signup'">회원가입</button>
</c:if>
</body>
</html>