IT&코딩/Spring
Spring - 5일차 (MVC2 모델 실습)
솔론
2022. 12. 15. 17:45
728x90
반응형
■ springController
■ com.care.cf.member
□ 컨트롤러 (MemberController)
package com.care.cf.member;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class MemberController {
@Autowired
private MemberServiceImpl service;
// index 요청이 들어올 경우 실행할 기능
// http://localhost:8085/cf/index
@RequestMapping("/index")
public String index() {
System.out.println("index() 요청이 옴");
return "index";
}
// http://localhost:8085/cf/
@RequestMapping("/")
public String root() {
System.out.println("root() 요청이 옴");
return "index";
}
/*
* @RequestMapping("/index") : GET or POST 둘 다 받아 동작하는 기능.
* @RequestMapping(value = "login", method = RequestMethod.GET)
* : GET 메소드로 요청하는 상황에서만 받아서 동작하는 기능
*/
// http://localhost:8085/cf/login
@RequestMapping(value = "login", method = RequestMethod.GET) // GET만 받는다.
public void login() {
/*
* return "login";
* 위 코드는 RequestMapping이 value와 동일하기에 생략가능.
* 다르면 무조건 작성해야 함.
*/
}
@RequestMapping(value = "login", method = RequestMethod.POST)
public String login(String pw, String id) {
System.out.println("아이디 : " + id);
System.out.println("비밀번호 : " + pw);
String msg = service.login(id, pw);
if(msg.equals("로그인 성공")) {
return "index";
// response.sendRedirect('index');
// return "redirect:index";
// return "forward:index";
// 이 경우에 index 페이지로 가도 url은 login으로 나온다.
// 이 경우엔 클라이언트가 직접 index를 요청하게 만들어야 한다.
// 따라서 요청 - 응답 / 요청 - 응답의 과정을 거쳐야 한다.
// 이 경우에 쓰는 게 response.sendRedirect('index');
// 이를 간편하게 나타난 것이 return "redirect:index";
// return "forward:index"; 포워드는 바로 jsp를 찾아서 실행시키는 게 아니라 맵핑을 찾는다.
// return "index";와 표면적으로는 차이점이 없지만, 차이점은 메소드가 호출되었다는 점이다.
// boardList처럼 db에서 데이터를 찾아서 화면에 뿌리는 형식에서는 foward가 필요할 것이다.
} else {
return "login";
}
}
@Autowired private HttpSession session;
@RequestMapping("logout")
public String logout() {
session.invalidate();
return "index";
}
// http://localhost:8085/cf/register
@GetMapping("register")
public String register() {
return "member/register"; // views 폴더 안에 새 폴더를 만들었기 때문에 경로를 생략할 수 없다.
}
// http://localhost:8085/cf/register
@PostMapping("register")
public String register(Model model,
@RequestParam("id")String i,
@RequestParam("pw")String p,
@RequestParam("name")String n){
System.out.println("아이디 : " + i);
System.out.println("비밀번호 : " + p);
System.out.println("이름 : " + n);
String msg = service.insert(i, p, n);
model.addAttribute("msg", msg);
if(msg.equals("회원 가입 완료")) {
return "index";
} else {
// /WEB-INF/views/
return "member/register";
}
}
// 페이지를 달라하는 건 전부 GET
// POST는 폼의 method에 명시할 때만
// POST를 쓸 수 있는 곳 : 사용자의 입력값이 입력되는 곳.
// Mapping을 왜 나누는가?
// 화면에 페이지를 달라는 건 GET Mapping
@RequestMapping("list")
public String list(Model model) {
model.addAttribute("members", service.selectAll());
return "list";
}
@GetMapping("update")
public String update() {
String id = (String)session.getAttribute("id");
if(id==null)
return "login";
else {
return "update";
}
}
@PostMapping("update")
public String update(MemberDTO member) {
System.out.println("아이디 : " + member.getId());
System.out.println("비밀번호 : " + member.getPw());
System.out.println("이름 : " + member.getName());
member.setId((String)session.getAttribute("id"));
String msg = service.update(member);
if(msg.equals("회원 수정 완료"))
return "index";
else {
return "update";
}
}
@GetMapping("delete")
public String delete() {
String id = (String)session.getAttribute("id");
if(id==null)
return "login";
else {
return "delete";
}
}
@PostMapping("delete")
public String delete(String pw, String confirmPw, Model model) {
String id = (String)session.getAttribute("id");
String msg = service.delete(id, pw, confirmPw);
model.addAttribute("msg", msg);
if(msg.equals("회원 삭제 완료"))
return "index";
else {
return "delete";
}
}
}
ㅁ DTO (MemberDTO)
package com.care.cf.member;
public class MemberDTO {
private String id;
private String pw;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
□ DAO (IMemberDAO & IMemberDAOImpl)
인터페이스와 DAO
IMemberDAO.java
package com.care.cf.member;
import java.util.ArrayList;
public interface IMemberDAO {
public void insert(MemberDTO member);
public MemberDTO selectId(String id);
public void delete(MemberDTO deleteMember);
public ArrayList<MemberDTO> selectAll();
public void update(MemberDTO updateMember);
}
IMemberDAOImpl.java
package com.care.cf.member;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.springframework.stereotype.Repository;
@Repository
public class MemberDAOImpl implements IMemberDAO{
private Connection con;
public MemberDAOImpl() {
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "spring1212";
String password = "oracle";
try {
Class.forName("oracle.jdbc.OracleDriver");
con = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void insert(MemberDTO member) {
PreparedStatement ps = null;
String sql = "INSERT INTO db_basic VALUES(?,?,?)";
try {
ps = con.prepareStatement(sql);
ps.setString(1, member.getId());
ps.setString(2, member.getPw());
ps.setString(3, member.getName());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(ps != null) ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Override
public MemberDTO selectId(String id) {
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "SELECT * FROM db_basic WHERE id=?";
try {
ps = con.prepareStatement(sql);
ps.setString(1, id);
rs = ps.executeQuery();
if(rs.next()) {
MemberDTO member = new MemberDTO();
member.setId(rs.getString("id"));
member.setPw(rs.getString("pw"));
member.setName(rs.getString("name"));
return member;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(rs != null) rs.close();
if(ps != null) ps.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
@Override
public void delete(MemberDTO deleteMember) {
PreparedStatement ps = null;
String sql = "DELETE FROM db_basic WHERE id=?";
try {
ps = con.prepareStatement(sql);
ps.setString(1, deleteMember.getId());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(ps != null) ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Override
public ArrayList<MemberDTO> selectAll() {
PreparedStatement ps = null;
ResultSet rs = null;
String sql = "SELECT * FROM db_basic";
ArrayList<MemberDTO> members = new ArrayList<MemberDTO>();
try {
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()) {
MemberDTO member = new MemberDTO();
member.setId(rs.getString("id"));
member.setPw(rs.getString("pw"));
member.setName(rs.getString("name"));
members.add(member);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(rs != null) rs.close();
if(ps != null) ps.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return members;
}
@Override
public void update(MemberDTO updateMember) {
PreparedStatement ps = null;
// String sql = "UPDATE db_basic SET pw=? WHERE id=?";
String sql = "UPDATE db_basic SET pw=?, name=? WHERE id=?";
try {
ps = con.prepareStatement(sql);
ps.setString(1, updateMember.getPw());
ps.setString(2, updateMember.getName());
ps.setString(3, updateMember.getId());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(ps != null) ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
□ Service
IMemberService.java
package com.care.cf.member;
import java.util.ArrayList;
public interface IMemberService {
public String insert(String id, String pw, String name);
public void selectId(String id);
public String delete(String id, String pw, String confirmPw);
public ArrayList<MemberDTO> selectAll();
public String update(MemberDTO member);
}
IMemberServiceImpl.java
package com.care.cf.member;
import java.util.ArrayList;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MemberServiceImpl implements IMemberService {
@Autowired
private MemberDAOImpl memberDao;
@Override
public String insert(String id, String pw, String name) {
if(id == "" || id == null) {
return "비정상적인 아이디입니다.";
}
MemberDTO check = memberDao.selectId(id);
if(check == null) {
MemberDTO member = new MemberDTO();
member.setId(id);
member.setPw(pw);
member.setName(name);
memberDao.insert(member);
return "회원 가입 완료";
} else {
return "이미 가입된 아이디입니다.";
}
}
@Override
public void selectId(String id) {
MemberDTO member = memberDao.selectId(id);
if(member == null) {
System.out.println("아이디 정보가 존재하지 않습니다.");
} else {
System.out.println("## 검색결과 ##");
System.out.println();
System.out.println("아이디 : " + member.getId());
System.out.println("비밀번호 : " + member.getPw());
System.out.println("이름: " + member.getName());
}
}
@Override
public String delete(String id, String pw, String confirmPw) {
if(pw.equals(confirmPw) == false) {
return "비밀번호 확인 후 다시 입력하세요.";
}
MemberDTO deleteMember = memberDao.selectId(id);
if(deleteMember != null) {
if(deleteMember.getPw().equals(pw)) {
memberDao.delete(deleteMember);
return "회원 삭제 완료";
}
return "비밀번호를 정확하게 입력하세요";
} else {
return "정보가 존재하지 않습니다.";
}
}
@Override
public ArrayList<MemberDTO> selectAll() {
return memberDao.selectAll();
}
@Override
public String update(MemberDTO member) {
MemberDTO check = memberDao.selectId(member.getId());
if(check != null) {
memberDao.update(member);
return "회원 수정 완료";
} else {
return "정보가 존재하지 않습니다.";
}
}
@Autowired private HttpSession session;
public String login(String id, String pw) {
MemberDTO member = memberDao.selectId(id);
if(member == null) {
return "정보가 존재하지 않습니다.";
}
if(member.getPw().equals(pw) == false) {
return "비밀번호가 일치하지 않습니다.";
}
session.setAttribute("id", member.getId());
session.setAttribute("name", member.getName());
return "로그인 성공";
}
}
■ View 영역
□ 인덱스
index.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>
<head>
<meta charset="UTF-8">
<title>index</title>
<style>
a{text-decoration: none;}
</style>
</head>
<body>
<a href="index">인덱스</a>
<c:choose>
<c:when test="${empty sessionScope.id }">
<a href="login">로그인</a>
<a href="register">회원가입</a>
</c:when>
<c:otherwise>
<a href="logout">로그아웃</a>
<a href="list">회원목록</a>
<a href="update">회원수정</a>
<a href="delete">회원삭제</a>
</c:otherwise>
</c:choose>
</body>
</html>
□ 회원가입
register.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>
<head>
<meta charset="UTF-8">
<title>register</title>
</head>
<body>
<c:url value="/" var="contextRoot"/>
<h3>${msg }</h3>
<form action="register" method="post">
<input type="text" name="id" placeholder="아이디"/><br>
<input type="password" name="pw" placeholder="비밀번호"/><br>
<input type="text" name="name" placeholder="이름"/><br>
<input type="submit" value="회원가입"/>
<input type="button" value="취소" onclick="location.href='${contextRoot }'"/>
</form>
</body>
</html>
□ 로그인
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>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<%--
지금 사용 중인 프로젝트의 컨텍스트를 구해서 contextRoot라는 변수에 저장함
--%>
<c:url value="/" var="contextRoot"/>
<form action="login" method="post">
<input type="text" name="id" placeholder="아이디"/><br>
<input type="password" name="pw" placeholder="비밀번호"/><br>
<input type="submit" value="로그인"/>
<input type="button" value="취소" onclick="location.href='${contextRoot }'"/>
</form>
<%--
action에 /쓰면 최상위 톰캣부터 시작
그냥 login으로 쓰면 상대경로 /cf/ 뒤부터 시작.
--%>
</body>
</html>
□ 회원목록
list.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>
<head>
<meta charset="UTF-8">
<title>list</title>
<style>
a{text-decoration: none;}
</style>
</head>
<body>
<h2>회원 목록</h2>
<c:choose>
<c:when test="${empty members }">
<h3>회원의 정보가 없습니다.</h3>
</c:when>
<c:otherwise>
<table border="1">
<tr>
<th>아이디</th>
<th>비밀번호</th>
<th>이름</th>
</tr>
<c:forEach items="${members }" var="member">
<tr>
<td>${member.id }</td>
<td>${member.pw }</td>
<td>${member.name }</td>
</tr>
</c:forEach>
</table>
</c:otherwise>
</c:choose>
<br><br>
<a href="index">인덱스 페이지로 이동</a>
</body>
</html>
□ 회원정보 수정
update.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>
<head>
<meta charset="UTF-8">
<title>update</title>
</head>
<body>
<c:url value="/" var="contextRoot"/>
<form action="update" method="post">
<input type="text" readonly="readonly" value="${sessionScope.id }"/><br>
<input type="password" name="pw" placeholder="비밀번호"/><br>
<input type="text" name="name" value="${sessionScope.name }"/><br>
<input type="submit" value="회원수정"/>
<input type="button" value="취소" onclick="location.href='${contextRoot }'"/>
</form>
</body>
</html>
□ 회원 탈퇴(삭제)
delete.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>
<head>
<meta charset="UTF-8">
<title>delete</title>
<script>
function check(){
if(confirm("탈퇴하시겠습니까?"))
document.getElementById('f').submit();
}
</script>
<style type="text/css">
h3{color : red}
</style>
</head>
<body>
<c:url value="/" var="contextRoot"/>
<h3>${msg }</h3>
<form action="delete" method="post" id="f">
<input type="text" value="${sessionScope.id }" readonly="readonly" /><br>
<input type="password" name="pw" placeholder="비밀번호"/><br>
<input type="password" name="confirmPw" placeholder="비밀번호 확인"/><br>
<input type="button" value="회원탈퇴" onclick="check();"/>
<input type="button" value="취소" onclick="location.href='${contextRoot }'"/>
</form>
</body>
</html>
728x90
반응형