티스토리 뷰

	<!-- 스프링 내부에 있는 어노테이션방법으로 핸들러맵핑과 핸들러어댑터기능을 제공함 -->
	<mvc:annotation-driven></mvc:annotation-driven>
	
	<!--  -->
	<context:component-scan base-package="com.simple.controller"></context:component-scan>

위에 기능을 사용하려면 아래에 namespace에서 아래 내용들을 체크해줘야한다.

 

 

 

 

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

써주면 

 

파일 그림에  s 자가 생겼다. 이 의미는 

HomeController.java에서 빈으로 만들겠다고 선언해놓은 클래스가 스프링 설정파일에 읽혀서 빈이 자동으로 생성되었다는 것.

 

*HomeController.java

package com.simple.controller;

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

@Controller //빈으로 생성할 클래스
public class HomeController {

	@RequestMapping("/test/aaa") //핸들러맵핑
	public String home() {
		return "home";
	}
	
}

 

컨텍스트 패스란 ?

프로젝트 구분 경로.

 

 

#톰캣9버젼 설치

링크 : 

https://tomcat.apache.org/download-90.cgi 

 

 

 

 

# 스프링 레거시 프로젝트 만들기

 

 

* 프로젝트의 구조

 

*porm.xml 셋팅 변경

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.simple</groupId>
	<artifactId>controller</artifactId>
	<name>SpringBasic</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	
	<!-- pom.xml에서 사용할 변수들 --> 
	<!-- 자바버전 11, 스프링버전 변경 -->
	<properties>
		<java-version>11</java-version>
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	
	<!--필요한 라이브러리들-->
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				 </exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
				
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		
		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
				
		<!-- Servlet -->
		<!-- 서블릿 버전 최소 3.1이상으로 변경 -->
		<dependency>
		    <groupId>javax.servlet</groupId>
		    <artifactId>javax.servlet-api</artifactId>
		    <version>3.1.0</version>
		    <scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	
		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>        
	</dependencies>
	
	
	<!-- maven 관련 설정이 들어가는 곳 bulid -->
	<!-- 메이븐 설정 - 메이븐 버전 3.8.1 변경, 컴파일 자바 레벨 11 -->
    <build> 
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <!-- 요기 !!!!!!!!!!!!!!!!!!!!!!!!!!! -->
                <version>3.8.1</version>
                <configuration>
                    <source>11</source> 
                    <target>11</target>
                    <!--                -->
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

위와 같이 설정 변경하고 

프로젝트 우클릭 maven 에서 update project

 

 

- 5강 컨트롤러 객체의구현 -

 

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청경로
public class RequestController {

}

 

 

* void형 

 -들어오는 주소와 나가는 주소가 똑같을 때 사용.

*String 형 메소드

-들어오는 경로와 나가는 경로가 다를 때 사용.

-제일 많이 사용.

 

	//String 메서드 - 출력 화면을 직접 지정 ( 이 방식이 제일 많이 쓰임)
//	@RequestMapping("/ex01")//요청경로
//	public String ex01() {
//		return "request/ex01"; //출력경로
//	}
	
	//void메서드 - 요청 경로가 출력경로가 됨
	@RequestMapping("/ex01")
	public void ex01() {}
	
	
	//get만 허용
	//@RequestMapping(value = "/basic1", method = RequestMethod.GET ) 
	@GetMapping("/basic1")
	public String basic() {
		
		return null;
	}
	
	//post만 허용
	//@RequestMapping(value="/basic2", method=RequestMethod.POST)
	@PostMapping("/basic2")
	public String basic2() {
		
		System.out.println("post만 허용");
		
		return null;
	}
	
	//get, post 둘다 허용
	@RequestMapping("/basic3")
	public String basic3() {
		return null;
	}

 

 

★ 커맨드 객체로 들어오는 값을 받을 때에는 

 post 방식 뿐 아니라 get 방식으로 넘어오는 값도 받을 수 있다는거 잘 알아두자.

이때 중요한건 넘어오는 데이터의 이름 혹은 키값과  , 데이터를 받는 객체내에서 변수의 이름이 반드시 같아야 함. ★

 

# HttpServletRequest 를 이용한 방식

	//1st
	@RequestMapping(value="/doAction", method=RequestMethod.POST)
	public String doAction(HttpServletRequest request) {
		
		//name파람
		String name = request.getParameter("name");
		//age파람
		String age = request.getParameter("age");
		//inter - checkbox
		String[] inter = request.getParameterValues("inter");
		
		System.out.println(name);
		System.out.println(age);
		System.out.println(Arrays.toString(inter));
		
		return "request/ex02_ok";
		
	}

 

 

# @RequestParam() 어노테이션으로 처리

*RequestParam 은 필수적으로 값이 넘어와야하지만 ( 값이 담겨있지 않으면 요청이 거절됨.)

 속성 값으로  required = false 로 지정해주면 

 공백이나 값이 없어도 괜찮음. 

 다만,  공백이나  null값이 넘어온 경우 오류가 발생할 상황이 많기 때문에

defaultValue 라는 속성에 기본값을 지정해줌.

( 예상되는 문제중 하나, null.toString()  -> nullPointerException 발생)

 

즉 required 와 defaultValue는 짝궁으로 같이 쓰인다고 알고있자.

 

//2nd
@RequestMapping("/doAction")
public String doAction(@RequestParam(value="name", required = false, defaultValue = "") String name,
					   @RequestParam("age") int age,
					   @RequestParam(value="inter", required = false, defaultValue = "") List<String> list) {
	
	//requestParam은 공백과 null데이터가 전달되면 요청을 거절하게 됩니다.
	//필수가 아닌 파라미터는 required = false속성을 지정하면 됩니다.
	//필수가 아닌 파라미터인 경우에는 null or ""을 지정하게 되는데 defaultValue으로 기본값을 줄 수 있습니다.
	
	System.out.println(name);
	System.out.println(age);
	System.out.println(list.toString());
		
	return "request/ex02_ok";
}

 

 

# 커맨드객체(VO)를 통한 처리

*폼 태그의 값을 받아 처리할 수 있는 (VO) Class생성, 변수명을 폼 태그의 이름들과 일치하게 생성

	//3nd - 커맨드 객체를 통해서 맵핑 (넘어오는 데이터의 name과 setter명이 같아야 합니다.)
	@RequestMapping("/doAction")
	public String doAction(ReqVO vo) {
		
		System.out.println(vo.toString());
		
		return "request/ex02_ok";
		
	}

*폼 태그

	<form action="doAction" method="post">
		이름:<input tpye="text" name="name">
		나이:<input type="number" name="age">
		
		<input type="checkbox" name="inter" value="1">java
		<input type="checkbox" name="inter" value="2">spring
		<input type="checkbox" name="inter" value="3">boot
		
		<input type="submit" value="확인">
	</form>

 

*ReqVo.java

package com.simple.command;

import java.util.List;

public class ReqVO {
	
	private String name;
	private int age;
	private List<String> inter;
	
	public ReqVO(String name, int age, List<String> inter) {
		super();
		this.name = name;
		this.age = age;
		this.inter = inter;
	}
	

	@Override
	public String toString() {
		return "ReqVO [name=" + name + ", age=" + age + ", inter=" + inter + "]";
	}



	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public List<String> getInter() {
		return inter;
	}

	public void setInter(List<String> inter) {
		this.inter = inter;
	}
	
	
	

}

 

 

< Model 전달자 >

*콜바이 레퍼런스 개념이 사용된 것

* Model 객체가 가장 많이 사용됨.

 

# Model객체 = (ModelMap) 

	//result01요청 - model객체
	@RequestMapping("/result01")
	public String result01(Model model) {
		
		model.addAttribute("data", "홍길동"); //키, 값
		model.addAttribute("serverTime", new Date());
		
		return "response/result01";
	}

*전달 받은 값 화면페이지(jsp) 에서 사용

	${data }<br/>
	${serverTime }<br/>

${} 은 EL 코드 

 

# ModelAndView객체

	//result02요청 - ModelAndView객체
	@RequestMapping("/result02")
	public ModelAndView result02() {
		
		//뷰의 정보, data정보를 함께 저장할 수 있는 객체
		ModelAndView mv = new ModelAndView();
		mv.addObject("data", "홍길동");
		mv.addObject("name", "이순신");
		mv.setViewName("response/result02");
		
		return mv;
	}

 

 

#.@ModelAttribute 어노테이션

* 전달받은 파라미터를 Model에 담아서 화면까지 전달하려 할 때 사용되는 어노테이션입니다.

* 받을 값이 단일이냐 객체냐에 따라 방식이 조금 다름.

ex) @ModelAttribute("받을값") 사용할 변수

 

-기억해둘 포인트

@ModelAttribute("num") String aaa

@ModelAttribute("article") ReqVO vo 

받아온 값 aaa, vo 를  num 이나 article 이라는 이름으로 보내는 페이지로 값을 보내준다는 점. 잘 기억해두기

 

*요청

	<a href="result03?num=10">modelAttr단일값</a>
	
	<form action="result04" method="post">
		<input type="type" name="name">
		<input type="type" name="age">
		<input type="submit" valu="modelAttr객체">
	</form>

 

*컨트롤러

//@ModelAttribute = request + model
	@RequestMapping("/result03")
	public String result03(@ModelAttribute("num") String aaa) {
		
		System.out.println("화면데이터:" + aaa);
		
		return "response/result03";
	}
	
	@RequestMapping("/result04")
	public String result04(@ModelAttribute("article") ReqVO vo) {
		//요청에서 받아온 값을 article 이라는 이름으로 받아서 다시 전달해준다는 의미.
		
		System.out.println("화면데이터:" + vo.toString());
		
		return "response/result04";
	}

*응답

	result03화면<br/>
	넘어온값: ${num}
	result04화면<br/>
	넘어온값:${article.name } , ${article.age }

 

#Redirect

*mvc 에서 Redirect를 사용하는 경우는 갖고있는 값을 다 버리고 새롭게 원하는 화면으로 강제로 이동할 때 사용.

( 리다리엑트는 기본적으로 갖고있는 데이터를 다 버린다.)

- 단, 

  redirectAttribute는 redirect시에 1회성 데이터를 저장할 수 있습니다.

*스프링에 기본 방식은 forward(값을 갖고 가는것) redirect는 갖고있는 값을 다 버리고 다시 컨트롤러를 통해서 이동시킴.

* return "redirect:/req_01";  이렇게 리다이렉트 콜론 뒤에 절대경로(/로시작)로 경로를 반환해준다. 

 

★ redirect는 model 객체를 사용할 수 없기 때문에 막 쓰는것이 아님. 컨트롤러를 태워서 화면을 이동시켜줄 때 사용.

 

# RedirectAttributes 객체  (Redirect 와 연계해서 같이 잘 알아두기)

*리다이렉트 이동시 파라미터 값을 전달하는 방법

 ex) addFlashAttribute()

*맵핑해주는 메서드의 매개변수에 RedirectAttibutes 객체를 받아줌.

 메서드 구현부에서 RedirectAttributes의 addFlashAttribute("키" , 값); 이렇게 일회성 데이터를 담아주면 됨.

 

 

Redirect 와  RedirectAttributes 객체 사용

	//로그인요청
	@RequestMapping(value = "/login", method=RequestMethod.POST)
	public String login(@RequestParam("id") String id,
						@RequestParam("pw") String pw,
						RedirectAttributes ra) {
		//로그인 성공 -> home화면으로
		if(id.equals(pw)) {
			
			ra.addFlashAttribute("msg","어서와"); // 1회성 데이터
			
			return "redirect:/"; //다시 home 컨트롤러를 태워 보냄 - model을 사용할 순 없음
			
		//로그인 실패
		} else {
			ra.addFlashAttribute("msg", "틀렸는데요?ㅋ");
			return "redirect:/response/redirect_login"; //"redirect:/절대경로"
			
		}
		
	}

 

#EL에 관한 내용

 

#JSTL에 관한 내용

 

<기억할것>

*이클립스에서 서버를 다시 껐다 켜야 하는 경우는 

 파일이 새로 생기거나 설정이 바뀌었을 때.

*자바 파일이 변경되었을 때는 자동으로 리렌더링 된다.

 

#컨텍스트 패스 변경

*localhost:8282/controller

위에서 controller 가 컨텍스트 패스임. (컨텍스트 패스란? 서버에서 프로젝트를 구분하는 경로)

 

*porm.xml 파일

 

 

 

 

댓글