스프링22_프로필 업로드, 정보 수정, 경로 재설정, 암호화
파일 업로드
join.jsp
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<div id="div-main">
<h1>회원가입 페이지</h1>
<form action = "" method = "post" enctype="multipart/form-data">
아이디 : <input type = "text" name = "userId"/><br>
비밀번호 : <input type = "password" name = "userPwd"/><br>
닉네임 : <input type = "text" name = "userNick"/><br>
나이 : <input type = "number" min="0" name = "userAge"/><br>
성별 :
<select name="userGender">
<option value="m">남자</option>
<option value="f">여자</option>
</select><br>
사진 : <input type = "file" name = "f" multiple="multiple" accept=".jpg, .png"/><br>
<img id="profileImg"><br><hr>
<div id="div-preview">
</div>
<input type = "submit" value ="회원가입"/>
</form>
<hr><hr><hr>
</div>
<script type="text/javascript">
let fileTag = document.querySelector("input[name=f]");
let divPreview = document.querySelector("#div-preview");
fileTag.onchange = function(){
//파일 올렸을 때 : fileTag.files.length > 0
if(fileTag.files.length>0){
//이미지 src에 들어갈 데이터 구하기
for(let i=0; i<fileTag.files.length; i++){
let reader = new FileReader();
reader.onload = function(data){
let src = data.target.result;
//이미지 태그를 만들어서 넣어줄거임
//1. 이미지 태그 만들기
let imgTag = document.createElement('img');
//2. 이미지 태그 속성들 세팅하기
imgTag.setAttribute('src', src);
imgTag.setAttribute('width', '100');
imgTag.setAttribute('height', '100');
//3. 이미지 태그 div안에 넣기
divPreview.appendChild(imgTag);
}
reader.readAsDataURL(fileTag.files[i]);
}//for end
}else{
//취소 버튼을 눌렀을 때
//div 안에 싹 다 비우기
divPreview.innerHTML = "";
}
}
</script>
</body>
경로 재설정, 프로필 보이기, 마이페이지 연결
header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="root" value="${pageContext.request.contextPath}"/>
<link rel="stylesheet" href="${root}/resources/css/common/header.css">
<div id="div-header">
<table border="1">
<tr>
<td>빈칸</td>
<td colspan="2"><a href="${root}"><img width="100%" height="50px" src="${pageContext.request.contextPath}/resources/imgs/qr.png"></a></td>
<!-- href="/app999" -->
<c:if test="${empty loginUser}">
<td>빈칸</td>
</c:if>
<c:if test="${not empty loginUser}">
<td><a href="${root}/member/mypage"><img src="${root}/resources/upload/profile/${loginUser.changeName}"></a></td>
</c:if>
</tr>
<tr>
<td><a href="${root}/notice/list">공지사항</a></td>
<td>메뉴2</td>
<td>메뉴3</td>
<c:if test="${empty loginUser}">
<td>
<a href="${root}/member/login">로그인</a><br>
<a href="${root}/member/join">회원가입</a>
</td>
</c:if>
<c:if test="${not empty loginUser}">
<td>
${loginUser.userNick}님 환영합니다!<br>
<a href="${root}/member/logout">로그아웃</a>
</td>
</c:if>
</tr>
</table>
</div>
header.css
#div-header{
width: 80vw;
height: 20vh;
margin:0 auto;
}
/* #div-header table tr td{
cursor:pointer;
}
*/
#div-header table{
width: 100%;
height: 100%;
text-align: center;
margin:0 auto;
}
#div-header table tr:nth-child(1){
height: 100px;
}
#div-header table tr:nth-child(2){
height: 50px;
}
#div-main{
width:80vw;
margin: auto;
}
#div-header table img{
height: 100px;
width: 100px;
}
암호화, 수정
MemberController
@Controller
@RequestMapping("member")
public class MemberController {
@Autowired
private MemberService service;
//로그인 화면 보여주기
@GetMapping("login")
public String login() {
return "member/login";
}
//로그인 로직 처리
@PostMapping("login")
public String login(MemberDto dto, HttpSession session) throws Exception {
MemberDto loginUser = service.login(dto);
if(loginUser != null) {
//success -> session에 담기 -> home으로
session.setAttribute("loginUser", loginUser);
return "redirect:/";
}else {
//fail -> login
return "member/login";
}
}
//회원가입 화면 보여주기
@GetMapping("join")
public String join() {
return "member/join";
}
//회원가입 로직 처리
@PostMapping("join")
public String join(MemberDto dto, HttpServletRequest req) throws Exception {
System.out.println(dto);
int result = service.join(dto, req);
if(result > 0) {
return "redirect:/member/login";
}else {
return "redirect:/member/join";
}
}
//로그아웃
@GetMapping("logout")
public String logout(HttpSession session) {
//session 만료
session.invalidate();
return "redirect:/";
}
//마이페이지 화면 보여주기
@GetMapping("mypage")
public String mypage(HttpServletRequest req, HttpSession session) {
MemberDto loginUser = (MemberDto) session.getAttribute("loginUser");
if(loginUser == null) {
req.setAttribute("msg", "로그인 하고 오세용!");
return "error/errorPage";
}
return "member/mypage";
}
//마이페이지 내 정보 수정 로직 처리
@PostMapping("mypage")
public String mypage(MemberDto dto, HttpSession session) throws Exception {
//update 처리하기
MemberDto m = service.editMember(dto);
if(m != null) {
session.setAttribute("loginUser", m);
return "redirect:/member/mypage";
}else {
//업데이트 실패
return "redirect:/member/mypagezz";
}
}
}
MemberService
public interface MemberService {
int join(MemberDto dto, HttpServletRequest req) throws Exception;
MemberDto login(MemberDto dto) throws Exception;
MemberDto editMember(MemberDto dto) throws Exception;
}
MemberServiceImpl
@Service
@Slf4j
@Transactional
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberDao dao;
@Autowired
private PasswordEncoder pe;
@Override
public int join(MemberDto dto, HttpServletRequest req) throws Exception{
//회원가입 처리
//회원번호, 시퀀스 nextval
int no = dao.getMemberSeq();
//insert 처리
dto.setUserNo(no);
//암호화
dto.setUserPwd(pe.encode(dto.getUserPwd()));
log.info(dto.toString());
int result = dao.insertMember(dto);
//////////////////////
//파일 업로드(우리 서버에)
MultipartFile f = dto.getF();
if(!f.isEmpty()) {
//원래 이름 -> db에 저장
//변경된 이름 -> db에 저장
//서비스 레이어에서 작업하도록
String changeName = System.currentTimeMillis()+"_"+f.getOriginalFilename();
dto.setChangeName(changeName);
//사이즈, 타입
System.out.println("===============");
System.out.println(f.getOriginalFilename());
System.out.println(f.getSize());
System.out.println(f.getContentType());
System.out.println("===============");
//파일을 톰캣에 저장
String path = req.getServletContext().getRealPath("/resources/upload/profile/");
//파일을 서버에 저장
//getREalPath == /spring999prjFinal/src/main/webapp
// File file = new File("D:/uploadForSpring/999prj/profile/"+ changeName);
File file = new File(path+ changeName);
f.transferTo(file);
//db에 insert
dao.uploadProfile(dto);
}
return result;
}
@Override
public MemberDto login(MemberDto dto) throws Exception {
//DB에서 회원 정보 조회
MemberDto dbUser = dao.getMember(dto);
//비번 일치 체크
if(pe.matches(dto.getUserPwd(), dbUser.getUserPwd())) {
//일치함-> 멤버 리턴
return dbUser;
}else {
//불일치-> null 리턴
return null;
}
}
@Override
public MemberDto editMember(MemberDto dto) throws Exception {
//비밀번호 한번 더 확인..근데 여기선 패스
//비번을 입력했을 때만 수정 가능!!
if(dto.getUserPwd().length()>0) {
dto.setUserPwd(pe.encode(dto.getUserPwd()));
}
int result = dao.updateMember(dto);
MemberDto m = null;
if(result > 0) {
m = dao.getMember(dto);
}
return m;
}
}
MemberDao
public interface MemberDao {
int getMemberSeq() throws Exception;
int insertMember(MemberDto dto) throws Exception;
void uploadProfile(MemberDto dto) throws Exception;
MemberDto getMember(MemberDto dto) throws Exception;
int updateMember(MemberDto dto) throws Exception;
}
MemberDaoImpl
@Repository
public class MemberDaoImpl implements MemberDao{
@Autowired
private SqlSession sqlSession;
@Override
public int getMemberSeq() throws Exception {
return sqlSession.selectOne("member.getSeq");
}
@Override
public int insertMember(MemberDto dto) throws Exception{
return sqlSession.insert("member.insertMember", dto);
}
@Override
public void uploadProfile(MemberDto dto) throws Exception {
sqlSession.insert("member.insertProfile", dto);
}
@Override
public MemberDto getMember(MemberDto dto) throws Exception {
return sqlSession.selectOne("member.getMember", dto);
}
@Override
public int updateMember(MemberDto dto) throws Exception{
return sqlSession.update("member.updateMember", dto);
}
}
member-mapper.xml
<mapper namespace="member">
<select id="getSeq" resultType="int">
SELECT MEMBER_SEQ.NEXTVAL FROM DUAL
</select>
<insert id="insertMember" parameterType="memberDto">
INSERT INTO MEMBER
(
USER_NO
,USER_ID
,USER_PWD
,USER_NICK
,USER_AGE
,USER_GENDER
)
VALUES
(
#{userNo}
,#{userId}
,#{userPwd}
,#{userNick}
,#{userAge}
,#{userGender}
)
</insert>
<insert id="insertProfile" parameterType="memberDto">
INSERT INTO MEMBER_PROFILE
(
FILE_NO
,USER_NO
,CHANGE_NAME
)
VALUES
(
MEMBER_PROFILE_SEQ.NEXTVAL
,#{userNo}
,#{changeName}
)
</insert>
<select id="getMember" parameterType="memberDto" resultType="memberDto">
SELECT *
FROM MEMBER M
JOIN MEMBER_PROFILE P ON (M.USER_NO = P.USER_NO)
WHERE USER_ID = #{userId}
</select>
<update id="updateMember" parameterType="memberDto">
UPDATE MEMBER
SET
USER_NO = #{userNo}
<if test="userPwd != null and userPwd != ''">
,USER_PWD = #{userPwd}
</if>
<if test="userNick != null and userNick != ''">
,USER_NICK = #{userNick}
</if>
<if test="userAge != null and userAge != ''">
,USER_AGE = #{userAge}
</if>
<if test="userGender != null and userGender != ''">
,USER_GENDER = #{userGender}
</if>
WHERE USER_NO = #{userNo}
</update>
</mapper>
MemberDto
@Data
public class MemberDto {
private long userNo;
private String userId;
private String userPwd;
private String userNick;
private int userAge;
private String userGender;
private MultipartFile f;
private String changeName;
}
resources/upload/profile
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<div id="div-main">
<h1>회원가입 페이지</h1>
<form action = "" method = "post" enctype="multipart/form-data">
아이디 : <input type = "text" name = "userId"/><br>
비밀번호 : <input type = "password" name = "userPwd"/><br>
닉네임 : <input type = "text" name = "userNick"/><br>
나이 : <input type = "number" min="0" name = "userAge"/><br>
성별 :
<select name="userGender">
<option value="m">남자</option>
<option value="f">여자</option>
</select><br>
사진 : <input type = "file" name = "f" multiple="multiple" accept=".jpg, .png"/><br>
<img id="profileImg"><br><hr>
<div id="div-preview">
</div>
<input type = "submit" value ="회원가입"/>
</form>
<hr><hr><hr>
</div>
<script type="text/javascript">
let fileTag = document.querySelector("input[name=f]");
let divPreview = document.querySelector("#div-preview");
fileTag.onchange = function(){
//파일 올렸을 때 : fileTag.files.length > 0
if(fileTag.files.length>0){
//이미지 src에 들어갈 데이터 구하기
for(let i=0; i<fileTag.files.length; i++){
let reader = new FileReader();
reader.onload = function(data){
let src = data.target.result;
//이미지 태그를 만들어서 넣어줄거임
//1. 이미지 태그 만들기
let imgTag = document.createElement('img');
//2. 이미지 태그 속성들 세팅하기
imgTag.setAttribute('src', src);
imgTag.setAttribute('width', '100');
imgTag.setAttribute('height', '100');
//3. 이미지 태그 div안에 넣기
divPreview.appendChild(imgTag);
}
reader.readAsDataURL(fileTag.files[i]);
}//for end
}else{
//취소 버튼을 눌렀을 때
//div 안에 싹 다 비우기
divPreview.innerHTML = "";
}
}
</script>
</body>
header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="root" value="${pageContext.request.contextPath}"/>
<link rel="stylesheet" href="${root}/resources/css/common/header.css">
<div id="div-header">
<table border="1">
<tr>
<td>빈칸</td>
<td colspan="2"><a href="${root}"><img width="100%" height="50px" src="${pageContext.request.contextPath}/resources/imgs/qr.png"></a></td>
<!-- href="/app999" -->
<c:if test="${empty loginUser}">
<td>빈칸</td>
</c:if>
<c:if test="${not empty loginUser}">
<td><a href="${root}/member/mypage"><img src="${root}/resources/upload/profile/${loginUser.changeName}"></a></td>
</c:if>
</tr>
<tr>
<td><a href="${root}/notice/list">공지사항</a></td>
<td>메뉴2</td>
<td>메뉴3</td>
<c:if test="${empty loginUser}">
<td>
<a href="${root}/member/login">로그인</a><br>
<a href="${root}/member/join">회원가입</a>
</td>
</c:if>
<c:if test="${not empty loginUser}">
<td>
${loginUser.userNick}님 환영합니다!<br>
<a href="${root}/member/logout">로그아웃</a>
</td>
</c:if>
</tr>
</table>
</div>
header.css
#div-header{
width: 80vw;
height: 20vh;
margin:0 auto;
}
/* #div-header table tr td{
cursor:pointer;
}
*/
#div-header table{
width: 100%;
height: 100%;
text-align: center;
margin:0 auto;
}
#div-header table tr:nth-child(1){
height: 100px;
}
#div-header table tr:nth-child(2){
height: 50px;
}
#div-main{
width:80vw;
margin: auto;
}
#div-header table img{
height: 100px;
width: 100px;
}
암호화, 수정
MemberController
@Controller
@RequestMapping("member")
public class MemberController {
@Autowired
private MemberService service;
//로그인 화면 보여주기
@GetMapping("login")
public String login() {
return "member/login";
}
//로그인 로직 처리
@PostMapping("login")
public String login(MemberDto dto, HttpSession session) throws Exception {
MemberDto loginUser = service.login(dto);
if(loginUser != null) {
//success -> session에 담기 -> home으로
session.setAttribute("loginUser", loginUser);
return "redirect:/";
}else {
//fail -> login
return "member/login";
}
}
//회원가입 화면 보여주기
@GetMapping("join")
public String join() {
return "member/join";
}
//회원가입 로직 처리
@PostMapping("join")
public String join(MemberDto dto, HttpServletRequest req) throws Exception {
System.out.println(dto);
int result = service.join(dto, req);
if(result > 0) {
return "redirect:/member/login";
}else {
return "redirect:/member/join";
}
}
//로그아웃
@GetMapping("logout")
public String logout(HttpSession session) {
//session 만료
session.invalidate();
return "redirect:/";
}
//마이페이지 화면 보여주기
@GetMapping("mypage")
public String mypage(HttpServletRequest req, HttpSession session) {
MemberDto loginUser = (MemberDto) session.getAttribute("loginUser");
if(loginUser == null) {
req.setAttribute("msg", "로그인 하고 오세용!");
return "error/errorPage";
}
return "member/mypage";
}
//마이페이지 내 정보 수정 로직 처리
@PostMapping("mypage")
public String mypage(MemberDto dto, HttpSession session) throws Exception {
//update 처리하기
MemberDto m = service.editMember(dto);
if(m != null) {
session.setAttribute("loginUser", m);
return "redirect:/member/mypage";
}else {
//업데이트 실패
return "redirect:/member/mypagezz";
}
}
}
MemberService
public interface MemberService {
int join(MemberDto dto, HttpServletRequest req) throws Exception;
MemberDto login(MemberDto dto) throws Exception;
MemberDto editMember(MemberDto dto) throws Exception;
}
MemberServiceImpl
@Service
@Slf4j
@Transactional
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberDao dao;
@Autowired
private PasswordEncoder pe;
@Override
public int join(MemberDto dto, HttpServletRequest req) throws Exception{
//회원가입 처리
//회원번호, 시퀀스 nextval
int no = dao.getMemberSeq();
//insert 처리
dto.setUserNo(no);
//암호화
dto.setUserPwd(pe.encode(dto.getUserPwd()));
log.info(dto.toString());
int result = dao.insertMember(dto);
//////////////////////
//파일 업로드(우리 서버에)
MultipartFile f = dto.getF();
if(!f.isEmpty()) {
//원래 이름 -> db에 저장
//변경된 이름 -> db에 저장
//서비스 레이어에서 작업하도록
String changeName = System.currentTimeMillis()+"_"+f.getOriginalFilename();
dto.setChangeName(changeName);
//사이즈, 타입
System.out.println("===============");
System.out.println(f.getOriginalFilename());
System.out.println(f.getSize());
System.out.println(f.getContentType());
System.out.println("===============");
//파일을 톰캣에 저장
String path = req.getServletContext().getRealPath("/resources/upload/profile/");
//파일을 서버에 저장
//getREalPath == /spring999prjFinal/src/main/webapp
// File file = new File("D:/uploadForSpring/999prj/profile/"+ changeName);
File file = new File(path+ changeName);
f.transferTo(file);
//db에 insert
dao.uploadProfile(dto);
}
return result;
}
@Override
public MemberDto login(MemberDto dto) throws Exception {
//DB에서 회원 정보 조회
MemberDto dbUser = dao.getMember(dto);
//비번 일치 체크
if(pe.matches(dto.getUserPwd(), dbUser.getUserPwd())) {
//일치함-> 멤버 리턴
return dbUser;
}else {
//불일치-> null 리턴
return null;
}
}
@Override
public MemberDto editMember(MemberDto dto) throws Exception {
//비밀번호 한번 더 확인..근데 여기선 패스
//비번을 입력했을 때만 수정 가능!!
if(dto.getUserPwd().length()>0) {
dto.setUserPwd(pe.encode(dto.getUserPwd()));
}
int result = dao.updateMember(dto);
MemberDto m = null;
if(result > 0) {
m = dao.getMember(dto);
}
return m;
}
}
MemberDao
public interface MemberDao {
int getMemberSeq() throws Exception;
int insertMember(MemberDto dto) throws Exception;
void uploadProfile(MemberDto dto) throws Exception;
MemberDto getMember(MemberDto dto) throws Exception;
int updateMember(MemberDto dto) throws Exception;
}
MemberDaoImpl
@Repository
public class MemberDaoImpl implements MemberDao{
@Autowired
private SqlSession sqlSession;
@Override
public int getMemberSeq() throws Exception {
return sqlSession.selectOne("member.getSeq");
}
@Override
public int insertMember(MemberDto dto) throws Exception{
return sqlSession.insert("member.insertMember", dto);
}
@Override
public void uploadProfile(MemberDto dto) throws Exception {
sqlSession.insert("member.insertProfile", dto);
}
@Override
public MemberDto getMember(MemberDto dto) throws Exception {
return sqlSession.selectOne("member.getMember", dto);
}
@Override
public int updateMember(MemberDto dto) throws Exception{
return sqlSession.update("member.updateMember", dto);
}
}
member-mapper.xml
<mapper namespace="member">
<select id="getSeq" resultType="int">
SELECT MEMBER_SEQ.NEXTVAL FROM DUAL
</select>
<insert id="insertMember" parameterType="memberDto">
INSERT INTO MEMBER
(
USER_NO
,USER_ID
,USER_PWD
,USER_NICK
,USER_AGE
,USER_GENDER
)
VALUES
(
#{userNo}
,#{userId}
,#{userPwd}
,#{userNick}
,#{userAge}
,#{userGender}
)
</insert>
<insert id="insertProfile" parameterType="memberDto">
INSERT INTO MEMBER_PROFILE
(
FILE_NO
,USER_NO
,CHANGE_NAME
)
VALUES
(
MEMBER_PROFILE_SEQ.NEXTVAL
,#{userNo}
,#{changeName}
)
</insert>
<select id="getMember" parameterType="memberDto" resultType="memberDto">
SELECT *
FROM MEMBER M
JOIN MEMBER_PROFILE P ON (M.USER_NO = P.USER_NO)
WHERE USER_ID = #{userId}
</select>
<update id="updateMember" parameterType="memberDto">
UPDATE MEMBER
SET
USER_NO = #{userNo}
<if test="userPwd != null and userPwd != ''">
,USER_PWD = #{userPwd}
</if>
<if test="userNick != null and userNick != ''">
,USER_NICK = #{userNick}
</if>
<if test="userAge != null and userAge != ''">
,USER_AGE = #{userAge}
</if>
<if test="userGender != null and userGender != ''">
,USER_GENDER = #{userGender}
</if>
WHERE USER_NO = #{userNo}
</update>
</mapper>
MemberDto
@Data
public class MemberDto {
private long userNo;
private String userId;
private String userPwd;
private String userNick;
private int userAge;
private String userGender;
private MultipartFile f;
private String changeName;
}
resources/upload/profile
@Controller
@RequestMapping("member")
public class MemberController {
@Autowired
private MemberService service;
//로그인 화면 보여주기
@GetMapping("login")
public String login() {
return "member/login";
}
//로그인 로직 처리
@PostMapping("login")
public String login(MemberDto dto, HttpSession session) throws Exception {
MemberDto loginUser = service.login(dto);
if(loginUser != null) {
//success -> session에 담기 -> home으로
session.setAttribute("loginUser", loginUser);
return "redirect:/";
}else {
//fail -> login
return "member/login";
}
}
//회원가입 화면 보여주기
@GetMapping("join")
public String join() {
return "member/join";
}
//회원가입 로직 처리
@PostMapping("join")
public String join(MemberDto dto, HttpServletRequest req) throws Exception {
System.out.println(dto);
int result = service.join(dto, req);
if(result > 0) {
return "redirect:/member/login";
}else {
return "redirect:/member/join";
}
}
//로그아웃
@GetMapping("logout")
public String logout(HttpSession session) {
//session 만료
session.invalidate();
return "redirect:/";
}
//마이페이지 화면 보여주기
@GetMapping("mypage")
public String mypage(HttpServletRequest req, HttpSession session) {
MemberDto loginUser = (MemberDto) session.getAttribute("loginUser");
if(loginUser == null) {
req.setAttribute("msg", "로그인 하고 오세용!");
return "error/errorPage";
}
return "member/mypage";
}
//마이페이지 내 정보 수정 로직 처리
@PostMapping("mypage")
public String mypage(MemberDto dto, HttpSession session) throws Exception {
//update 처리하기
MemberDto m = service.editMember(dto);
if(m != null) {
session.setAttribute("loginUser", m);
return "redirect:/member/mypage";
}else {
//업데이트 실패
return "redirect:/member/mypagezz";
}
}
}
public interface MemberService {
int join(MemberDto dto, HttpServletRequest req) throws Exception;
MemberDto login(MemberDto dto) throws Exception;
MemberDto editMember(MemberDto dto) throws Exception;
}
@Service
@Slf4j
@Transactional
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberDao dao;
@Autowired
private PasswordEncoder pe;
@Override
public int join(MemberDto dto, HttpServletRequest req) throws Exception{
//회원가입 처리
//회원번호, 시퀀스 nextval
int no = dao.getMemberSeq();
//insert 처리
dto.setUserNo(no);
//암호화
dto.setUserPwd(pe.encode(dto.getUserPwd()));
log.info(dto.toString());
int result = dao.insertMember(dto);
//////////////////////
//파일 업로드(우리 서버에)
MultipartFile f = dto.getF();
if(!f.isEmpty()) {
//원래 이름 -> db에 저장
//변경된 이름 -> db에 저장
//서비스 레이어에서 작업하도록
String changeName = System.currentTimeMillis()+"_"+f.getOriginalFilename();
dto.setChangeName(changeName);
//사이즈, 타입
System.out.println("===============");
System.out.println(f.getOriginalFilename());
System.out.println(f.getSize());
System.out.println(f.getContentType());
System.out.println("===============");
//파일을 톰캣에 저장
String path = req.getServletContext().getRealPath("/resources/upload/profile/");
//파일을 서버에 저장
//getREalPath == /spring999prjFinal/src/main/webapp
// File file = new File("D:/uploadForSpring/999prj/profile/"+ changeName);
File file = new File(path+ changeName);
f.transferTo(file);
//db에 insert
dao.uploadProfile(dto);
}
return result;
}
@Override
public MemberDto login(MemberDto dto) throws Exception {
//DB에서 회원 정보 조회
MemberDto dbUser = dao.getMember(dto);
//비번 일치 체크
if(pe.matches(dto.getUserPwd(), dbUser.getUserPwd())) {
//일치함-> 멤버 리턴
return dbUser;
}else {
//불일치-> null 리턴
return null;
}
}
@Override
public MemberDto editMember(MemberDto dto) throws Exception {
//비밀번호 한번 더 확인..근데 여기선 패스
//비번을 입력했을 때만 수정 가능!!
if(dto.getUserPwd().length()>0) {
dto.setUserPwd(pe.encode(dto.getUserPwd()));
}
int result = dao.updateMember(dto);
MemberDto m = null;
if(result > 0) {
m = dao.getMember(dto);
}
return m;
}
}
public interface MemberDao {
int getMemberSeq() throws Exception;
int insertMember(MemberDto dto) throws Exception;
void uploadProfile(MemberDto dto) throws Exception;
MemberDto getMember(MemberDto dto) throws Exception;
int updateMember(MemberDto dto) throws Exception;
}
@Repository
public class MemberDaoImpl implements MemberDao{
@Autowired
private SqlSession sqlSession;
@Override
public int getMemberSeq() throws Exception {
return sqlSession.selectOne("member.getSeq");
}
@Override
public int insertMember(MemberDto dto) throws Exception{
return sqlSession.insert("member.insertMember", dto);
}
@Override
public void uploadProfile(MemberDto dto) throws Exception {
sqlSession.insert("member.insertProfile", dto);
}
@Override
public MemberDto getMember(MemberDto dto) throws Exception {
return sqlSession.selectOne("member.getMember", dto);
}
@Override
public int updateMember(MemberDto dto) throws Exception{
return sqlSession.update("member.updateMember", dto);
}
}
<mapper namespace="member">
<select id="getSeq" resultType="int">
SELECT MEMBER_SEQ.NEXTVAL FROM DUAL
</select>
<insert id="insertMember" parameterType="memberDto">
INSERT INTO MEMBER
(
USER_NO
,USER_ID
,USER_PWD
,USER_NICK
,USER_AGE
,USER_GENDER
)
VALUES
(
#{userNo}
,#{userId}
,#{userPwd}
,#{userNick}
,#{userAge}
,#{userGender}
)
</insert>
<insert id="insertProfile" parameterType="memberDto">
INSERT INTO MEMBER_PROFILE
(
FILE_NO
,USER_NO
,CHANGE_NAME
)
VALUES
(
MEMBER_PROFILE_SEQ.NEXTVAL
,#{userNo}
,#{changeName}
)
</insert>
<select id="getMember" parameterType="memberDto" resultType="memberDto">
SELECT *
FROM MEMBER M
JOIN MEMBER_PROFILE P ON (M.USER_NO = P.USER_NO)
WHERE USER_ID = #{userId}
</select>
<update id="updateMember" parameterType="memberDto">
UPDATE MEMBER
SET
USER_NO = #{userNo}
<if test="userPwd != null and userPwd != ''">
,USER_PWD = #{userPwd}
</if>
<if test="userNick != null and userNick != ''">
,USER_NICK = #{userNick}
</if>
<if test="userAge != null and userAge != ''">
,USER_AGE = #{userAge}
</if>
<if test="userGender != null and userGender != ''">
,USER_GENDER = #{userGender}
</if>
WHERE USER_NO = #{userNo}
</update>
</mapper>
@Data
public class MemberDto {
private long userNo;
private String userId;
private String userPwd;
private String userNick;
private int userAge;
private String userGender;
private MultipartFile f;
private String changeName;
}
뷰
mypage.jsp
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<div id="div-main">
<h1>마이페이지</h1>
<form action = "" method = "post" enctype="multipart/form-data">
<input type = hidden name = "userNo" value="${loginUser.userNo}"/><br>
아이디 : <input type = "text" name = "userId" value="${loginUser.userId}" readonly="readonly"/><br>
비밀번호 : <input type = "password" name = "userPwd"/><br>
닉네임 : <input type = "text" name = "userNick" value="${loginUser.userNick}"/><br>
나이 : <input type = "number" min="0" name = "userAge" value="${loginUser.userAge}"/><br>
성별 :
<select name="userGender">
<c:if test="${loginUser.userGender eq 'm'}">
<option value="m" selected="selected">남자</option>
<option value="f">여자</option>
</c:if>
<c:if test="${loginUser.userGender ne 'm'}">
<option value="m">남자</option>
<option value="f" selected="selected">여자</option>
</c:if>
</select><br>
사진 : <input type = "file" name = "f" multiple="multiple" accept=".jpg, .png"/><br>
<img id="profileImg"><br><hr>
<div id="div-preview">
</div>
<input type = "submit" value ="수정하기"/>
</form>
</div>
</body>
login.jsp
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<div id="div-main">
<h1>로그인 페이지</h1>
<form action = "" method = "post">
아이디 : <input type = "text" name = "userId"/><br>
비밀번호 : <input type = "password" name = "userPwd"/><br>
<input type = "submit" value ="로그인"/>
</form>
<a href="join">회원가입</a>
</div>
</body>
DB
MEMBER
delete member;
drop table member;
CREATE TABLE MEMBER(
USER_NO NUMBER PRIMARY KEY
,USER_ID VARCHAR2(100)
,USER_PWD VARCHAR2(100)
,USER_NICK VARCHAR2(100)
,USER_AGE NUMBER
,USER_GENDER CHAR(1)
--,USER_PROFILE VARCHAR2(500)
);
DROP SEQUENCE MEMBER_SEQ;
CREATE SEQUENCE MEMBER_SEQ NOCACHE NOCYCLE;
COMMIT;
SELECT * FROM MEMBER;
SELECT MEMBER_SEQ.NEXTVAL FROM DUAL;
MEMBER_PROFILE
DROP TABLE MEMBER_PROFILE;
CREATE TABLE MEMBER_PROFILE(
FILE_NO NUMBER PRIMARY KEY
,USER_NO NUMBER
,CHANGE_NAME VARCHAR2(512)
,CONSTRAINT MEMBER_PROFILE_FK FOREIGN KEY(USER_NO) REFERENCES MEMBER(USER_NO) ON DELETE CASCADE
);
DROP SEQUENCE MEMBER_PROFILE_SEQ;
CREATE SEQUENCE MEMBER_PROFILE_SEQ NOCACHE NOCYCLE;
SELECT * FROM MEMBER_PROFILE;
에러 페이지
errorPage.jsp
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<h1>에러페이지~~</h1>
<h2 id="msg">${msg}</h2>
<script type="text/javascript">
alert(document.getElementById('msg').innerText); //메세지 띄우기
wiwdow.location.href = "${root}"; //홈화면으로 보내기
</script>
</body>
Author And Source
이 문제에 관하여(스프링22_프로필 업로드, 정보 수정, 경로 재설정, 암호화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@lecharl/스프링22
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<div id="div-main">
<h1>마이페이지</h1>
<form action = "" method = "post" enctype="multipart/form-data">
<input type = hidden name = "userNo" value="${loginUser.userNo}"/><br>
아이디 : <input type = "text" name = "userId" value="${loginUser.userId}" readonly="readonly"/><br>
비밀번호 : <input type = "password" name = "userPwd"/><br>
닉네임 : <input type = "text" name = "userNick" value="${loginUser.userNick}"/><br>
나이 : <input type = "number" min="0" name = "userAge" value="${loginUser.userAge}"/><br>
성별 :
<select name="userGender">
<c:if test="${loginUser.userGender eq 'm'}">
<option value="m" selected="selected">남자</option>
<option value="f">여자</option>
</c:if>
<c:if test="${loginUser.userGender ne 'm'}">
<option value="m">남자</option>
<option value="f" selected="selected">여자</option>
</c:if>
</select><br>
사진 : <input type = "file" name = "f" multiple="multiple" accept=".jpg, .png"/><br>
<img id="profileImg"><br><hr>
<div id="div-preview">
</div>
<input type = "submit" value ="수정하기"/>
</form>
</div>
</body>
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<div id="div-main">
<h1>로그인 페이지</h1>
<form action = "" method = "post">
아이디 : <input type = "text" name = "userId"/><br>
비밀번호 : <input type = "password" name = "userPwd"/><br>
<input type = "submit" value ="로그인"/>
</form>
<a href="join">회원가입</a>
</div>
</body>
MEMBER
delete member;
drop table member;
CREATE TABLE MEMBER(
USER_NO NUMBER PRIMARY KEY
,USER_ID VARCHAR2(100)
,USER_PWD VARCHAR2(100)
,USER_NICK VARCHAR2(100)
,USER_AGE NUMBER
,USER_GENDER CHAR(1)
--,USER_PROFILE VARCHAR2(500)
);
DROP SEQUENCE MEMBER_SEQ;
CREATE SEQUENCE MEMBER_SEQ NOCACHE NOCYCLE;
COMMIT;
SELECT * FROM MEMBER;
SELECT MEMBER_SEQ.NEXTVAL FROM DUAL;
MEMBER_PROFILE
DROP TABLE MEMBER_PROFILE;
CREATE TABLE MEMBER_PROFILE(
FILE_NO NUMBER PRIMARY KEY
,USER_NO NUMBER
,CHANGE_NAME VARCHAR2(512)
,CONSTRAINT MEMBER_PROFILE_FK FOREIGN KEY(USER_NO) REFERENCES MEMBER(USER_NO) ON DELETE CASCADE
);
DROP SEQUENCE MEMBER_PROFILE_SEQ;
CREATE SEQUENCE MEMBER_PROFILE_SEQ NOCACHE NOCYCLE;
SELECT * FROM MEMBER_PROFILE;
에러 페이지
errorPage.jsp
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<h1>에러페이지~~</h1>
<h2 id="msg">${msg}</h2>
<script type="text/javascript">
alert(document.getElementById('msg').innerText); //메세지 띄우기
wiwdow.location.href = "${root}"; //홈화면으로 보내기
</script>
</body>
Author And Source
이 문제에 관하여(스프링22_프로필 업로드, 정보 수정, 경로 재설정, 암호화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@lecharl/스프링22
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<h1>에러페이지~~</h1>
<h2 id="msg">${msg}</h2>
<script type="text/javascript">
alert(document.getElementById('msg').innerText); //메세지 띄우기
wiwdow.location.href = "${root}"; //홈화면으로 보내기
</script>
</body>
Author And Source
이 문제에 관하여(스프링22_프로필 업로드, 정보 수정, 경로 재설정, 암호화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lecharl/스프링22저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)