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
<%@ 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>
위 과정을 진행하면 정상적으로 수정 삭제가 된다.
기존 리스트
참새로 변경됨
삭제를 누르면
삭제도 잘 된다.