- Spring04_Final MVC프로젝트 생성
- myBatis 기반으로 DB 연동할 준비하기
- servlet-context 에 이 3가지 추가해주기
- DAO에 DI 되기 위해 필요한 요소들!
- myBatis 관련 설정은 configuration.xml에서 시작된다.
- classpath:의 경로는 src-resources 이다. 기억하기!
- Mapper와 configuration 앞선 프로젝트에서 복사해와서 수정
- Datasource 설정이 제대로 되려면 기본 Tomcat 서버의 context.xml 에 이 내용이 있어야 한다.
- 위의 모든 조건이 맞아야만 DB 연동이 가능한 것!
com.sy.spring04.users.controller / service / dto / dao 패키지 생성
UsersController (전체)
package com.sy.spring04.users.controller;
import java.net.URLEncoder;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.sy.spring04.users.dto.UsersDto;
import com.sy.spring04.users.service.UsersService;
@Controller
public class UsersController {
@Autowired
private UsersService service;
/*
* GET 방식 /users/signup_form 요청을 처리할 메소드
* - 요청방식이 다르면 실행되지 않는다.
*/
@RequestMapping(method = RequestMethod.GET, value = "/users/signup_form")
public String signupform() {
return "users/signup_form";
}
//회원가입 요청 처리
@RequestMapping(method = RequestMethod.POST, value = "/users/signup")
public ModelAndView signup(ModelAndView mView, UsersDto dto) {
service.addUser(dto);
mView.setViewName("users/signup");
return mView;
}
//로그인 폼 요청 처리
@RequestMapping(method = RequestMethod.GET, value="/users/loginform")
public String loginForm() {
return "users/loginform";
}
//로그인 요청 처리
@RequestMapping("/users/login")
public ModelAndView login(ModelAndView mView, UsersDto dto, String url, HttpSession session) {
/*
* 서비스에서 비즈니스 로직을 처리할 때 필요로 하는 객체를 컨트롤러에서 직접 전달해주어야 한다.
* 주로, HttpServletRequest, HttpServletResponse, HttpSession, ModelAndView
* 등등의 객체이다.
*/
service.loginProcess(dto, session);
//로그인 후에 가야할 목적지 정보를
String encodedUrl=URLEncoder.encode(url);
mView.addObject("url", url);
mView.addObject("encodedUrl", encodedUrl);
mView.setViewName("users/login");
return mView;
}
//로그아웃 요청 처리
@RequestMapping("/users/logout")
public String logout(HttpSession session) {
//세션에서 id라는 키값으로 저장된 값 삭제
session.removeAttribute("id");
return "users/logout";
}
}
- @requestMapping의 새로운 옵션
- 메소드 지정, 어떤 요청을 처리할지 value값으로 전달하는 것 등이 가능
- 받는 타입이 [] 배열로 되어있지만 하나만 지정할거면 굳이 배열로 전달 안해도 된다.
- annotation의 괄호 안에 이렇게 입력 가능
- 요청경로만 맞는다고 응답되는 것이 아니라,
전송 방식에 따라서 다른 응답을 해야할 때가 있다.
- link 누르면 get방식 요청한다는 의미에서 GET이라는 상수를 넣어주고, value값에 경로를 넣어준다.
- 이전 작성방식은 경로만 넣으면 어떤 요청이든 다 받아주는 것이고,
이렇게 get방식만 받는다고 명시하면 요청이 get방식일때만 받아진다.
users/ signup_form
<%@ 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>/users/signup_form.jsp</title>
</head>
<body>
<div class="container">
<h1>회원 가입 폼 입니다.</h1>
<form action="${pageContext.request.contextPath}/users/signup" method="post" id="myForm">
<div>
<label class="control-label" for="id">아이디</label>
<input class="form-control" type="text" name="id" id="id"/>
</div>
<div>
<label class="control-label" for="pwd">비밀번호</label>
<input class="form-control" type="password" name="pwd" id="pwd"/>
</div>
<div>
<label class="control-label" for="pwd2">비밀번호 확인</label>
<input class="form-control" type="password" name="pwd2" id="pwd2"/>
</div>
<div>
<label class="control-label" for="email">이메일</label>
<input class="form-control" type="text" name="email" id="email"/>
</div>
<button class="btn btn-primary" type="submit">가입</button>
</form>
</div>
</body>
</html>
- 이 입력받은 id,pwd,email값을 컨트롤러에서 추출해서
DB에 저장하는 작업을 하고 응답해야 한다.
UsersDto
package com.sy.spring04.users.dto;
public class UsersDto {
//필드
private String id;
private String pwd;
private String email;
private String profile;
private String regdate;
private String newPwd;
//디폴트 생성자
public UsersDto() {}
public UsersDto(String id, String pwd, String email, String profile, String regdate, String newPwd) {
super();
this.id = id;
this.pwd = pwd;
this.email = email;
this.profile = profile;
this.regdate = regdate;
this.newPwd = newPwd;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getProfile() {
return profile;
}
public void setProfile(String profile) {
this.profile = profile;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
public String getNewPwd() {
return newPwd;
}
public void setNewPwd(String newPwd) {
this.newPwd = newPwd;
}
}
UsersDao(인터페이스)
package com.sy.spring04.users.dao;
import com.sy.spring04.users.dto.UsersDto;
public interface UsersDao {
//인자로 전달된 아이디가 존재하는지 여부를 리턴하는 메소드
public boolean isExist(String inputId);
//인자로 전달된 가입하는 회원의 정보를 DB에 저장하는 메소드
public void insert(UsersDto dto);
//인자로 전달하는 아이디에 해당하는 정보를 리턴하는 메소드
public UsersDto getData(String id);
//비밀번호를 수정하는 메소드
public void updatePwd(UsersDto dto);
//개인정보를 수정하는 메소드
public void update(UsersDto dto);
//회원정보를 삭제하는 메소드
public void delete(String id);
}
UsersDaoImpl (클래스) - 전체
package com.sy.spring04.users.dao;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.sy.spring04.users.dto.UsersDto;
@Repository
public class UsersDaoImpl implements UsersDao{
@Autowired
private SqlSession session;
//해당 아이디가 존재하는지 여부를 리턴하는 메소드
@Override
public boolean isExist(String inputId) {
//id를 이용해서 select 해보면 null 혹은 null이 아니다.
UsersDto dto=session.selectOne("users.getData", inputId);
//아이디 존재 여부를 알아내서
boolean isExist= dto==null ? false : true;
//리턴해준다.
return isExist;
}
@Override
public void insert(UsersDto dto) {
session.insert("users.insert", dto);
}
@Override
public UsersDto getData(String id) {
/*
* mapper's namespace => users
* sql's id => getData
* parameter Type => String
* selectOne() 으로 메소드 호출한ㄱ경우 result Type이 메소드의 return type이 된다.
* resultType => UsersDto
*/
UsersDto dto=session.selectOne("users.getData", id);
return dto;
}
//비밀번호 수정
@Override
public void updatePwd(UsersDto dto) {
session.update("users.updatePwd", dto);
}
//이메일과 프로필 수정
@Override
public void update(UsersDto dto) {
session.update("users.update", dto);
}
//아이디를 이용한 삭제
@Override
public void delete(String id) {
session.delete("users.delete", id);
}
}
@Repository 붙여주기!
@Autowired
private SqlSession session; 추가
(sessiontemplate 객체가 들어올 수 있도록!)
- 메소드를 작성하면서 3가지 정보를 확인하고, mapper를 작성하러 가기!
- namespace, id, dto타입(파라미터타입) 인 것을 인지하기
UsersMapper (전체)
<?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="users">
<insert id="insert" parameterType="com.sy.spring04.users.dto.UsersDto">
INSERT INTO users
(id, pwd, email, regdate)
VALUES( #{id}, #{pwd}, #{email}, SYSDATE)
</insert>
<select id="getData" parameterType="string" resultType="com.sy.spring04.users.dto.UsersDto">
SELECT id, pwd, profile, email, regdate
FROM users
WHERE id=#{id}
</select>
<update id="updatePwd" parameterType="com.sy.spring04.users.dto.UsersDto">
UPDATE users
SET pwd=#{newPwd}
WHERE id=#{id}
</update>
<update id="update" parameterType="com.sy.spring04.users.dto.UsersDto">
UPDATE users
SET email=#{email}, profile=#{profile}
WHERE #{id}
</update>
<delete id="delete" parameterType="string">
DELETE FROM users
WHERE id=#{id}
</delete>
</mapper>
- UsersDto 안의 각각의 값이 들어갈 수 있도록 #{ } 으로 적어주기
- 메소드와 Mapper는 이런 연관성을 가지고있다. 기억하기!
getData 메소드 작성
@Override
public UsersDto getData(String id) {
/*
* mapper's namespace => users
* sql's id => getData
* parameter Type => String
* selectOne() 으로 메소드 호출한ㄱ경우 result Type이 메소드의 return type이 된다.
* resultType => UsersDto
*/
UsersDto dto=session.selectOne("users.getData", id);
return dto;
}
- 하나를 select하므로 SELECTONE 사용
- 위 주석의 내용을 기억하고 mapper를 작성하기
- dto정보를 받으려면 mapper resultType이 dto여야 한다.
- String 값을 가져온다는 것 명시(대소문자 무관) 원래 java.lang이 붙어야하지만 string은 자주 쓰이니까 생략..
- 가져오는 값이 하나이면 #{ } 안에 아무 단어나 넣어도 된다!
- row 하나가 dto 객체에 포장되어서 리턴된다.
- row 가 하나여도 사실 selectList로도 작성할 수 있다.
UsersDto dto=session.selectOne("users.getData", id);
→ List<UsersDto> list = session.selectList("users.getData", id);
- 이렇게 작성할 수도 있다. 하지만 이러면 list를 리턴하게 된다.
- Selectone 으로 사용하느냐 Selectlist를 사용하느냐에 따라 리턴타입이 달라진다.
- 만약 select 했는데 row가 선택되지 않으면 dto일 경우에는 null이고 / list일 경우 size가 0이 된다.
- List로 가지고오면 ResultType이 <> 제너릭이 된다는 것을 기억하기!
- string을 받아올 때와 dto를 받아올 때를 구분하기! (parameterType)
- isExist 메소드
id를 이용해서 select(getData 메소드를 활용)해서 아이디가 존재하는지 여부를 읽어온다.
- 서비스 추가하기
UsersService (인터페이스)
package com.sy.spring04.users.service;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import com.sy.spring04.users.dto.UsersDto;
public interface UsersService {
public Map<String, Object> isExistId(String inputId);
public void addUser(UsersDto dto);
public void loginProcess(UsersDto dto, HttpSession session);
public void getInfo(HttpSession session, ModelAndView mView);
public void updateUserPwd(HttpSession session, UsersDto dto, ModelAndView mView);
public Map<String, Object> saveProfileImage(HttpServletRequest request,
MultipartFile mFile);
public void updateUser(UsersDto dto, HttpSession session);
public void deleteUser(HttpSession session, ModelAndView mView);
}
UsersServiceImpl
package com.gura.spring04.users.service;
import java.util.Map;
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.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import com.gura.spring04.users.dao.UsersDao;
import com.gura.spring04.users.dto.UsersDto;
@Service
public class UsersServiceImpl implements UsersService{
@Autowired
private UsersDao dao;
@Override
public Map<String, Object> isExistId(String inputId) {
// TODO Auto-generated method stub
return null;
}
//회원 한명의 정보를 추가하는 메소드
@Override
public void addUser(UsersDto dto) {
dao.insert(dto);
}
//로그인 처리를 하는 메소드
@Override
public void loginProcess(UsersDto dto, HttpSession session) {
//입력한 정보가 맞는지 여부
boolean isValid=false;
//아이디를 이용해서 회원 정보를 얻어온다.
UsersDto resultDto=dao.getData(dto.getId());
//만일 select 된 회원 정보가 존재하고
if(resultDto != null) {
//비밀번호도 일치한다면 isValid 에 true 를 대입한다.
isValid = dto.getPwd().equals(resultDto.getPwd()) ? true : false;
}
//만일 유효한 정보이면
if(isValid) {
//로그인 처리를 한다.
session.setAttribute("id", resultDto.getId());
}
}
@Override
public void getInfo(HttpSession session, ModelAndView mView) {
// TODO Auto-generated method stub
}
@Override
public void updateUserPwd(HttpSession session, UsersDto dto, ModelAndView mView) {
// TODO Auto-generated method stub
}
@Override
public Map<String, Object> saveProfileImage(HttpServletRequest request, MultipartFile mFile) {
// TODO Auto-generated method stub
return null;
}
@Override
public void updateUser(UsersDto dto, HttpSession session) {
// TODO Auto-generated method stub
}
@Override
public void deleteUser(HttpSession session, ModelAndView mView) {
// TODO Auto-generated method stub
}
}
- @Service, @Autowired 빠뜨리지 말고 쓰기!
ex) 은행에 가서 입금을 한다고 가정하면, 입금하는 데에는 두가지 방법이 있다.
1. 은행원에게 돈을 주고 입금을 요청한다. → service 메소드 사용
2. 내가 금고에 직접 입금한다. → controller에 작성하는 것
- dao를 사용해서 서비스메소드 만들기
- Service 는 서비스를 제공하는 유틸리티라고 생각하면 된다.
- insert 작성
@Override
public void insert(UsersDto dto) {
session.insert("users.insert", dto);
}
- 컨트롤러
//회원가입 요청 처리
@RequestMapping(method = RequestMethod.POST, value = "/users/signup")
public ModelAndView signup(ModelAndView mView, UsersDto dto) {
service.addUser(dto);
mView.setViewName("users/signup");
return mView;
}
- post방식의 signup 요청을 받아야 한다는 것을 기억하고 controller 작성
- id, pwd, email 요청
- service 객체를 받아서 원하는일 처리
- view page 생성 : signup.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>/views/users/signup.jsp</title>
</head>
<body>
<div class="container">
<p> <!-- form 전송된 파라미터를 view page에서 당연히 사용할 수 있음 -->
<strong>${param.id}</strong>회원님 가입 되었습니다.
<a href="${pageContext.request.contextPath}/users/loginform">로그인 하러가기</a>
</p>
</div>
</body>
</html>
- ${param.id} : form 전송된 파라미터를 view page에서 당연히 사용할 수 있음
- EL로 읽어오기. 이 경우 param. 은 생략 불가능하다
- 여기까지 하면 가입 절차는 완료!
참고) 서버가 시작할 때부터 나는 에러는 BeanCreationException일 수 있다. bean이 생성되지 않은 것!
→ 각각의 문서에 필요한 Annotation이 들어가지 않았을 수 있다.
- STS에 퀀텀 DB설치
* QuantumDB 설치 : https://quantum.sourceforge.net/
- help-install new software에 붙여넣기
- 복사한 링크를 집어넣고 core만 선택해서 설치!
- STS에 quantum DB환경 추가해서 북마크추가
- 익스플로러 창에서 우클릭-New bookmark- jar파일을 넣어주기
- 로그인정보, xe 입력하고 LocalOracle로 이름 지정해서 저장!
/users/loginform
<%@ 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>/views/users/loginform.jsp</title>
</head>
<body>
<div class="container">
<h1>로그인 폼 입니다.</h1>
<form action="${pageContext.request.contextPath}/users/login" method="post">
<c:choose>
<c:when test="${ empty param.url }">
<input type="hidden" name="url" value="${pageContext.request.contextPath}/"/>
</c:when>
<c:otherwise>
<input type="hidden" name="url" value="${param.url }"/>
</c:otherwise>
</c:choose>
<div>
<label for="id">아이디</label>
<input type="text" name="id" id="id"/>
</div>
<div>
<label for="pwd">비밀번호</label>
<input type="password" name="pwd" id="pwd"/>
</div>
<button type="submit">로그인</button>
</form>
</div>
</body>
</html>
- 패러미터 값으로 어떤 url이 넘어오면 해당 위치로 이동시키고,
넘어오지 않으면 context의 루트로 갈 수 있도록 처리하는 것
- parameter로 이렇게 3가지가 넘어온다.
- 이것을 controller에서 처리하기!
컨트롤러
//로그인 요청 처리
@RequestMapping("/users/login")
public ModelAndView login(ModelAndView mView, UsersDto dto, String url, HttpSession session) {
/*
* 서비스에서 비즈니스 로직을 처리할 때 필요로 하는 객체를 컨트롤러에서 직접 전달해주어야 한다.
* 주로, HttpServletRequest, HttpServletResponse, HttpSession, ModelAndView
* 등등의 객체이다.
*/
service.loginProcess(dto, session);
//로그인 후에 가야할 목적지 정보를
String encodedUrl=URLEncoder.encode(url);
mView.addObject("url", url);
mView.addObject("encodedUrl", encodedUrl);
mView.setViewName("users/login");
return mView;
- 로그인 요청을 처리하는 컨트롤러
- 인자를 4개 넣어준다. mView, dto, url, session
- setViewname() 으로 담아주면 알아서 forward 이동 해준다.
- 필요한 객체가 있다면 선언하는 것만으로도 들어온다.
- 폼의 name 속성의 value와 똑같이 적으면 알아서 parameter가 추출된다.
- id와 pwd는 dto에 담겨서 추출된다.
- 서비스 작성(loginProcess)
//로그인 처리를 하는 메소드
@Override
public void loginProcess(UsersDto dto, HttpSession session) {
//입력한 정보가 맞는지 여부
boolean isValid=false;
//아이디를 이용해서 회원정보를 얻어온다.
UsersDto resultDto=dao.getData(dto.getId());
//만일 select된 회원정보가 존재하고 (아이디가 없을경우 null이 리턴된다.)
if(resultDto!=null) {
//비밀번호도 일치한다면 isValid에 true를 대입힌다.
isValid=dto.getPwd().equals(resultDto.getPwd()) ? true : false;
}
//만일 유효한 정보이면
if(isValid) {
//로그인 처리를 한다.
session.setAttribute("id", resultDto.getId());
}
}
session.setAttribute("id", resultDto.getId());
- 로그인 처리란? session에다가 "id"라는 키 값으로 로그인된 아이디를 담는 것! 으로 정의한다.
(단, 입력한 id,pwd가 서버에 저장된 id, pwd와 일치했을 때에만)
- session영역에 사용자를 식별할 수 있는 값을 담는 것이다.
- 찾아온 아이디가 null이 아닌지, 입력한 아이디가 맞는지,
입력한 pwd가 저장된 비밀번호와 맞는지 검증
- 이런 복잡한 로직처리는 모두 서비스에서 하는 것이다. controller에서 하지 않는다!
- 초기값이 false이기 때문에 중간을 건너뛰더라도 false이다. true로 바뀌는 방법은 id와 pwd가 일치할 때뿐!
/users/login 뷰 페이지
<%@ 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>/views/users/login.jsp</title>
</head>
<body>
<div class="container">
<h1>알림</h1>
<c:choose>
<c:when test="${not empty sessionScope.id }">
<p>
<strong>${sessionScope.id }</strong>님 로그인 되었습니다.
<a href="${requestScope.url }">확인</a>
</p>
</c:when>
<c:otherwise>
<p>
아이디 혹은 비밀번호가 틀려요.
<a href="loginform?url=${requestScope.encodedUrl }">다시 시도</a>
</p>
</c:otherwise>
</c:choose>
</div>
</body>
</html>
- request 영역에 담긴 url 값으로 다시 원래 목적지 정보로 보내줄 수 있도록 이렇게 작성해준다.
- home.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>/home.jsp</title>
</head>
<body>
<div class="container">
<c:choose>
<c:when test="${ empty sessionScope.id}">
<a href="${pageContext.request.contextPath}/users/loginform">로그인</a>
<a href="${pageContext.request.contextPath}/users/signup_form">회원가입</a>
</c:when>
<c:otherwise>
<p>
<a href="${pageContext.request.contextPath}/users/info">${sessionScope.id }</a> 로그인중...
<a href="${pageContext.request.contextPath}/users/logout">로그아웃</a>
</p>
</c:otherwise>
</c:choose>
<h1>인덱스 페이지입니다.</h1>
<ul>
<li><a href="users/signup_form">회원가입</a></li>
</ul>
<ul>
<c:forEach var="tmp" items="${noticeList }">
<li>${tmp }</li>
</c:forEach>
</ul>
</div>
</body>
</html>
- 로그인여부에 따라 다른 페이지가 보이도록 수정
- logout (컨트롤러)
//로그아웃 요청 처리
@RequestMapping("/users/logout")
public String logout(HttpSession session) {
//세션에서 id라는 키값으로 저장된 값 삭제
session.removeAttribute("id");
return "users/logout";
}
/users/logout
<%@ 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>/views/users/logout.jsp</title>
</head>
<body>
<script>
alert("로그아웃 되었습니다.");
location.href="${pageContext.request.contextPath}/";
</script>
</body>
</html>
요청처리를 만들어보기
컨트롤러(서비스 받아오기)-서비스(메소드완성)
- 개인정보 보기(info)
- Controller
//개인정보 보기 요청 처리
@RequestMapping("/users/info")
public ModelAndView info(HttpSession session, ModelAndView mView) {
service.getInfo(session, mView);
mView.setViewName("users/info");
return mView;
}
- session을 넘겨주는 이유는? session 안에 로그인된 아이디가 들어있으므로.
- 로그인된 회원의 정보를 ModelAndView안에 넣는다
- service 메소드 완성하기
//정보를 가져오는 메소드
@Override
public void getInfo(HttpSession session, ModelAndView mView) {
//로그인된 아이디를 읽어온다.
String id=(String)session.getAttribute("id");
//DB에서 회원정보를 얻어와서
UsersDto dto=dao.getData(id);
//ModelAndView 객체에 담아준다.
mView.addObject("dto", dto);
}
- controller 에서 전달받은 값으로 mView에 담아주기
- dao와 mapper는 미리 만들어 놓으면 편하다.
/users/info.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>/views/users/info.jsp</title>
<style>
/* 프로필 이미지를 작은 원형으로 만든다 */
#profileImage{
width: 50px;
height: 50px;
border: 1px solid #cecece;
border-radius: 50%;
}
</style>
</head>
<body>
<div class="container">
<h1>가입 정보 입니다.</h1>
<table>
<tr>
<th>아이디</th>
<td>${id }</td>
</tr>
<tr>
<th>프로필 이미지</th>
<td>
<c:choose>
<c:when test="${empty dto.profile }">
<svg id="profileImage" xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-person-circle" viewBox="0 0 16 16">
<path d="M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/>
<path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"/>
</svg>
</c:when>
<c:otherwise>
<img id="profileImage"
src="${pageContext.request.contextPath}${dto.profile}"/>
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th>비밀번호</th>
<td><a href="${pageContext.request.contextPath}/users/pwd_updateform">수정하기</a></td>
</tr>
<tr>
<th>이메일</th>
<td>${dto.email }</td>
</tr>
<tr>
<th>가입일</th>
<td>${dto.regdate }</td>
</tr>
</table>
<a href="${pageContext.request.contextPath}/users/updateform">개인정보 수정</a>
<a href="javascript:deleteConfirm()">탈퇴</a>
</div>
<script>
function deleteConfirm(){
const isDelete=confirm("${id} 님 탈퇴 하시겠습니까?");
if(isDelete){
location.href="${pageContext.request.contextPath}/users/delete";
}
}
</script>
</body>
</html>
- 이렇게 개인정보가 나오면 완성
- MVC 프로젝트의 특징! jsp 페이지에 java 코드가 없다.
- 로직은 다른 페이지에서 전부 작성한다. 여기서는 응답에만 집중한다!
'국비교육(22-23)' 카테고리의 다른 글
53일차(1)/Spring(12) : ajax 요청 JSON으로 응답하기, 파일 업로드 처리 (0) | 2022.12.21 |
---|---|
52일차(2)/Spring(11) : Interceptor 추가, 비밀번호 암호화 및 수정, 회원 삭제 기능 구현 (1) | 2022.12.20 |
51일차(2)/Spring(9) : 파일 업로드 기능 구현 / SmartEditor 적용 (0) | 2022.12.19 |
51일차(1)/Spring(8) : Interceptor (0) | 2022.12.19 |
50일차(4)/Spring(7) : Service 메소드 / Todo 테이블로 실습 (1) | 2022.12.18 |