쌍용교육 -JSP수업 80일차 - ch08_SpringMVC(2)

2024. 6. 18. 17:47· 쌍용교육(JAVA)/Spring
목차
  1. 로그인처리
  2. kr.spring.ch07.controller => LoginController
  3. kr.spring.ch07.vo => LoginVO
  4. servlet-context.xml 내용추가
  5. views => login => form.jsp
  6. index.jsp
  7. kr.spring.ch07.validator => LoginValidator
  8. LoginController 내용추가
  9. validation.properties
  10. kr.spring.ch07.service => LoginService
  11. kr.spring.ch07.service => LoginCheckException
  12. servlet-context.xml 내용추가
  13. LoginController 내용추가
  14. form.jsp 에 한줄추가
  15. validation.properties 내용추가
  16. 로그인처리 끝
  17. porm.xml
  18. webapp => upload 
  19. kr.spring.ch08.vo => SubmitReportVO
  20. kr.spring.ch08.controller => SubmitReportController
  21. report => submitReportForm.jsp
  22. resources=>config=>file.properties
  23. SubmitReportController 내용추가
  24. kr.spring.ch08.validator => SubmitReportValidator
  25. SubmitReportController 내용추가
  26. report => submittedReport.jsp

ch05~ch06 작성해야됨.

 

로그인처리

kr.spring.ch07.controller => LoginController

package kr.spring.ch07.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

import kr.spring.ch07.vo.LoginVO;

@Controller
public class LoginController {

	//유효성 체크를 위한 자바빈 초기화 (유효성 체크를 자바스크립트로 하면 자바빈 초기화를 안해도됨)
	@ModelAttribute  //ModelAttribute에서 속성명을 지정하지않았기 때문에 LoginVO에서 자동으로 loginVO로 바뀐다.
	public LoginVO initCommand() { //command객체가 자바빈이라고 생각하면됨
		
		return new LoginVO();
	}
	
	//폼 호출
	@GetMapping("/login/login.do")
	public String form() {
		
		return "login/form";
	}
}

kr.spring.ch07.vo => LoginVO

package kr.spring.ch07.vo;

public class LoginVO {
	private String userId;
	private String password;
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "LoginVO [userId=" + userId + ", password=" + password + "]";
	}
	
}

servlet-context.xml 내용추가

<!-- 로그인하면서 유효성 체크를 동시에 하는법 -->	
	<!-- 로그인처리 -->
	<beans:bean class="kr.spring.ch07.controller.LoginController"/>

views => login => form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
<form:form action="login.do" modelAttribute="loginVO">
	아이디 : <form:input path="userId"/>
			<form:errors path="userId"/>
		   <br>
	비밀번호 : <form:input path="password"/>
			<form:errors path="password"/>
		   <br>
	<form:button>전송</form:button>
</form:form>
</body>
</html>

index.jsp

<a href="${pageContext.request.contextPath}/login/login.do">LoginController</a><br>

kr.spring.ch07.validator => LoginValidator

package kr.spring.ch07.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import kr.spring.ch07.vo.LoginVO;

public class LoginValidator implements Validator {

	@Override
	public boolean supports(Class<?> clazz) {
		
		return LoginVO.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors errors) {
		LoginVO vo = (LoginVO)target;
		if(vo.getUserId() == null || vo.getUserId().trim().isEmpty()) {
							//   필드		  에러코드
			errors.rejectValue("userId","required");
			
		}
		if(vo.getPassword() == null || vo.getPassword().trim().isEmpty()) {
							//   필드		  에러코드
			errors.rejectValue("password","required");

		}
		
		
	}

	
}

LoginController 내용추가

//폼에서 전송된 데이터 처리
	@PostMapping("login/login.do")
	public String submit(LoginVO loginVO, BindingResult result) {
		//유효성 체크
		new LoginValidator().validate(loginVO, result);
		//유효성 체크 결과 오류가 있으면 폼을 다시 호출
		if(result.hasErrors()) {
			return form(); //form()에서 login/form을 return 하기 떄문에 
		}
		//로그인 성공
		return "redirect:/index.jsp"; //리다이렉트 하는법
	}

전송을 눌렀을 떄 필수 항목입니다. 라는 required가 나왔기 때문에 유효성 검사가 잘된 것을 볼 수있다.

validation.properties

#rejectValue()를 사용할 경우 다음의 순서로 메시지 코드 생성(우선순위에 따라서 에러코드를 생성 및 사용)
#1) 에러코드 . 커멘드 객체 이름 . 필드명 	=> required.loginVO.userId 			=> (이렇게하면 가장먼저 호출된다.) 커멘트 객체는 자바빈을 말한다.
#2) 에러코드 . 필드명 				=> required.userId 					=> (두번째로 우선순위가 높은 것)
#3) 에러코드 . 필드타입 				=> required.java.lang.String 		=> (세번째 우선순위)
#4) 에러코드 						=> required 						=> (우선순위 최하위) 

#에러코드=에러문구
required=필수 항목입니다.
#2번 방법 에러코드.필드명
required.userId=사용자 아이디는 필수 항목입니다.
required.password=비밀번호는 필수 항목입니다.

기존과 같이 나오지않는다. 우선순위를 지정했기 때문에 기존 결과가 후순위로 밀린것.

kr.spring.ch07.service => LoginService

package kr.spring.ch07.service;

import kr.spring.ch07.vo.LoginVO;

public class LoginService {
	public void checkLogin(LoginVO vo)throws LoginCheckException{
		//테스트용으로 userId와 password가 일치하면 로그인 처리
		if(!vo.getUserId().equals(vo.getPassword())) {
			System.out.println("인증 에러 -" + vo.getUserId());
			throw new LoginCheckException();
		}
	}
}

kr.spring.ch07.service => LoginCheckException

package kr.spring.ch07.service;

public class LoginCheckException extends Exception{ //extends(상속)만 받으면된다.

}

servlet-context.xml 내용추가

<beans:bean class="kr.spring.ch07.service.LoginService"/>

LoginController 내용추가

package kr.spring.ch07.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import kr.spring.ch07.service.LoginService;
import kr.spring.ch07.validator.LoginValidator;
import kr.spring.ch07.vo.LoginVO;

@Controller
public class LoginController {
	@Autowired
	private LoginService loginService;
    
   .
   .
   .
   (생략)
   .
   .
   .
   //로그인 체크
		try {
			loginService.checkLogin(loginVO);
			//로그인 성공
			return "redirect:/index.jsp"; //리다이렉트 하는법
		}catch(LoginCheckException e) {
			//로그인 실패
			//메시지 처리			에러코드
			result.reject("invalidIdOrPassword");
			return form();
		}
		
	}
}

form.jsp 에 한줄추가

<form:errors/> <!-- field가 없는 에러메시지는 여기로 전달된다. -->

'아이디 또는 비밀번호가 불일치 합니다' 라는 에러가 이 <form:errors/>에 담긴것

줄바꿈이 안된 이유는 <span>태그가 생기기 때문에 <div>는 자동 줄바꿈이 되지만 <span>은 줄바꿈이 되지않는다.

<!-- 필드가 없는 에러메시지를 처리하기 위해서 명시 -->
	<form:errors element="div"/> <!-- field가 없는 에러메시지는 여기로 전달된다. -->

라고 바꿔주면 <span>이 아닌 <div> 태그로 바꾼다.

validation.properties 내용추가

#reject()를 사용할 경우 다음의 순서로 메시지 코드 생성
#1) 에러코드 . 커멘트 객체 이름 		=> (우선순위가 2번보다 높음)
#2) 에러코드

로그인처리 끝

porm.xml

<!-- 라이브러리 추가 시작 -->
		<dependency>
		    <groupId>javax.annotation</groupId>
		    <artifactId>javax.annotation-api</artifactId>
		    <version>1.3.2</version>
		</dependency>
		<dependency>
		    <groupId>org.aspectj</groupId>
		    <artifactId>aspectjweaver</artifactId>
			<version>1.8.9</version> 
		</dependency>
		<dependency> <!-- 추가한 부분 -->
		    <groupId>commons-fileupload</groupId>
		    <artifactId>commons-fileupload</artifactId>
			<version>1.3.2</version> 
		</dependency>
		<!-- 라이브러리 추가 끝 -->

webapp => upload 

kr.spring.ch08.vo => SubmitReportVO

package kr.spring.ch08.vo;

import org.springframework.web.multipart.MultipartFile;

public class SubmitReportVO {
	private String subject;
	private MultipartFile reportFile;
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public MultipartFile getReportFile() {
		return reportFile;
	}
	public void setReportFile(MultipartFile reportFile) {
		this.reportFile = reportFile;
	}
	@Override
	public String toString() {
		return "SubmitReportVO [subject=" + subject + ", reportFile=" + reportFile + "]";
	}
	
	
}

kr.spring.ch08.controller => SubmitReportController

package kr.spring.ch08.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

import kr.spring.ch08.vo.SubmitReportVO;

@Controller
public class SubmitReportController {
	//유효성 체크를 위한 자바빈 초기화
	@ModelAttribute("report")
	public SubmitReportVO initCommand() {
		return new SubmitReportVO();
	}
	//폼 호출
	@GetMapping("/report/submitReport.do")
	public String form() {
		return "report/submitReportForm";
	}
}

report => submitReportForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>리포트 등록 폼</title>
</head>
<body>
<form:form action="submitReport.do" enctype="multipart/form-data" modelAttribute="report">
	<ul>
		<li>
			<form:label path="subject">제목</form:label>
			<form:input path="subject"/>
			<form:errors path="subject"/>
		</li>
		<li>
			<form:label path="reportFile">리포트 파일</form:label>
			<input type="file" id="reportFile" name="reportFile">
			<form:errors path="reportFile"/>
		</li>
		<li>
			<form:button>리포트 전송</form:button>
		</li>
	</ul>
</form:form>
</body>
</html>

servlet-context.xml 내용추가

	<!-- 파일 업로드 -->	
	<beans:bean class="kr.spring.ch08.controller.SubmitReportController"/>

index.jsp 내용추가

<a href="${pageContext.request.contextPath}/report/submitReport.do">SubmitReportController</a><br>

servlet-context.xml 내용추가

<!-- multipartResolver 설정 -->
	<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="maxUploadSize" value="52428800"/><!-- 50M -->
		<beans:property name="defaultEncoding" value="UTF-8"/>
	</beans:bean>

resources=>config=>file.properties

upload파일을 오른쪽 클릭 후 Properties를 클릭해서 절대경로를 구한뒤 역슬레쉬를 슬레쉬로 바꿔준다.

file_path=C:/javaWork/workspace/ch08SpringMVC/src/main/webapp/upload

servlet-context.xml 내용추가

	<!-- 파일 업로드 경로가 명시된 설정 파일 지정 -->
	<context:property-placeholder location="classpath:config/file.properties"/>

classpath: 가 src컨테이너를 가르키도록 해야됨

SubmitReportController 내용추가

package kr.spring.ch08.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;

import kr.spring.ch08.vo.SubmitReportVO;

@Controller
public class SubmitReportController {
	
	//파일 업로드 경로 읽기
	@Value("${file_path}")
	private String path;
    
   .
   .
   .
   (생략)
   //폼에서 전송된 데이터 처리
	@PostMapping("/report/submitReport.do")
	public String submit(@ModelAttribute("report") SubmitReportVO vo, BindingResult result) {
		
		
		return "report/submittedReport";
	}
	
}

kr.spring.ch08.validator => SubmitReportValidator

package kr.spring.ch08.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import kr.spring.ch08.vo.SubmitReportVO;

public class SubmitReportValidator implements Validator{

	@Override
	public boolean supports(Class<?> clazz) {
		return SubmitReportVO.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors errors) {
		SubmitReportVO vo = (SubmitReportVO)target;
		if(vo.getSubject()== null || vo.getSubject().trim().isEmpty()) {
			
			errors.rejectValue("subject", "required");
		}
		if(vo.getReportFile()==null ||vo.getReportFile().isEmpty()) { //따로 공백이 없기 때문에 trim을 쓰지 않아도됨
			errors.rejectValue("reportFile","required");
		}
		
	}

}

SubmitReportController 내용추가

//폼에서 전송된 데이터 처리
	@PostMapping("/report/submitReport.do")
	public String submit(@ModelAttribute("report") SubmitReportVO vo, BindingResult result) throws IllegalStateException, IOException {
		
		//전송된 데이터 유효성 체크
		new SubmitReportValidator().validate(vo,result);
		//유효성 체크 결과 오류가 있으면 폼을 호출
		if(result.hasErrors()) {
			return form();
		}
		
		//정상적으로 파일이 업로드 되었을 경우
		File file = new File(path + "/" + vo.getReportFile().getOriginalFilename());
		//지정한 경로에 파일 저장
		vo.getReportFile().transferTo(file);
		
		System.out.println(vo);
		return "report/submittedReport";
	}

throws IllegalStateException, IOException 가 메서드 옆에 생성된다.

report => submittedReport.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>리포트 등록 완료</title>
</head>
<body>
리포트 <b>${report.subject}</b>를 등록했습니다.<br>
업로드한 파일: ${report.reportFile.originalFilename}<br>
용량 : ${report.reportFile.size}
</body>
</html>

유효성 문제없이 작동
upload를 새로고침하면 업로드한 파일이 등록이된다.

 

'쌍용교육(JAVA) > Spring' 카테고리의 다른 글

쌍용교육 -JSP수업 81일차 - ch09_SpringJDBC(1)  (0) 2024.06.19
쌍용교육 -JSP수업 81일차 - ch08_SpringMVC(3)  (0) 2024.06.19
쌍용교육 -JSP수업 79일차 - ch08_SpringMVC(1)  (0) 2024.06.17
쌍용교육 -JSP수업 79일차 - ch07_SpringDI(4)  (0) 2024.06.17
쌍용교육 -JSP수업 78일차 - ch07_SpringDI(3)  (0) 2024.06.14
  1. 로그인처리
  2. kr.spring.ch07.controller => LoginController
  3. kr.spring.ch07.vo => LoginVO
  4. servlet-context.xml 내용추가
  5. views => login => form.jsp
  6. index.jsp
  7. kr.spring.ch07.validator => LoginValidator
  8. LoginController 내용추가
  9. validation.properties
  10. kr.spring.ch07.service => LoginService
  11. kr.spring.ch07.service => LoginCheckException
  12. servlet-context.xml 내용추가
  13. LoginController 내용추가
  14. form.jsp 에 한줄추가
  15. validation.properties 내용추가
  16. 로그인처리 끝
  17. porm.xml
  18. webapp => upload 
  19. kr.spring.ch08.vo => SubmitReportVO
  20. kr.spring.ch08.controller => SubmitReportController
  21. report => submitReportForm.jsp
  22. resources=>config=>file.properties
  23. SubmitReportController 내용추가
  24. kr.spring.ch08.validator => SubmitReportValidator
  25. SubmitReportController 내용추가
  26. report => submittedReport.jsp
'쌍용교육(JAVA)/Spring' 카테고리의 다른 글
  • 쌍용교육 -JSP수업 81일차 - ch09_SpringJDBC(1)
  • 쌍용교육 -JSP수업 81일차 - ch08_SpringMVC(3)
  • 쌍용교육 -JSP수업 79일차 - ch08_SpringMVC(1)
  • 쌍용교육 -JSP수업 79일차 - ch07_SpringDI(4)
구 승
구 승
열심히 살아보기위해 만든 블로그입니다.
구 승
훌륭한 개발자가 되기위한 기록소
구 승
전체
오늘
어제
  • 분류 전체보기 (258)
    • 산엔지니어링 (1)
      • C# (0)
    • 쌍용교육(JAVA) (236)
      • JAVA (55)
      • SQL (18)
      • PL\SQL (7)
      • JDBC (12)
      • HTML (4)
      • CSS (13)
      • JavaScript (26)
      • jquery (11)
      • Bootstrap (4)
      • Servlet (4)
      • JSP (25)
      • MVC (23)
      • Spring (12)
      • SpringBoot (22)
    • 코딩테스트 공부 (9)
    • Do it! 자료구조와 함께 배우는 .. (2)
    • 정보처리기사 (1)
    • AWS (3)
    • UML (1)
    • Kafka (2)
    • 여러 이론들 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • JDBC
  • HTML
  • PL/SQL
  • java
  • SQL
  • CSS
  • JQuery
  • javascript

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
구 승
쌍용교육 -JSP수업 80일차 - ch08_SpringMVC(2)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.