매일 조금씩

01/28 ! - Spring MVC (2) : Maven Project로 공유 데이터 구현하기, Spring MVC Project로 구현하기(Controller- annotation), 우편번호 검색기, model2 게시판 구현 본문

빅데이터 플랫폼 구축을 위한 자바 개발자 양성과정

01/28 ! - Spring MVC (2) : Maven Project로 공유 데이터 구현하기, Spring MVC Project로 구현하기(Controller- annotation), 우편번호 검색기, model2 게시판 구현

mezo 2021. 2. 25. 19:59
728x90
반응형

 

 

Spring MVC

           컨트롤러

                  FrontController

                             DispatcherServlet

                                        Spring Bean Configuration file

                                                    <bean

                  BackController

                             Controller 구현한 사용자 클래스

 

2-3. 프론트 컨트롤러로 공유 데이터 사용하기

※ 여러개 FrontController 파일 쓰기

> web01

FrontController 파일인 mvc-config.xml는 점점 길이진다.

이걸 하나만 쓰는게 아니라 여러개를 써도 된다. 

대신 web.xml에서 <param-value>를 바꿔줘야한다.

 

 

 

 

 공유데이터에 대한 설정

> web02

xml에 설정을 해놓고 사용한다. 

JRE가 1.5로 되어있는데 이건 Annotation 기법때 오류가 나므로 1.8로 바꿔줘야한다.

 

1) web.xml 에 기존에 쓰던 filter, servlet 추가 해주기

 

2) web.xml 에 공유데이터용 환경 설정을 추가하기 (여기선 application-config.xml)

<context-param>과 <listener> 를 추가한다.

<!-- 공유데이터용 환경 설정 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/application-config.xml</param-value>
</context-param>
<listener>
    <!-- 얘가 시작될 때 위의 application-config.xml을 실행시킨다. -->
    <listener-class>org.springframework.web.context.ContextLoaderList</listener-class>
</listener>

<listener>가 시작될 때 <context-param>의 xml파일인 application-config.xml 을 실행시키겠다. 는 의미

 

그럼 <web-app> 에 에러가 뜨는데 filter를 <context-param>이랑 <listener> 사이에 넣거나

<web-app> 의 버전을 최신걸로 바꿔주면 에러가 안난다.

 

↓ <web-app>  최신버전  ↓

<?xml version="1.0" encoding="UTF-8"?>
<web-app
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

 

원래 있던 mvc-config.xml의 위치를 

'/WEB-INF/mvc-config.xml' 에서 '/WEB-INF/spring/appServlet/mvc-config.xml' 로 바꾼다.

 

 

3) application-config.xml 와 mvc-config.xml 을 만들기

 

4) 공유데이터가 저장될 클래스 만들기

> share > ShareClass.java

package share;

public class ShareClass {
	// 공유데이터가 저장될 클래스
	
	private String shareData1;

	public ShareClass() {
		// TODO Auto-generated constructor stub
		System.out.println("ShareClass 생성자 호출");
	}
	
	public String getShareData1() {
		return shareData1;
	}

	public void setShareData1(String shareData1) {
		this.shareData1 = shareData1;
	}
	
}

 

5) application-config.xml에 공유자료 관련 bean 만들기

<!-- application-config.xml -->
<bean id="shareClass" class="share.ShareClass">
    <property name="shareData1" value="난 공유자료임" />
</bean>

 

6) list1.do로 부르면 ListAction.java를 거쳐서 listview.jsp가 호출되게 만들기

> spring > appServler > mvc-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

	<bean name="/list1.do" class="model2.ListAction1" />
	
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views" />
		<property name="suffix" value=".jsp" />
	</bean>

</beans>

 

> model2 > ListAction.java

package model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class ListAction1 implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		System.out.println("ListAction1 호출");
		
		return new ModelAndView("listview1");
	}

}

 

 

싱글톤이여서 실행시키면 공유데이터를 먼저 인스턴스화를 시켜놓고 각각공유해서 쓴다.

 

 

7) mvc-config.xml에 sharedata를 property로 추가

<bean name="/list1.do" class="model2.ListAction1">
    <!-- 아래의 ref인 shareClass는 application-config.xml에 있는 걸 가리킨다. -->
    <property name="shareClass" ref="shareClass"></property>
</bean>

 

 

 

 

3. Spring MVC Project

annotation으로 구현한다.

> SpringMVCEx04

> com.exam.mvc01 > HomeController.java

 

 

Spring MVC 프로젝트로 만들땐 Spring Legacy Project에서 Spring MVC Project로 만든다.

 

근데 이걸 maven프로젝트로 만들어서 바꾸는게 편하다.

 

3-1. maven 프로젝트 만들기

> mvc02

 

1) pom.xml 복사붙여넣기

 

2) web.xml 복사붙여넣기해서 xml 파일에 대한 경로를 수정한다. 

 

3) servlet-context.xml만들어서 beans로 수정하기

servlet-context.xml은 프론트 컨트롤러이다. 

이걸 만들때 beans, mvc 뿐만아니라 context도 넣어서 만들어준다. 

 

그리고 beans가 붙도록 수정한다.

먼저 다음과 같이 xmlns와 xmlns:mvc 의 주소를 바꾸고

xmlns:mvc를 xmlns:beans로 수정한 뒤, 태그 앞에 beans: 를 붙여준다.

앞에 beans다 붙이는 이유가 Spring MVC의 형식과 맞춰주기 위해서이다.

 

 

4) servlet-context.xml에서 controller클래스에 관한거 넣어주기

<beans:bean class="controller.ConfigController1" />

 

5) controller클래스 만들기 

클래스 위에 @Controller 해줘야함

bean써줬던걸 여기선 @RequestMapping("/list1.do)처럼 @RequestMapping을 사용한 함수로 처리한다.

아래의 전체 코드를 보면 확인이 가능하다.

> controller > ConfigController1.java

package controller;

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

@Controller
public class ConfigController1 {
	
	@RequestMapping("/list1.do")
	public String handleRequest1() {
		System.out.println("handleRequest1() 호출");
		return "listview1";
	}

}

 

 

xml을 썼을 땐, action클래스를 만들고 요청과 action페이지를 이어주는 bean을 프론트 컨트롤러에 써줘야 했는데

여기선 controller 클래스를 만들어서 그안에 요청별로같이 여러개의 함수를 정의하하고 프론트 컨트롤러에선 controller클래스를 bean으로 언급해주기만 하면된다.

@RequestMapping("/list1.do")
public String handleRequest1() {
    System.out.println("handleRequest1() 호출");
    return "listview1";
}

@RequestMapping("/list2.do")
public String handleRequest2() {
    System.out.println("handleRequest2() 호출");
    return "listview2";
}

물론 여러개의 controller클래스를 만들어도된다.

그땐 아래처럼 프론트컨트롤러(여기선 servlet-config.xml)에 controller클래스를 전부 언급해 줘야한다.

<beans:bean class="controller.ConfigController1" />
<beans:bean class="controller.ConfigController2" />

 

 

controller클래스가 많아질때, 다음처럼 <context:component-scan>을 사용하면 된다. 

<context:component-scan base-package="controller" />

 

6) url 가상경로로 넣기

실제 경로가 아닌 가상경로로 처리할 수 있다.

먼저 controller 클래스에서 아래처럼 가상 경로를 넣어주고..

@Controller
public class ConfigController1 {
	
	@RequestMapping("/list1.do")
	public String handleRequest1() {
		System.out.println("handleRequest1() 호출");
		return "listview1";
	}
	
	// 가상 경로 /board/
	@RequestMapping("/board/list2.do")
	public String handleRequest2() {
		System.out.println("handleRequest2() 호출");
		return "listview2";
	}

}

jsp 페이지에 가상경로 링크로 해주면 된다. 

<html>
<body>
<h2>Hello World!</h2>
<ul>
	<li><a href="list1.do">list1.do</a></li>
	<li><a href="list2.do">list2.do</a></li>
	<li><a href="board/list1.do">board/list1.do</a></li>
	<li><a href="board/list2.do">board/list2.do</a></li>
</ul>
</body>
</html>

 

가상 경로의 다른 방법으로는 @RequestMapping("가상경로")를 클래스 위에 써주는 방법이다.

controller클래스에서 @RequestMapping("/board/") 이런식으로 가상경로를 추가해주면 아래 메서드에선 언급을 안해줘도된다.

 

@Controller
@RequestMapping("/board/")
public class ConfigController1 {
	
	@RequestMapping("/list1.do")
	public String handleRequest1() {
		System.out.println("handleRequest1() 호출");
		return "listview1";
	}
	
	// 가상 경로 /board/
	@RequestMapping("/list2.do")
	public String handleRequest2() {
		System.out.println("handleRequest2() 호출");
		return "listview2";
	}

}

 

만약 다른 사이트를 연결시킬땐 redirect를 사용한다.

@RequestMapping("/daum.do")
public String handleRequest3() {
    System.out.println("handleRequest3() 호출");
    return "redirect:https://www.daum.net";
}

 

 

7) 데이터 받고 넘기기 (get, post) 첫번째 방법 - 파라메터 사용

controller에서 ModelAndView 생성자를 return

write.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="write_ok.do" method="get">
get 데이터 <input type="text" name="data" />
<input type="submit" value="전송"/>
</form>

<br /><hr /><br />

<form action="write_ok.do" method="post">
post 데이터 <input type="text" name="data" />
<input type="submit" value="전송"/>
</form>

</body>
</html>

index.jsp에 아래 코드를 추가한다.

<li><a href="./write.do">write.do</a></li>
<li><a href="./write_ok.do">write_ok.do</a></li>

 

그다음 controller를 작성하는데~

어떤 방식인진 RequestMapping에 method 속성으로 적어주고

@RequestMapping( value="/write_ok.do", method=RequestMethod.GET)
@RequestMapping( value="/write_ok.do", method=RequestMethod.POST)

 

메서드의 인자로 HttpServletRequest request, HttpServletResponse response 를 넣으면 데이터를 받아올수 있다.

@RequestMapping( value="/write_ok.do", method=RequestMethod.GET)
public ModelAndView handleRequest21(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("handleRequest21() 호출 " + request.getParameter("data"));
    return new ModelAndView("write_ok");
}

@RequestMapping( value="/write_ok.do", method=RequestMethod.POST)
public ModelAndView handleRequest22(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("handleRequest22() 호출 " + request.getParameter("data"));
    return new ModelAndView("write_ok");
}

 

실행시키면 다음과 같다.

이렇게 url에 쿼리로 넘어간것을 확인 할 수 있다.

브라우저에서 읽을 땐 request.getParameter()를 사용한다.

 

return 으로 ModelAndView말고 String같은 타입도 줄수 있는데 거의 ModelAndView를 쓴다.

controller는 xml방식에서의 action페이지와 같은 기능을 한다.

거기에다가 annotation까지 쓰면서 xml에서 프론트컨트롤러가 했던 역할도 대신해주고 있다. 

 

 

 

8) 데이터 받고 넘기기 (get, post) 두번째 방법 - 객체로 넘기기

ModelAndView를 받아서 나갈때 보내질 데이터가 정해져 있다.

@RequestMapping( value="/write_ok.do", method=RequestMethod.POST)
public ModelAndView handleRequest22(HttpServletRequest request, HttpServletResponse response) {
    System.out.println("handleRequest22() 호출 " + request.getParameter("data"));

    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("write_ok");
    modelAndView.addObject("data", request.getParameter("data"));
    return modelAndView;
}

이방법은 ModelAndView의 객체에 데이터를 받아서 넘기는 방법이므로

브라우저에서 읽을 땐 request.getAttribute()를 사용한다.

 

 

 

 

여기서 부턴 모두 getAttribute, getParameter모두 가능하다.

9) 데이터 받고 넘기기 (get, post) 세번째 방법 - Model 사용

@RequestMapping( value="/write_ok.do", method=RequestMethod.POST)
public String handleRequest21(HttpServletRequest request, HttpServletResponse response, Model model) {
    model.addAttribute("data", request.getParameter("data"));
    return "write_ok";
}

 

 

10) 데이터 받고 넘기기 (get, post) 네번째 방법 - @RequestParam() 사용

@RequestMapping("/write_ok.do")
// 파라메터 순서 바꿔도 됨
//public String handleRequest2(Model model, @RequestParam("data") String data) {
public String handleRequest2(@RequestParam("data") String data, Model model) {
    System.out.println("handleRequest2() 호출 : " + data);
    model.addAttribute("data", data);
    return "write_ok";
}

 

 

11) 데이터 받고 넘기기 (get, post) 다섯번째 방법 - @GetMapping("/write_ok.do"), @PostMapping("/write_ok.do")

method=RequestMethod.GET

              @GetMapping("/write_ok.do")

method=RequestMethod.POST

              @PostMapping("/write_ok.do")

@GetMapping("/write_ok.do")
public String handleRequest21(String data, Locale locale, Model model) {
    System.out.println("handleRequest21() 호출 : " + data);
    model.addAttribute("data", data);
    return "write_ok";
}

@PostMapping("/write_ok.do")
public String handleRequest22(String data, Locale locale, Model model) {
    System.out.println("handleRequest22() 호출 : " + data);
    model.addAttribute("data", data);
    return "write_ok";
}

 

12) 데이터 받고 넘기기 (get, post) 여섯번째 방법 -10번과 비슷하지만 여러 속성 사용

10번에선 아래와 같이 했다.

public String handleRequest(@RequestParam(data) String data){}

그걸 아래와 같이도 쓸수 있는데 위의 괄호 안의 data는 아래의 value로 들어가있는 "data"와 같다.

public String handleRequest(@RequestParam(value="data", defaultValue="value", require=false) String data){}
  • default : 기본값
  • require : 필수 여부

 

3-2. Spring MVC 프로젝트 세팅 방법

1) jre 버전 1.8로 맞추기

 

2) pom.xml에서 버전 바꿔주기

          JDK 버전 변경

          Spring Framework 버전 변경

          aspectj 버전변경  

          slf4j 버전 변경

<properties>
    <java-version>1.8</java-version>
    <org.springframework-version>5.2.8.RELEASE</org.springframework-version>
    <org.aspectj-version>1.9.5</org.aspectj-version>
    <org.slf4j-version>1.7.30</org.slf4j-version>
</properties>

 

3) web.xml  수정하기

           /  ->  *.do

           utf-8 인코딩 필터 설정

 

4) 필요한 추가 라이브러리 설정

           (ex) mariadb 같은거 mavenrepository에서 검색후 pom.xml에 추가

 

3-3. Spring MVC 프로젝트로 우편번호 검색기 만들기

> ZipcodeSearchEx02

버전 1.8로 올린후 , pom.xml에서 버전 정보 수정

페이지별로 action페이지를 다따로 만들어야했던 수고를 하나의 controller클래스 안에서 

annotation으로 구분하여 같이 쓸수 있다는 점에서 간편해졌다.

 

(만들어야함)

 

3-4. Spring MVC 프로젝트로 model2 게시판 만들기

> board02

 

1) jre 버전 1.8로 맞추기

 

2) pom.xml에서 버전 바꿔주기

 

3) web.xml 에 필터 코드 추가

 

4) model1, css, images 폴더 넣기 

model1은 src/main/java 안에 넣고 

css, images는 src > main > webapp > resources 에 넣는다.

 

5) views 폴더 만들고 view페이지들 가져와서 그 안에 넣기

 

6) action페이지에 썼던 메서드 안의 내용만 Spring MVC annotation방식의 함수안에 넣는다.

ex) HomeController.java의 modify_ok 메서드

@RequestMapping("/modify_ok.do")
public ModelAndView modify_ok(HttpServletRequest request, HttpServletResponse response){
    System.out.println("modify_ok() 호출");

    BoardTO to = new BoardTO();
    to.setSeq(request.getParameter("seq"));
    to.setPassword(request.getParameter("password"));

    to.setSubject(request.getParameter("subject"));
    // 필수 입력 항목이 아닌 경우
    to.setMail("");
    if(!request.getParameter("mail1").equals("") && !request.getParameter("mail2").equals("")){
        to.setMail(request.getParameter("mail1") + "@" + request.getParameter("mail2"));
    }
    to.setContent(request.getParameter("content"));

    BoardDAO dao = new BoardDAO();
    int flag = dao.boardModifyOk(to);

    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("board_modify1_ok");
    modelAndView.addObject("flag", flag);

    return modelAndView;
}

method는 따로 안해줘도 된다. 

 

 

 

 

 

 

 

 

 

728x90
반응형