스프링(Spring) #4

jjinny_0609·2023년 3월 30일
0

Spring

목록 보기
4/6

회원 상세 내용 페이지 (detail)에 회원 내용 받아오기

list.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">
<title>Insert title here</title>
</head>
<body>
<%-- ${memlist} --%>
	<table border="1">
		<tr>
			<td>ID</td><td>이름</td><td>나이</td><td>주소</td><td>이메일</td><td>폰번호</td>
		</tr>
		<c:forEach items="${memlist}" var="list">
		<tr>
			<td><a href="detail?id=${list.id}">${list.id}</a></td><td>${list.name}</td><td>${list.age}</td><td>${list.addr}</td><td>${list.email}</td><td>${list.phone}</td>
		</tr>
		</c:forEach>
	</table>
</body>
</html>

해당 경로에 detail.jsp 생성

detail.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">
<title>Insert title here</title>
</head>
<body>
${detail}
	<table border="1">
		<tr>
			<td>이름</td>
			<td>${detail.name}</td>
		</tr>
		<tr>
			<td>ID</td>
			<td>${detail.id}</td>
		</tr>
		<tr>
			<td>password</td>
			<td>${detail.password}</td>
		</tr>
		<tr>
			<td>나이</td>
			<td>13</td>
		</tr>
		<tr>
			<td>주소</td>
			<td>${detail.addr}</td>
		</tr>
		<tr>
			<td>이메일</td>
			<td>${detail.email}</td>
		</tr>
		<tr>
			<td>폰번호</td>
			<td>${detail.phone}</td>
		</tr>
	</table>
	<input type = "button" value="수정">
	<input type = "button" value="삭제"> 
</body>
</html>

MemberController.java

// 회원 상세 내용 페이지
	@RequestMapping(value = "/detail", method = RequestMethod.GET)
	public String memberDetail(Model model) {//return type void가 아니니 return값이 꼭 있어야한다.
		model.addAttribute("memlist", ls.memlist());
		//ls.memlist();
		return "member/detail"; //member폴더에 detail.jsp를 실행하겠다 //WEB-INF/view/member/detail.jsp
	}

MemberController.java의 내용을 수정해주고
detail.jsp를 만든후 id를 클릭

이제 수정버튼을 누르면 수정이 되도록 만들어주자.

값은
MemberController.java ->
LoginServive.java->
LoginServiceImpl.java->
LoginMapper.java->
LoginMapper.xml 순서로 id값 전달된다.

LoginService.java

package org.hj.service;

import java.util.ArrayList;

import org.hj.model.LoginVO;

public interface LoginService {
	public void memreg(LoginVO member);
	public LoginVO login(LoginVO member);
	public ArrayList<LoginVO> memlist();						
	// ② memdetail() 메서드 생성, 리턴타입을 잘모르겠다면 일단 void로 해놓고 진행
	// 설계만하고 아직 구현을 아직 안해줬으니 구현을 해줘야함
	// 메서드 선언
//	public LoginVO memdetail(String id);
	public LoginVO memdetail(LoginVO login);	// ※ LoginVO로 하는법
	
}

LoginServicelmpl.java

package org.hj.service;

import java.util.ArrayList;

import org.hj.mapper.LoginMapper;
import org.hj.model.LoginVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LoginServiceImpl implements LoginService {
	
	@Autowired
	LoginMapper lm;	// loginMapper lm = new LoginMapper();
	
	public void memreg(LoginVO member) {
		lm.memreg(member);
	};
	
	public LoginVO login (LoginVO member) {
		System.out.println("service="+member);
		System.out.println("service return="+lm.login(member));
		return lm.login(member);
	}
	
	public ArrayList<LoginVO> memlist() {
		return lm.memlist();
	}
	
	// ③ 여기서 구현을 시작, LoginMapper.xml도 수정해야함
//	public void memdetail(String id) {
//		lm.memdetail(id);		// ④ 작성후,LoginMapper.java memdetail()을 만들어줘야함
//	};
	// ※ LoginVO로 하는법
	public LoginVO memdetail(LoginVO login) {
		return lm.memdetail(login);		
	};	// void가 아니니 return 추가
}

LoginMapper.java

package org.hj.mapper;

import java.util.ArrayList;

import org.hj.model.LoginVO;

public interface LoginMapper {
	public void memreg(LoginVO member);
	public LoginVO login(LoginVO member);
	// 리턴이 있기때문에 void가 아닌  LoginVO를 리턴
	public ArrayList<LoginVO> memlist();
//	public LoginVO memdetail(String id);	// ⑤ memdetail() 생성 리턴값 잘모르니 일단 void
	// ※ LoginVO로 하는법
	public LoginVO memdetail(LoginVO login);
	
}

LoginMapper.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="org.hj.mapper.LoginMapper">
  	
  	<insert id="memreg">
  		insert into member (id, password, name, birth, gender, phonenum)
  		value(#{id},#{password},#{name},sysdate(),"f","0101");
  	</insert>
  	
  	<select id="login" resultType="org.hj.model.LoginVO">
  		select id, password
  		from member
  		where id=#{id} and password=#{password}
  	</select>
  	
  	<select id="memlist" resultType="org.hj.model.LoginVO">
  		select *	<!-- 값이 여러건이다. → 배열이 필요함 -->
  		from member
	</select>
	
	<!-- id=에 들어갈값은 loginMapper interface의 메서드이름 -->
	<select id="memdetail" resultType="org.hj.model.LoginVO">
		select *
		from member
		where id=#{id}  <!-- 사용자가 선택한 아이디 -->
		<!-- id값을 긁어와야한다. 
		private 값이 있는지 생각하고 LoginVO로 받을지 String-->
	</select>
	
  </mapper>

회원 상세 내용 페이지(detail.jsp)에서 수정 삭제 구현 하기

detail.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">
<title>Insert title here</title>
</head>
<body>
<form method="post">
<%-- ${detail} --%>
	<table border="1">
		<tr>
			<td>이름</td>
			<td>
				<input type="text" value="${detail.name}" name = "name">	
<%-- 			${detail.name} --%>
			</td>
		</tr>
		<tr>
			<td>ID</td>
			<td>
				${detail.id}<input type="hidden" value="${detail.id}" name="id">
			</td>
		</tr>
		<tr>
			<td>password</td>
				<td><input type="password" value="${detail.password}" name="password">
<%-- 			${detail.password} --%>
				</td>
		</tr>
		<tr>
			<td>나이</td>
			<td>13</td>
		</tr>
		<tr>
			<td>주소</td>
				<td>
				<input type="text" value="${detail.addr}" name="addr">
<%-- 				${detail.addr} --%>
				</td>
		</tr>
		<tr>
			<td>이메일</td>
			<td>${detail.email}</td>
		</tr>
		<tr>
			<td>폰번호</td>
				<td>
				<input type="text" value="${detail.phone}" name="phone">
				${detail.phone}
				</td>
		</tr>
		<tr>
			<td colspan="2">
				<input type="submit" value="수정" formaction="modify">
				<input type="submit" value="삭제" formaction="remove">
			</td>
		</tr>
	</table>
</form>
	
</body>
</html>

여기서는 a태그보다 form 태그로 전체를 감싸서 보내준다 그리고 form태그를 사용해야 Id password값을 안전하게 보낼 수 있다.

업데이트는 되지만 주소로 이동은 되지 않는다.

MemberController.java


package org.hj.controller;

import javax.servlet.http.HttpSession;

import org.hj.model.LoginVO;
import org.hj.service.LoginService;
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 org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Controller
public class MemberController {

	@Autowired		//스프링 프레임워크에서 사용되는 어노테이션 중 하나로, 객체 간 의존성을 자동으로 주입하는 기능을 제공합니다.
	LoginService ls;	// LoginService ls = new LoginService();
	
	// 회원가입
	@RequestMapping(value = "/member", method = RequestMethod.GET)
	public String member () {
		return "member/memberin";
	}
	
	// 회원가입서버
	@RequestMapping(value = "/member", method = RequestMethod.POST)
//  public String memberPost(String id, String password, String name) { 
//	아래 3줄을 주석처리하고 위와같이 사용해도 되지만 메모리를 많이 차지한다.
	public String memberPost (LoginVO member) {
		System.out.println(member);
		ls.memreg(member);
		return "board/list";
	}
	
	// 로그인 페이지
	@RequestMapping(value = "/login", method = RequestMethod.GET)
	public String login () {
		System.out.println("aaaa");
		return "member/login";
	}
	
	// 로그인 서버
	@RequestMapping(value = "/login", method = RequestMethod.POST)
	public String loginPost (HttpSession session, LoginVO member) {
	// ↑ 세션 사용을 알려줌 HttpSession을 지우고 이줄에 HttpSession session = new session(); 도 가능 
/*		System.out.println("contorller="+member);
		System.out.println(ls.login(member));*/
		
		if (ls.login(member)==null) {
			return "member/login";
			} else {	
				session.setAttribute("login", ls.login(member));
				return "redirect:/list";	
			}
		}
	// 회원 관리 페이지(관리자용)
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String memberlist (Model model) {
		model.addAttribute("memlist", ls.memlist());			//멤버 리스트
		return "member/list";	//	/WEB-INF/view/member/list.jsp  , 스프링에선 자동으로 해준다. root-context.xml 참고
	}
	// 회원 상세 내용 페이지
	@RequestMapping(value = "/detail", method = RequestMethod.GET)
//	public String memberDetail (String id) {	// aaaa값을 id에
    public String memberDatail(LoginVO login, Model model){ // ※ LoginVO로 하는법	⑥ , Model model 추가 뒤의 model명은 다르게 주어도 됨
//		ls.memdetail(id);		// ① ls -> LoginService에 memdetail()선언확인
		// 메서드 호출 
		
		model.addAttribute("detail", ls.memdetail(login));			//멤버 리스트
//		ls.memdetail(login);	// ※ LoginVO로 하는법
		return "member/detail";	//	/WEB-INF/view/member/detail.jsp
	}
	
	// 회원정보 수정
	@RequestMapping(value = "/modify", method = RequestMethod.POST)
//	public String memberModify(String name, String id,String password, String phone) {	// 이렇게 작성한다면 메모리 낭비문제가 있다. 32byte
	public String memberModify(LoginVO login, RedirectAttributes rttr) {	// LoginVO로 받으면 8byte면 충분
		ls.memberModify(login);
		rttr.addAttribute("id", login.getId());
		return "redirect:/detail";	//수정후 " " 안에는 어떤 화면으로 이동할 것인지 작성
		// forward방식이 아닌 redirect방식으로 해서 처리 
	}
	
	
	
	// 회원정보 삭제
	@RequestMapping(value = "/remove", method = RequestMethod.POST)
	public String remove(LoginVO login) {
		ls.memberRemove(login);
		return "redirect:/list";
	}
}

LoginService.java

package org.hj.service;

import java.util.ArrayList;

import org.hj.model.LoginVO;

public interface LoginService {
	public void memreg(LoginVO member);
	public LoginVO login(LoginVO member);
	public ArrayList<LoginVO> memlist();						
	// ② memdetail() 메서드 생성, 리턴타입을 잘모르겠다면 일단 void로 해놓고 진행
	// 설계만하고 아직 구현을 아직 안해줬으니 구현을 해줘야함
	// 메서드 선언
//	public LoginVO memdetail(String id);
	public LoginVO memdetail(LoginVO login);	// ※ LoginVO로 하는법
	
	public void memberModify(LoginVO login);
	
	public void memberRemove(LoginVO login);
}

LoginServicelmpl.java

package org.hj.service;

import java.util.ArrayList;

import org.hj.mapper.LoginMapper;
import org.hj.model.LoginVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LoginServiceImpl implements LoginService {
	
	@Autowired
	LoginMapper lm;	// loginMapper lm = new LoginMapper();
	
	public void memreg(LoginVO member) {
		lm.memreg(member);
	};
	
	public LoginVO login (LoginVO member) {
		System.out.println("service="+member);
		System.out.println("service return="+lm.login(member));
		return lm.login(member);
	}
	
	public ArrayList<LoginVO> memlist() {
		return lm.memlist();
	}
	
	// ③ 여기서 구현을 시작, LoginMapper.xml도 수정해야함
//	public void memdetail(String id) {
//		lm.memdetail(id);		// ④ 작성후,LoginMapper.java memdetail()을 만들어줘야함
//	};
	// ※ LoginVO로 하는법
	public LoginVO memdetail(LoginVO login) {
		return lm.memdetail(login);		
	};	// void가 아니니 return 추가
	
	// 수정
	public void memberModify(LoginVO login) {
		lm.memberModify(login);
	}
	
	public void memberRemove(LoginVO login) {
		lm.memberRemove(login);
	}
}

LoginMapper.java

package org.hj.mapper;

import java.util.ArrayList;

import org.hj.model.LoginVO;

public interface LoginMapper {
	public void memreg(LoginVO member);
	public LoginVO login(LoginVO member);
	// 리턴이 있기때문에 void가 아닌  LoginVO를 리턴
	public ArrayList<LoginVO> memlist();
//	public LoginVO memdetail(String id);	// ⑤ memdetail() 생성 리턴값 잘모르니 일단 void
	// ※ LoginVO로 하는법
	public LoginVO memdetail(LoginVO login);
	public void memberModify(LoginVO login);
	// 삭제
	public void memberRemove(LoginVO login);
}

LoginMapper.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="org.hj.mapper.LoginMapper">
  	
  	<insert id="memreg">
  		insert into member (id, password, name, birth, gender, phonenum)
  		value(#{id},#{password},#{name},sysdate(),"f","0101");
  	</insert>
  	
  	<select id="login" resultType="org.hj.model.LoginVO">
  		select id, password
  		from member
  		where id=#{id} and password=#{password}
  	</select>
  	
  	<select id="memlist" resultType="org.hj.model.LoginVO">
  		select *	<!-- 값이 여러건이다. → 배열이 필요함 -->
  		from member
	</select>
	
	<!-- id=에 들어갈값은 loginMapper interface의 메서드이름 -->
	<select id="memdetail" resultType="org.hj.model.LoginVO">
		select *
		from member
		where id=#{id}  <!-- 사용자가 선택한 아이디 -->
		<!-- id값을 긁어와야한다. 
		private 값이 있는지 생각하고 LoginVO로 받을지 String-->
	</select>
	
	<!-- 수정, 없데이트는 바로 되기때문에 resultType이 필요없다-->
	<update id="memberModify">
		update member
		set name =#{name},
			password =#{password},
		    phonenum =#{phone}
		where id =#{id};
	</update>
<!-- 	 phonenum =#{phone} -->
<!-- mysql의phonenum=#{LoginVO의 값 phone} -->
<!-- {phone}뒤에 ,는 빼도됨. -->

	<delete id="memberRemove">
		delete from member where id=#{id}
	</delete>
  </mapper>

위 과정을 진행하면 정상적으로 수정 삭제가 된다.

기존 리스트

참새로 변경됨

삭제를 누르면

삭제도 잘 된다.

profile
뉴비 개발자 입니다. velog 주소 : https://velog.io/@jjinny_0609 Github 주소 :

0개의 댓글