일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- JDBC
- 문자열
- mysql
- React
- Java
- Board
- 상속
- MVC
- Thymeleaf
- Uipath
- string
- SpringBoot
- 배열
- 조건문
- db
- jquery
- Scanner
- Controller
- View
- jsp
- 이클립스
- rpa
- API
- html
- Eclipse
- spring
- git
- Database
- Oracle
- Array
- Today
- Total
유정잉
56일차 스프링 [ MVC - 어노테이션, 유효성, 인터셉터, DB 설정 ] 본문
10. 어노테이션 종류들
(@AssertTrue, @AssertFalse, @Max, @Min, @Size, @Null, @NotNull, @Digits, @Pattern
@NotEmpty, @NotBlank, @Positive, @PositiveOrZero, @Negative, @Email ... )
11. 유효성 (Validator C)
<validator 커스터마이징> : 1. Validator 인터페이스 구현 2. 컨트롤러에 인터페이스 등록
12. 인터셉터
: AOP요소를 적용한 스프링 MVC 요소 (관심을 가지고 있다가 요청이 들어오면 컨트롤러를 이용해 가로챌수있다)
13. DB 자바 설정 / DB xml 설정
[ MVC_Basic_20 - project ] - @어노테이션 종류들
@AssertTrue //true가 아닌 값이 들어오면 오류
private boolean num1;
@AssertFalse //false가 아닌 값이 들어오면 오류
private boolean num2;
@Max(200)
@Min(20)
private String num3;
@Null //값이 들어오면 오류
private String num4;
@NotNull //값이 들어오지 않으면 오류 // Null은 int이면 안 되기 때문에 String으로 설정
private String num5;
@Digits(integer = 3, fraction = 5) //정수는 3, 실수 2자릿수
private String num6;
@Size(min=2, max=10) //지정된 글자수보다 짧거나 길면 오류
private String num7;
@Pattern(regexp = "[a-zA-Z]*") //주어진 정규식에 위배되면 오류
private String num8;
//어노테이션 지정한 필드에 값 집어넣기
public Data() {
this.num1=true;
this.num2=false;
this.num3="10";
this.num4=null;
this.num5="spring";
this.num6="222.22";
this.num7="java";
//num8은 input type에서 작성
}
1) kt.bit.beans package에 Data.java class 생성 후 어노테이션 지정
package kr.bit.beans;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
public class Data {
@AssertTrue //true가 아닌 값이 들어오면 오류
private boolean num1;
@AssertFalse //false가 아닌 값이 들어오면 오류
private boolean num2;
@Max(200)
@Min(20)
private String num3;
@Null //값이 들어오면 오류
private String num4;
@NotNull //값이 들어오지 않으면 오류 // Null은 int이면 안 되기 때문에 String으로 설정
private String num5;
@Digits(integer = 3, fraction = 5) //정수는 3, 실수 2자릿수
private String num6;
@Size(min=2, max=10) //지정된 글자수보다 짧거나 길면 오류
private String num7;
@Pattern(regexp = "[a-zA-Z]*") //주어진 정규식에 위배되면 오류
private String num8;
public Data() { //값 집어넣기
this.num1=true;
this.num2=false;
this.num3="10";
this.num4=null;
this.num5="spring";
this.num6="222.22";
this.num7="java";
//num8은 input type에서 작성
}
public boolean isNum1() {
return num1;
}
public void setNum1(boolean num1) {
this.num1 = num1;
}
public boolean isNum2() {
return num2;
}
public void setNum2(boolean num2) {
this.num2 = num2;
}
public String getNum3() {
return num3;
}
public void setNum3(String num3) {
this.num3 = num3;
}
public String getNum4() {
return num4;
}
public void setNum4(String num4) {
this.num4 = num4;
}
public String getNum5() {
return num5;
}
public void setNum5(String num5) {
this.num5 = num5;
}
public String getNum6() {
return num6;
}
public void setNum6(String num6) {
this.num6 = num6;
}
public String getNum7() {
return num7;
}
public void setNum7(String num7) {
this.num7 = num7;
}
public String getNum8() {
return num8;
}
public void setNum8(String num8) {
this.num8 = num8;
}
}
2) views 폴더 안에 index.jsp, test1.jsp. test2.jsp
[ index.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<body>
<a href="t1">test1</a><br>
</body>
</html>
[ test1.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<body>
<form:form modelAttribute="data" method="post" action="test_proc">
num1 : <form:radiobutton path="num1" value='true'/>true
<form:radiobutton path="num1" value='false'/>false<br>
<form:errors path="num1"/><br>
num2 : <form:radiobutton path="num2" value='true'/>true
<form:radiobutton path="num2" value='false'/>false<br>
<form:errors path="num2"/><br>
num3 : <form:input path="num3" type='text'/><br>
<form:errors path="num3"/><br>
num4 : <form:checkbox path="num4" value="check1"/>check1<br>
<form:errors path="num4"/><br>
num5 : <form:checkbox path="num5" value="check2"/>check2<br>
<form:errors path="num5"/><br>
num6 : <form:input path="num6" type='text'/><br>
<form:errors path="num6"/><br>
num7 : <form:input path="num7" type='text'/><br>
<form:errors path="num7"/><br>
num8 : <form:input path="num8" type='text'/><br>
<form:errors path="num8"/><br>
<form:button type="submit">체크</form:button>
</form:form>
</body>
</html>
[ test2.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>success</h1>
</body>
</html>
3) kr.bit.controller package 안에 SpringController.java class 에서
package kr.bit.controller;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import kr.bit.beans.Data;
//properties -> 실행 중 절대 변하지 않는 값들을 properties 파일 안에 넣어줘야 함
//ex) 유효성 검사, DB정보 (=유효성검사를 properties안에 싹다 넣어 줌)
@Controller
public class SpringController {
@GetMapping("/t1")
public String t1(Data data) {
return "test1";
}
@PostMapping("/test_proc") //입력한 값 유효성 검사 -> 유효성 검사에 대한 결과값
public String test_proc(@Valid Data data, BindingResult result) {
if(result.hasErrors()) {
return "test1";
}
return "test2";
}
}
4) properties 폴더 안에 error.properties File 생성해서 오류 메세지 작성 하고
kr.bit.config package안에 ServletAppContext.java 파일에 error파일 등록
[ error.properties 파일 ]
#ture여야 하는데 아니여서 이렇게 오류 메세지가 발생하게 만드는 것 !
AssertTrue.data.num1=num1은 true가 아니다
AssertTrue.data.num2=num2은 flase가 아니다
Max.data.num3=num3는 200이하여야 한다
Min.data.num3=num3는 20이상이여야 한다
Null.data.num4=num4는 값이 주입되면 안 된다
NotNull.data.num5=num5는 값이 주입되어야 한다
Digits.data.num6=num6는 정수 3자리, 실수 2자리이여야 한다
Size.data.num7=num7은 2자리~10자리까지 가능하다
Pattern.data.num8=정규식에 위배된다
package kr.bit.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@ComponentScan("kr.bit.beans")
public class ServletAppContext implements WebMvcConfigurer{
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
WebMvcConfigurer.super.configureViewResolvers(registry);
registry.jsp("/WEB-INF/views/",".jsp");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
WebMvcConfigurer.super.addResourceHandlers(registry);
registry.addResourceHandler("/**").addResourceLocations("/resources/");
}
//Properties파일을 jsp 화면에 가져가지 위해 등록해야함
@Bean
public ReloadableResourceBundleMessageSource source() {
ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
//하나일 경우는 res.setBasename을 사용 / 복수는 names !
res.setBasename("/WEB-INF/properties/error"); //확장자 빼고 파일명만 적으면 됨
res.setDefaultEncoding("UTF-8");
return res;
}
}
[ MVC_Basic_21 - project ] - @어노테이션 종류들
@NotEmpty //값이 길이가 0이면(=비어있으면) 오류 발생(공백도 글자로 인식)
private String num1;
@NotBlank //공백제거하고 길이가 0이면 오류 발생
private String num2;
@Positive //양수 아니면 오류 발생
private int num3;
@PositiveOrZero //양수 또는 0 아니면 오류 발생
private int num4;
@Negative //음수 아니면 오류 발생
private int num5;
@Email //Email양식 맞아야 함 (@들어가야됨)
private String num6;
public Data() {
this.num1="aa";
this.num2="aa";
this.num3=40;
this.num4=40;
this.num5=3;
}
1) kt.bit.beans package에 Data.java class 생성 후 어노테이션 지정
package kr.bit.beans;
import javax.validation.constraints.Email;
import javax.validation.constraints.Negative;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Positive;
import javax.validation.constraints.PositiveOrZero;
public class Data {
@NotEmpty //값이 길이가 0이면(=비어있으면) 오류 발생(공백도 글자로 인식)
private String num1;
@NotBlank //공백제거하고 길이가 0이면 오류 발생
private String num2;
@Positive //양수 아니면 오류 발생
private int num3;
@PositiveOrZero //양수 또는 0 아니면 오류 발생
private int num4;
@Negative //음수 아니면 오류 발생
private int num5;
@Email //Email양식 맞아야 함 (@들어가야됨)
private String num6;
public Data() {
this.num1="aa";
this.num2="aa";
this.num3=40;
this.num4=40;
this.num5=3;
}
public String getNum1() {
return num1;
}
public void setNum1(String num1) {
this.num1 = num1;
}
public String getNum2() {
return num2;
}
public void setNum2(String num2) {
this.num2 = num2;
}
public int getNum3() {
return num3;
}
public void setNum3(int num3) {
this.num3 = num3;
}
public int getNum4() {
return num4;
}
public void setNum4(int num4) {
this.num4 = num4;
}
public int getNum5() {
return num5;
}
public void setNum5(int num5) {
this.num5 = num5;
}
public String getNum6() {
return num6;
}
public void setNum6(String num6) {
this.num6 = num6;
}
}
2) views 폴더 안에 index.jsp, test1.jsp. test2.jsp
[ index.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<body>
<a href="t1">test1</a><br>
</body>
</html>
[ test1.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<body>
<form:form modelAttribute="data" method="post" action="test_proc">
num1 : <form:input path="num1" type='text'/><br>
<form:errors path="num1"/><br>
num2 : <form:input path="num2" type='text'/><br>
<form:errors path="num2"/><br>
num3 : <form:input path="num3" type='text'/><br>
<form:errors path="num3"/><br>
num4 : <form:input path="num4" type='text'/><br>
<form:errors path="num4"/><br>
num5 : <form:input path="num5" type='text'/><br>
<form:errors path="num5"/><br>
num6 : <form:input path="num6" type='text'/><br>
<form:errors path="num6"/><br>
<form:button type="submit">체크</form:button>
</form:form>
</body>
</html>
[ test2.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>success</h1>
</body>
</html>
3) kr.bit.controller package 안에 SpringController.java class 에서
package kr.bit.controller;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import kr.bit.beans.Data;
//properties -> 실행 중 절대 변하지 않는 값들을 properties 파일 안에 넣어줘야 함
//ex) 유효성 검사, DB정보 (=유효성검사를 properties안에 싹다 넣어 줌)
@Controller
public class SpringController {
@GetMapping("/t1")
public String t1(Data data) {
return "test1";
}
@PostMapping("/test_proc") //입력한 값 유효성 검사 -> 유효성 검사에 대한 결과값
public String test_proc(@Valid Data data, BindingResult result) {
if(result.hasErrors()) {
return "test1";
}
return "test2";
}
}
4) properties 폴더 안에 error.properties File 생성해서 오류 메세지 작성 하고
kr.bit.config package안에 ServletAppContext.java 파일에 error파일 등록
[ error.properties 파일 ]
NotEmpty.data.num1=길이는 0보다 커야한다
NotBlank.data.num2=길이는 공백제거하고 0보다 커야한다
Positive.data.num3=양수만 허용한다
PositiveOrZero.data.num4=0 또는 양수만 허용한다
Negative.data.num5=음수만 허용한다
Email.data.num6=이메일 형식이여야한다
package kr.bit.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@ComponentScan("kr.bit.beans")
public class ServletAppContext implements WebMvcConfigurer{
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
WebMvcConfigurer.super.configureViewResolvers(registry);
registry.jsp("/WEB-INF/views/",".jsp");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
WebMvcConfigurer.super.addResourceHandlers(registry);
registry.addResourceHandler("/**").addResourceLocations("/resources/");
}
//Properties파일을 jsp 화면에 가져가지 위해 등록해야함
@Bean
public ReloadableResourceBundleMessageSource source() {
ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
//하나일 경우는 res.setBasename을 사용 / 복수는 names !
res.setBasename("/WEB-INF/properties/error"); //확장자 빼고 파일명만 적으면 됨
res.setDefaultEncoding("UTF-8");
return res;
}
}
[ MVC_Basic_22 - project ] - Validator 유효성 검사
1) kt.bit.validator package에 DataValidator.java class 생성 후 1. Validator 인터페이스 구현
<validator 커스터마이징> 1. Validator 인터페이스 구현 2. 컨트롤러에 인터페이스 등록
@어노테이션으로 지정하기 힘든 오류 같은 경우 이런 방식으로 에러를 정의 함
//<validator 커스터마이징>
//1. Validator 인터페이스 구현
//2. 컨트롤러에 인터페이스 등록
public class DataValidator implements Validator { //1. Validator 인터페이스 구현
@Override
public boolean supports(Class<?> clazz) {
// 유효성 검사할 데이터를 가지고 있는 객체가 유효성 검사가 가능한지 확인 (확인가능하면 true 아니면 false)
return false;
}
@Override
public void validate(Object target, Errors errors) {
// 유효성 검사하는 메서드
}
}
package kr.bit.validator;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import kr.bit.beans.Data;
//<validator 커스터마이징>
//2. 컨트롤러에 인터페이스 등록
//1. Validator인터페이스 구현
public class DataValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
//유효성 검사할 데이터를 가지고 있는 객체가 유효성 검사가 가능한지 확인
return Data.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
//유효성 검사하는 메서드
ValidationUtils.rejectIfEmpty(errors, "num2", "error2"); //num2가 empty면 에러이름은 error2로 함
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "num3", "error3");
Data d=(Data)target;
String str1=d.getNum2();
String str2=d.getNum3();
if(str1.length()>5) {
errors.rejectValue("num2", "error4"); //num2길이가 5자리 넘어가면 error4라는 이름으로 에러 정의
}
if(str2.contains("-")==false) {
errors.rejectValue("num3", "error5");
}
}
}
2) kt.bit.beans package에 Data.java class 생성 후 어노테이션 지정
package kr.bit.beans;
import javax.validation.constraints.Size;
public class Data {
@Size(min = 4, max = 10)
private String num1;
private String num2;
private String num3;
public String getNum1() {
return num1;
}
public void setNum1(String num1) {
this.num1 = num1;
}
public String getNum2() {
return num2;
}
public void setNum2(String num2) {
this.num2 = num2;
}
public String getNum3() {
return num3;
}
public void setNum3(String num3) {
this.num3 = num3;
}
}
3) views 폴더 안에 index.jsp, test1.jsp. test2.jsp
[ index.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<body>
<a href="t1">test1</a><br>
</body>
</html>
[ test1.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<body>
<form:form modelAttribute="data" method="post" action="test_proc">
num1 : <form:input path="num1" type='test'/><br>
<form:errors path="num1"/><br>
num2 : <form:input path="num2" type='text'/><br>
<form:errors path="num2"/><br>
num3 : <form:input path="num3" type='text'/><br>
<form:errors path="num3"/><br>
<form:button type="submit">체크</form:button>
</form:form>
</body>
</html>
[ test2.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>success</h1>
</body>
</html>
4) kr.bit.controller package 안에 SpringController.java class 에서
2. 컨트롤러에 인터페이스 등록 작업
package kr.bit.controller;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PostMapping;
import kr.bit.beans.Data;
import kr.bit.validator.DataValidator;
@Controller
public class SpringController {
@GetMapping("/t1")
public String t1(Data data) {
return "test1";
}
@PostMapping("/test_proc")
public String test_proc(@Valid Data data, BindingResult result) {
if(result.hasErrors()) {
return "test1";
}
return "test2";
}
@InitBinder
public void initBinder(WebDataBinder binder) { //2. 컨트롤러에 인터페이스 등록
DataValidator validator = new DataValidator();
//binder.setValidator(validator);
binder.addValidators(validator);
}
}
5) properties 폴더 안에 error.properties File 생성해서 오류 메세지 작성 하고
[ error.properties 파일 ]
Size.data.num1=4~10글자여야 한다
error2.data.num2=길이가 0보다 커야한다
error4.data.num2=길이가 5글자 넘어가면 안 된다
error3.data.num3=공백제거하고 0보다 커야한다
error5.data.num3=num3은 "-"기호를 포함해야 한다
[ MVC_Basic_23 - project ] - 인터셉터 interceptor
1) kt.bit.beans package에 Data.java class 생성 후 어노테이션 지정
3) kr.bit.controller package 안에 SpringController.java class 에서
1) kt.bit.interceptor package에 Inter1.java class 생성 후
implements HandlerInterceptor (여기서 요청 발생 시 호출되는 메서드 코드가 중복되는 부분이 있을 때 인터셉터를 통해 처리한다)
Inter1~8까지 생성 숫자만 바뀌게 내용은 똑같음 !
package kr.bit.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class Inter1 implements HandlerInterceptor{
//요청 발생 시 호출되는 메서드 코드가 중복되는 부분이 있을 때 인터셉터를 통해 처리한다
//로그인 여부 확인, 등급별 서비스 권한, 관리자/회원 작업처리에서 많이 사용
//controller 메서드가 호출되기 전에 호출 됨
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("pre-inter1");
return true;
}
//controller 메서드가 호출된 이후에 호출됨(view 처리 수행 전에 호출 됨)
public void postHandle (HttpServletRequest request, HttpServletResponse reponse, Object handler,
ModelAndView modelAndVie) throws Exception {
System.out.println("post-inter1");
}
//view 처리 끝나고 응답 결과가 브라우저로 전달되기 전에 호출 됨
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion-inter1");
}
}
package kr.bit.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class Inter2 implements HandlerInterceptor{
//요청 발생 시 호출되는 메서드 코드가 중복되는 부분이 있을 때 인터셉터를 통해 처리한다
//로그인 여부 확인, 등급별 서비스 권한, 관리자/회원 작업처리에서 많이 사용
//controller 메서드가 호출되기 전에 호출 됨
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("pre-inter2");
return true;
}
//controller 메서드가 호출된 이후에 호출됨(view 처리 수행 전에 호출 됨)
public void postHandle (HttpServletRequest request, HttpServletResponse reponse, Object handler,
ModelAndView modelAndVie) throws Exception {
System.out.println("post-inter2");
}
//view 처리 끝나고 응답 결과가 브라우저로 전달되기 전에 호출 됨
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion-inter2");
}
}
2) kr.bit.config package 안에 ServletAppContext.java에 인터셉터 등록 !
//인터셉터 등록 - 경로와 인터셉터를 설정하기 위해
public void addInterceptors(InterceptorRegistry reg) {
WebMvcConfigurer.super.addInterceptors(reg);
Inter1 i1 = new Inter1();
InterceptorRegistration r1 = reg.addInterceptor(i1);
r1.addPathPatterns("/t1");
}
package kr.bit.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import kr.bit.interceptor.Inter1;
import kr.bit.interceptor.Inter2;
import kr.bit.interceptor.Inter3;
import kr.bit.interceptor.Inter4;
import kr.bit.interceptor.Inter5;
import kr.bit.interceptor.Inter6;
import kr.bit.interceptor.Inter7;
import kr.bit.interceptor.Inter8;
@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
public class ServletAppContext implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
WebMvcConfigurer.super.configureViewResolvers(registry);
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
WebMvcConfigurer.super.addResourceHandlers(registry);
registry.addResourceHandler("/**").addResourceLocations("/resources/");
}
@Bean(name = "messageSource")
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
res.setBasename("/WEB-INF/properties/error");
return res;
}
//인터셉터 등록 - 경로와 인터셉터를 설정하기 위해
public void addInterceptors(InterceptorRegistry reg) {
WebMvcConfigurer.super.addInterceptors(reg);
Inter1 i1 = new Inter1();
Inter2 i2 = new Inter2();
Inter3 i3 = new Inter3();
Inter4 i4 = new Inter4();
Inter5 i5 = new Inter5();
Inter6 i6 = new Inter6();
Inter7 i7 = new Inter7();
Inter8 i8 = new Inter8();
InterceptorRegistration r1 = reg.addInterceptor(i1);
InterceptorRegistration r2 = reg.addInterceptor(i2);
InterceptorRegistration r3 = reg.addInterceptor(i3);
InterceptorRegistration r4 = reg.addInterceptor(i4);
InterceptorRegistration r5 = reg.addInterceptor(i5);
InterceptorRegistration r6 = reg.addInterceptor(i6);
InterceptorRegistration r7 = reg.addInterceptor(i7);
InterceptorRegistration r8 = reg.addInterceptor(i8);
r1.addPathPatterns("/t1"); //클릭을안하고(=Controller를 안누르면) 서버를 실행한 시켰을때는 매핑이 되지 않아 콘솔창에 뜨지 않음 (=위빙?)
r2.addPathPatterns("/t1"); //interceptor가 가로채 갈 주소를 등록
r3.addPathPatterns("/t2");
r4.addPathPatterns("/t1");
r4.addPathPatterns("/t2");
r4.addPathPatterns("/t1","/t2"); //이런식으로 2개를 한번에 걸어줄 수도 있음
}
}
혹은
package kr.bit.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import kr.bit.interceptor.Inter1;
import kr.bit.interceptor.Inter2;
import kr.bit.interceptor.Inter3;
import kr.bit.interceptor.Inter4;
import kr.bit.interceptor.Inter5;
import kr.bit.interceptor.Inter6;
import kr.bit.interceptor.Inter7;
import kr.bit.interceptor.Inter8;
@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
public class ServletAppContext implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
WebMvcConfigurer.super.configureViewResolvers(registry);
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
WebMvcConfigurer.super.addResourceHandlers(registry);
registry.addResourceHandler("/**").addResourceLocations("/resources/");
}
@Bean(name = "messageSource")
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
res.setBasename("/WEB-INF/properties/error");
return res;
}
//인터셉터 등록 - 경로와 인터셉터를 설정하기 위해
public void addInterceptors(InterceptorRegistry reg) {
WebMvcConfigurer.super.addInterceptors(reg);
Inter1 i1 = new Inter1();
Inter2 i2 = new Inter2();
Inter3 i3 = new Inter3();
Inter4 i4 = new Inter4();
Inter5 i5 = new Inter5();
Inter6 i6 = new Inter6();
Inter7 i7 = new Inter7();
Inter8 i8 = new Inter8();
InterceptorRegistration r1 = reg.addInterceptor(i1);
InterceptorRegistration r2 = reg.addInterceptor(i2);
InterceptorRegistration r3 = reg.addInterceptor(i3);
InterceptorRegistration r4 = reg.addInterceptor(i4);
InterceptorRegistration r5 = reg.addInterceptor(i5);
InterceptorRegistration r6 = reg.addInterceptor(i6);
InterceptorRegistration r7 = reg.addInterceptor(i7);
InterceptorRegistration r8 = reg.addInterceptor(i8);
r1.addPathPatterns("/t1"); //클릭을안하고(=Controller를 안누르면) 서버를 실행한 시켰을때는 매핑이 되지 않아 콘솔창에 뜨지 않음 (=위빙?)
r2.addPathPatterns("/t1"); //interceptor가 가로채 갈 주소를 등록
r3.addPathPatterns("/t2");
r4.addPathPatterns("/t1","/t2"); //이런식으로 2개를 한번에 걸어줄 수도 있음
r5.addPathPatterns("/s1/t3" , "/s1/t4");
r6.addPathPatterns("/*");
r7.addPathPatterns("/s1/*");
r8.addPathPatterns("/**");
r8.addPathPatterns("/*"); //interceptor가 가로채가지 않을 주소를 등록
}
}
3) views 폴더 안에 index.jsp, test1.jsp, test2.jsp, test3.jsp, test4.jsp
[ index.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href='t1'>test1</a>
<a href='t2'>test2</a>
<a href='s1/t3'>s1/test3</a>
<a href='s1/t4'>s1/test4</a>
</body>
</html>
test1.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<body>
<h1>test1</h1>
</body>
</html>
[ MVC_Basic_24- project ] - DB 자바 설정
1) MySQL table 생성
create table mvc_table(
num1 varchar(100) not null,
num2 varchar(100) not null,
num3 varchar(100) not null);
desc mvc_table;
SET SQL_SAFE_UPDATES = 0;
2) pom.xml에서 DB연결 관련 라이브러리 확인
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>MVC_Basic_01</groupId>
<artifactId>MVC_Basic_01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
<!-- 라이브러리 버전관리 -->
<properties>
<javax.servlet-version>4.0.1</javax.servlet-version>
<javax.servlet.jsp-version>2.3.3</javax.servlet.jsp-version>
<javax.servlet.jsp.jstl-version>1.2</javax.servlet.jsp.jstl-version>
<org.springframework-version>5.2.2.RELEASE</org.springframework-version>
<!-- <org.springframework-version>4.3.25.RELEASE</org.springframework-version> -->
</properties>
<!-- 라이브러리 셋팅 -->
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet-version}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>${javax.servlet.jsp-version}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${javax.servlet.jsp.jstl-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
</dependencies>
</project>
3) WEB-INF -> lib 폴더에 mysql-connector-j-8.2.0 파일 넣어주기 (혹은 라이브러리에 그냥 설정해도 됨 ! 지금은 파일로 넣어줌)
4) views 폴더 안에 index.jsp, input_test.jsp, read_test.jsp 파일 생성
[ index.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<body>
<a href='input_test'>input_test</a><br>
<a href='read_test'>read_test</a><br>
</body>
</html>
[ input_test.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<body>
<form action="input_proc" method="post">
num1 : <input type="text" name="num1"><br> <!-- num1,2,3에 입력한 값을 Data 클래스 필드에 넣기 -->
num2 : <input type="text" name="num2"><br> <!-- 위에 작업은 SpringController.java에 @PostMapping("/input_proc") 작업 임 -->
num3 : <input type="text" name="num3"><br>
<button type="submit">확인</button>
</form>
</body>
</html>
[ input_proc.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<body>
<h2>저장 끝 !!!</h2>
</body>
</html>
[ read_test.jsp JSP 파일 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<body>
<c:forEach var="obj" items="${li }">
${obj.num1 } <br>
${obj.num2 } <br>
${obj.num3 } <br>
</c:forEach>
</body>
</html>
5) kt.bit.beans package에 Data.java class 생성 후 MySQL에서 생성한 table에 맞는 필드 생성(varchar는 String)
package kr.bit.beans;
public class Data {
private String num1;
private String num2;
private String num3;
public String getNum1() {
return num1;
}
public void setNum1(String num1) {
this.num1 = num1;
}
public String getNum2() {
return num2;
}
public void setNum2(String num2) {
this.num2 = num2;
}
public String getNum3() {
return num3;
}
public void setNum3(String num3) {
this.num3 = num3;
}
}
6) WEB-INF에 properties 폴더 생성 후 db.properties File 생성 -> DB연결 작업에 필요한 내용 적어주기
[ db.properties 파일 ]
db.classname=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/yujung
db.username=root
db.password=00000000
7) kr.bit.config package 안에 ServletAppContext.java에 @PropertySource("/WEB-INF/properties/db.propertise") 추가
@Value("${db.classname(+url, username, password}")
private String db_classname; 추가
그리고 @Bean 등록 (BasicDataSource, SqlSessionFactory, MapperFactoryBean)
@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer {
@Value("${db.classname}")
private String db_classname;
@Value("${db.url}")
private String db_url;
@Value("${db.username}")
private String db_username;
@Value("${db.password}")
private String db_password;
package kr.bit.config;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import kr.bit.database.MapperInterface;
@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer {
@Value("${db.classname}")
private String db_classname;
@Value("${db.url}")
private String db_url;
@Value("${db.username}")
private String db_username;
@Value("${db.password}")
private String db_password;
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
WebMvcConfigurer.super.configureViewResolvers(registry);
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
WebMvcConfigurer.super.addResourceHandlers(registry);
registry.addResourceHandler("/**").addResourceLocations("/resources/");
}
@Bean
public BasicDataSource dataSource() {
BasicDataSource source= new BasicDataSource();
source.setDriverClassName(db_classname);
source.setUrl(db_url);
source.setUsername(db_username);
source.setPassword(db_password);
return source;
}
@Bean
public SqlSessionFactory factory(BasicDataSource source) throws Exception{
SqlSessionFactoryBean fac=new SqlSessionFactoryBean();
fac.setDataSource(source);
SqlSessionFactory factory=fac.getObject();
return factory;
}
@Bean
public MapperFactoryBean<MapperInterface> test_mapper(SqlSessionFactory factory) throws Exception{
MapperFactoryBean<MapperInterface> fac =
new MapperFactoryBean<MapperInterface>(MapperInterface.class);
fac.setSqlSessionFactory(factory);
return fac;
}
/*@Bean(name = "messageSource")
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
res.setBasename("/WEB-INF/properties/error");
return res;
}*/
}
8) kr.bit.database package 생성 후 MapperInterface.java Interface 파일 생성 후 쿼리문 등록
package kr.bit.database;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import kr.bit.beans.Data;
public interface MapperInterface {
@Insert("insert into mvc_table(num1,num2,num3) values (#{num1},#{num2},#{num3})")
public void insert_data(Data data);
@Select("select num1, num2, num3 from mvc_table")
List<Data> select_data();
}
9) kr.bit.controller package 안에 SpringController.java class 에서 경로 매핑
package kr.bit.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import kr.bit.beans.Data;
import kr.bit.database.MapperInterface;
@Controller
public class SpringController {
@Autowired //MapperInterface에서 만든 함수(=insert_data...) 사용하려고 자동 주입받는 작업
MapperInterface mapper;
@GetMapping("/input_test")
public String input_test() {
return "input_test";
}
@PostMapping("/input_proc")
public String input_proc(Data data) {
mapper.insert_data(data); //DB에 저장
return "input_proc";
}
@GetMapping("/read_test")
public String read_test(Model model) {
List<Data> li = mapper.select_data();
model.addAttribute("li",li);
return "read_test";
}
}
'네이버 클라우드 부트캠프 > 복습 정리' 카테고리의 다른 글
61~64일차 스프링 [ xml로 Board 만들기 ] (0) | 2024.05.20 |
---|---|
57일차 스프링 [ MVC - restcontroller, mybatis ] [ Board ] (2) | 2024.05.13 |
55일차 스프링 [ MVC - session, properties, 유효성검사 ] (2) | 2024.05.09 |
54일차 스프링 [ MVC - 추출, 주입, form taglib ] (1) | 2024.05.08 |
53일차 스프링 [ MVC ] (0) | 2024.05.07 |