Spring 복습 MVC에 대해서...

충찌·2022년 1월 8일
0

Spring-remind

목록 보기
4/4
post-thumbnail

Spring MVC

Spring MVC 흐름

Spring MVC 파일구성

Spring MVC 프로젝트 관리도구 MAVEN

:필요한 라이브러리를 pom.xml에 정의해 놓으면 해당 라이브러리가 작동하는데에 필요한 다른 라이브러리들까지 관리하여 NW를 통해서 자동으로 다운

MVC 구현 예시

HomeController.java

package com.oracle.mvc02;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HomeController {
	//해당 컨트롤러의 메소드 실행시 콘솔에 정보 나타냄 
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		logger.info("Welcome home! The client locale is {}.", locale);
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		return "home";
	}
}    

home.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>

web.xml

<!-- 한글처리 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>		
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

결과

logger.info() 값▼
INFO : com.oracle.mvc02.HomeController - Welcome home! The client locale is ko_KR.

Model vs ModelAndView

1. Model

: 파라미터 방식으로 메소드에 넣어주고 String 형태로 리턴
: 값을 넣을 때 addAttribute()사용

<HomeController.java>

@RequestMapping("/board/content")
	public String content(Model model) {
		System.out.println("content controller sysout board/content");
		
		model.addAttribute("id", 30);
		return "board/content";
	}

<content.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>
content.jsp입니다.<br />
id:${id}
</body>
</html>

<결과>

2. ModelAndView

: 컴포넌트 방식으로 ModelAndView객체를 생성해서 객체형태로 리턴
: 값을 넣을 때 addObject()사용
: setViewName()으로 보낼 곳 View를 세팅

<HomeController.java>

@RequestMapping("/board/reply")
	public ModelAndView reply() {
		
		ModelAndView mv = new ModelAndView();
		mv.addObject("id", 30);
		mv.setViewName("board/reply");
		
		return mv;
	}

<reply.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>
reply.jsp입니다.<br/>
id:${id}
</body>
</html>

<결과>

✸ 기억하기 ✸

src/main/java 폴더에서 새로운 패키지(com.oracle.mvckkk) 생성하여 controller를 만들면 해당 controller 작동 시 오류가 발생한다.

--> servlet-context.xml에는 legacy 파일 기본패키지만 작동하게 쓰여있다.
<context:component-scan base-package="com.oracle.mvc02" />

',' 를 이용해 새로운 패키지명을 같이 적어줘도 되지만 많이 쓰이지 않는 방식이다.


Controller 패턴

파라미터 값 받기

<HomeController.java>

@RequestMapping("board/confirmId")
	public String confirmId(HttpServletRequest request, Model model) {
		System.out.println("Controller confirmId start...");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		System.out.println("Controller confirmId id->"+id);
		System.out.println("Controller confirmId pw->"+pw);
		
		model.addAttribute("id", id);
		model.addAttribute("pw", pw);
		
		return "board/confirmId";
	}

<confirmId.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>confirmId</h1>
ID : ${id}<br/>
PW : ${pw}
</body>
</html>

<결과>
url에 파라미터값을 지정해주지 않으면 confirmId.jsp가 나타나지만 값은 null로 넘어온다.
파라미터값 넘겨주기▼

파라미터 값 받기(@RequestParam())

<HomeController.java>

@RequestMapping("board/checkId")
	public String checkId(@RequestParam("id") String idd, @RequestParam("pw") String pswd, Model model) {
		System.out.println("Controller checkId id->"+idd);
		System.out.println("Controller checkId pw->"+pswd);
		
		model.addAttribute("identify", idd);
		model.addAttribute("password", pswd);
		
		return "board/checkId";
	}

<checkId.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>
ID : ${identify }<br>
PW : ${password }
</body>
</html>

<결과>
@RequestParam을 사용하면 위와 다르게 url에 파라미터값을 지정해주지 않으면 400오류가 발생한다.
파라미터값 넘겨주기▼

DTO에 값 저장 후 가져오기

<Member.java>

package com.oracle.mvc03.dto;

public class Member {
	private String name;
	private String id;
	private String pw;
	private String email;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}

}

<HomeController.java>

@RequestMapping("member/join")
	public String joinData(@RequestParam("name") String name, @RequestParam("id") String id, 
							@RequestParam("pw") String pw, @RequestParam("email") String email, Model model ) {
		Member member = new Member();
		member.setName(name);
		member.setId(id);
		member.setPw(pw);
		member.setEmail(email);
		
		model.addAttribute("member", member);
		
		return "member/join";
	}

<join.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>
이름 : ${member.name }<br>
아이디 : ${member.id }<br>
비밀번호 : ${member.pw }<br>
메일 : ${member.email }
</body>
</html>

<결과>

Form태그로 값 받아오기 (get방식)

<index.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>
<script type="text/javascript">
function chk(){
	if(!frm.id.value){
		alert("id입력하세요!!!");
		frm.id.foucs();
		return false;
	}
	return true;
}
</script>
<body>
	<form action="student" method="get"> 
		student id : <input type="text" name="id"><br>
		<input type="submit" value="전송">
	</form>
</body>
</html>

<HomeController.java>

@RequestMapping("/index")
	public String goIndex() {
		System.out.println("Controller Index Start...");
		return "index";
	}
	
	@RequestMapping(method=RequestMethod.GET, value="/student")
	public String goStudent(HttpServletRequest request, Model model) {
		System.out.println("RequestMethod.GET");
		String id = request.getParameter("id");
		System.out.println("GET id:"+id);
		model.addAttribute("studentId",id);
		return "student/studentId";
	}

<StudentId.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>
student ID : ${studentId }
</body>
</html>

<결과>

Form태그로 값 받아오기 (post방식)

<index.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>
<script type="text/javascript">
function chk(){
	if(!frm.id.value){
		alert("id입력하세요!!!");
		frm.id.foucs();
		return false;
	}
	return true;
}
</script>
<body>
	<form action="student" method="post" name="frm" onsubmit="return chk()">
		student id : <input type="text" name="id"><br>
		<input type="submit" value="전송">
	</form>
</body>
</html>

<HomeController.java>

@RequestMapping("/index")
	public String goIndex() {
		System.out.println("Controller Index Start...");
		return "index";
	}
    
    @RequestMapping(method=RequestMethod.POST, value="/student")
	public ModelAndView goStudent(HttpServletRequest request) {
		System.out.println("RequestMethod.POST");
		String id = request.getParameter("id");
		System.out.println("POST id:"+id);
		
		ModelAndView mv = new ModelAndView();
		mv.addObject("studentId", id);
		mv.setViewName("student/studentId");
		
		return mv;
	}

<studentId.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>
student ID : ${studentId }
</body>
</html>

<결과>

form태그로부터 값 받아와서 DTO에 저장 후 가져오기(@ModelAttribute)

학생 정보를 입력받고 controller로 돌아와서 처리
@ModelAttribute를 사용하면 String타입의 메소드를 작성하고 매개변수로 Model을 지정하지 않아도 된다.
<StudentInformation.java>

package com.oracle.mvc042;

public class StudentInformation {
	private String name;
	private String age;
	private String gradeNum;
	private String classNum;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getGradeNum() {
		return gradeNum;
	}
	public void setGradeNum(String gradeNum) {
		this.gradeNum = gradeNum;
	}
	public String getClassNum() {
		return classNum;
	}
	public void setClassNum(String classNum) {
		this.classNum = classNum;
	}
	
}

<index.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>
	<%//mvc모델은 스크립틀릿을 쓰면안되지만 context는 예외 
		String context = request.getContextPath(); //mvc042가 들어감 		
	%>
	context:<%=context %><p>
	<form action="<%=context %>/studentView1" method="post">
		이름 : <input type="text" name="name"><br>
		나이 : <input type="text" name="age"><br>
		학년 : <input type="text" name="gradeNum"><br>
		반 : <input type="text" name="classNum"><br>
		<input type="submit" value="전송">
	</form>
</body>
</html>

<HomeController.java>

@RequestMapping("/index")
	public String goIndex() {
		System.out.println("Controller Index Start...");
		return "index";
	}
	
	@RequestMapping("/studentView1")
	public String studentView1(@ModelAttribute("studentInfo") StudentInformation studentInformation) {
		System.out.println("HomeController studentView1 Start...");
		return "studentView2";
	}

<StudentView2.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>
이름:${studentInfo.name }<br>
나이:${studentInfo.age }<br>
학년:${studentInfo.gradeNum }<br>
반:${studentInfo.classNum }
</body>
</html>

<결과>

form태그로부터 값 받아와서 DTO에 저장 후 가져오기(Model)

<StudentInformation.jsp>

package com.oracle.mvc042;

public class StudentInformation {
	private String name;
	private String age;
	private String gradeNum;
	private String classNum;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getGradeNum() {
		return gradeNum;
	}
	public void setGradeNum(String gradeNum) {
		this.gradeNum = gradeNum;
	}
	public String getClassNum() {
		return classNum;
	}
	public void setClassNum(String classNum) {
		this.classNum = classNum;
	}
	
}

<index.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>
	<%//mvc모델은 스크립틀릿을 쓰면안되지만 context는 예외 
		String context = request.getContextPath(); //mvc042가 들어감 		
	%>
	context:<%=context %><p>
	<form action="<%=context %>/studentView2" method="post">
		이름 : <input type="text" name="name"><br>
		나이 : <input type="text" name="age"><br>
		학년 : <input type="text" name="gradeNum"><br>
		반 : <input type="text" name="classNum"><br>
		<input type="submit" value="전송">
	</form>
</body>
</html>

<HomeController.java>

@RequestMapping("/index")
public String goIndex() {
	System.out.println("Controller Index Start...");
	return "index";
}

@RequestMapping("/studentView2")
public String studentView2(StudentInformation studentInformation, Model model) {
	System.out.println("HomeController studentView2 Start...");
	model.addAttribute("studentInfo", studentInformation );
	return "studentView2";
}

<StudentView2.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>
이름:${studentInfo.name }<br>
나이:${studentInfo.age }<br>
학년:${studentInfo.gradeNum }<br>
반:${studentInfo.classNum }
</body>
</html>

<결과>

다른 URL로 이동하는 경우(redirect)

<RedirectController.java>

package com.oracle.mvc043;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class RedirectController {
	
	@RequestMapping("/studentConfirm")
	public String studentRedirect(HttpServletRequest request, Model model) {
		String id = request.getParameter("id");
		String pw = "1234";
		
		System.out.println("RedirectController studentConfirm Start...");
		
		model.addAttribute("id", id);
		model.addAttribute("pw", pw);
		
		if(id.equals("abc")) {
			return "redirect:studentOk";
		}
		return "redirect:studentErr";
	}
	
	@RequestMapping("/studentOk")
	public String studentOk(HttpServletRequest request, Model model) {
		String id = request.getParameter("id");
		String password = request.getParameter("pw");
		System.out.println("RedirectController studentOk Start....");

		System.out.println("password->"+password);
		model.addAttribute("id", id);
		model.addAttribute("password", password);
		return "student/studentOk";
	}
	
	@RequestMapping("/studentErr")
	public String studentErr(HttpServletRequest request, Model model) {
		String id = request.getParameter("id");
		model.addAttribute("id", id);
		System.out.println("Redirectcontroller studentErr Start...");
		return "student/studentErr";
	}
}

<StudentOk.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>
studentOk.jsp<p>
id:${id }<p>
pw:${password }
</body>
</html>

<StudentErr.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>
넌 누구냐<p>
<h1>20년간 만두만 </h1> 주고...<p>
id : ${id }
</body>
</html>

<결과>
id=abc로 넘겨준 경우

id!=abc인 경우


Validator

<Student.java>

package com.oracle.mvc152;

public class Student {
	private String name;
	private int id;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
}

<StudentController.java>

package com.oracle.mvc152;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class StudentController {
	@RequestMapping("/studentForm")
	public String studemtForm() {
		System.out.println("Controller studentForm");
		return "createPage";
	}
	
	@RequestMapping("/student/create")
	public String studentCreate(@ModelAttribute("student") Student student, BindingResult result) {
		//BindingResult -> 유효성 검증결과를 담아두는 객체 
		String page = "createDonePage";
		
		StudentValidator validator = new StudentValidator();
		validator.validate(student, result);
		if(result.hasErrors()) {
			System.out.println("StudentValidator 오류 발생...");
			page="createPage";
		}
		return page;
	}
}

<createPage.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>
<form action="student/create">
	이름 : <input type="text" name="name" value="${student.name }"><br>
	아이디 : <input type="text" name="id" value="${student.id }"><br>
	<input type="submit" value="전송"><br>
</form>
</body>
</html>

<StudentValidator.java>

package com.oracle.mvc152;

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

public class StudentValidator implements Validator {

	@Override
	public boolean supports(Class<?> arg0) {
		//검증할 객체의 클래스 타입 정보 
		return Student.class.isAssignableFrom(arg0);
	}

	@Override
	public void validate(Object target, Errors errors) {
		System.out.println("validate()");
		Student student = (Student)target;
		
		String studentName = student.getName();
		if(studentName==null || studentName.trim().isEmpty()) {
			System.out.println("studentName is null or empty");
			errors.rejectValue("name", "이름이 없거나 비어 있습니다");
		}
		
		int studentId = student.getId();
		if(studentId==0) {
			System.out.println("studentId is 0");
			errors.rejectValue("id", "trouble");
		}
	}

}
profile
벨로그? 난 켈로그

0개의 댓글