코딩하는 문과생

[Spring] 2. 스프링 기본 - View와 Controller 본문

웹 프로그래밍/Spring

[Spring] 2. 스프링 기본 - View와 Controller

코딩하는 문과생 2020. 2. 4. 10:02

[HomeController 컨트롤러 어노테이션 상속관계]

@Component

    @Controller

       HomeController homeController = new HomeController() ;

    @Service

    @Repository

 

  • 기존은 요청에 따른 컨트롤러를 모두 만들어야했다면, 스프링은 하나의 컨트롤러에 여러 메소드를 작성한다.
  • 또한 리턴타입은 일반적으로 String이다.
  • 메소드 구문형식에 제한이 없다.
  • 그러나 사용자의 요청과 Mapping이 되어야 한다.

[UserCtrl 생성 - 어노테이션으로 객체를 생성하고, 맵핑한다.]

package com.sinc.intern.user.ctrl;

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

@Controller
public class UserCtrl {
//	@RequestMapping(value="/login.do", method=RequestMethod.POST)
	@RequestMapping("/login.do")
	public String login() {
		
	}
	@RequestMapping("/logout.do")
	public String logout() {
		
	}
	@RequestMapping("/join.do")
	public String join() {
		
	}
	@RequestMapping("/search.do")
	public String search() {
		
	}
}

[UserDTO, UserVO 생성 - 데이터를 담는 그릇 생성]

package com.sinc.intern.user.model.vo;

public class UserDTO {
	private String id, pwd;
	public UserDTO() {
		super();
		// TODO Auto-generated constructor stub
	}
	public UserDTO(String id, String pwd) {
		super();
		this.id = id;
		this.pwd = pwd;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	@Override
	public String toString() {
		return "UserDTO [id=" + id + ", pwd=" + pwd + "]";
	}
	
}
package com.sinc.intern.user.model.vo;

public class UserVO {
	private String id, pwd, name;
	private double point;
	private String dept;
	public UserVO() {
		super();
		// TODO Auto-generated constructor stub
	}
	public UserVO(String id, String pwd, String name, double point, String dept) {
		super();
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.point = point;
		this.dept = dept;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPoint() {
		return point;
	}
	public void setPoint(double point) {
		this.point = point;
	}
	public String getDept() {
		return dept;
	}
	public void setDept(String dept) {
		this.dept = dept;
	}
	@Override
	public String toString() {
		return "UserVO [id=" + id + ", pwd=" + pwd + ", name=" + name + ", point=" + point + ", dept=" + dept + "]";
	}
	
}

[UserCtrl 수정]

package com.sinc.intern.user.ctrl;

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

import com.sinc.intern.user.model.vo.UserDTO;

@Controller
public class UserCtrl {
	@RequestMapping("/login.do")
	public String login(UserDTO dto) {
		System.out.println("ctrl login");
		System.out.println("UserDTO : " + dto);
		return "home";
	}
	@RequestMapping("/logout.do")
	public String logout() {
		return null;
	}
	@RequestMapping("/join.do")
	public String join() {
		return null;
	}
	@RequestMapping("/search.do")
	public String search() {
		return null;
	}
}

Controller 객체 생성이 되었다.

[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>  This is a Spring Framework by L.S.J </P>
</body>
</html>

일반 url
인자를 포함한 url

따라서 변수의 이름을 맞춰줘야 한다.

[UserCtrl 수정 - 반환형은 총 3개만 가능, 그 외는 비동기 통신이다.]

package com.sinc.intern.user.ctrl;

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

import com.sinc.intern.user.model.vo.UserDTO;
import com.sinc.intern.user.model.vo.UserVO;

@Controller
public class UserCtrl {
	//String
	@RequestMapping("/login.do")
	public String login(UserDTO dto) {
		System.out.println("ctrl login");
		System.out.println("UserDTO : " + dto);
		return "home";
	}
	//void
	@RequestMapping("/logout.do")
	public void logout() {
		System.out.println("ctrl logout");
		//반환이 없다면 RequestMapping에 적혀있는 url에 jsp를 맵핑해서 찾는다.
	}
	//ModelAndView
	@RequestMapping("/join.do")
	public ModelAndView join(ModelAndView mv) {
		//View에 대한 정보와 Data에 대한 정보를 함께 넘긴다.
		System.out.println("ctrl join");
		mv.addObject("msg", "Hi, sijune");
		mv.setViewName("home");
		return mv;
	}
	//가장 추천하는 방식
	@RequestMapping("/search.do")
	public String search(Model model) {
		System.out.println("ctrl search");
		model.addAttribute("msg", "using model 두두두");
		return "home";
	}
	//비동기 통신 - ResponseBody: 1.일반적으로 VO, List, Map을 반환한다. 2. 알아서 json으로 바꿔준다.
	@RequestMapping("/ajax.do")
	@ResponseBody
	public UserVO ajax() {
		System.out.println("ctrl ajax");
		//페이지가 아닌 데이터를 반환한다.
		return new UserVO("sijune", "sijune", "이시준", 1000, "STARTBUCKS");
	}
}

[home.jsp수정]

<P> This is a Spring Framework by L.S.J ${ msg } </P>

데이터를 함께 불러온다.
비동기 통신 - json 형식