Woopii Vyeolog

(Spring Legacy Proejct) parameter넘기기(get,post) 본문

Spring Framework

(Spring Legacy Proejct) parameter넘기기(get,post)

WooPii 2020. 3. 18. 12:21

github : https://github.com/leewoopyo/exam_view2

 

Spring Legacy Project로 프로젝트를 만든 후 

(프로젝트 이름 : exam_view2, 베이스 패키지 : com.exam.view2)

 

클라이언트에서 get, post 방식으로 보낸 파라메터 값이 포함된 URL을 매핑해서 

 

Controller 에서 그 값을 모델에 담아 view에 보내는 작업을 할 것이다.

 

(Controller와 view만 있는 프로젝트이다.)

 

<전체 구성>

pom.xml 로 가서 버전 수정을 해 준다.

 

<pom.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>kopo.exam</groupId>
	<artifactId>hello</artifactId>
	<name>hello</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>1.8</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.apache.maven.plugins</groupId>
		    <artifactId>maven-resources-plugin</artifactId>
		    <version>2.4.3</version>
		</dependency>
		<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 -->
		<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>
    <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>2.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</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>

그리고 web.xml파일에서 한글 설정을 한다.

 

<web.xml>

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

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	<!-- 한글처리 -->
<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>
	

</web-app>

 

그리고

 

Java resources --> src/main/java에서 패키지를 하나 만든다.(com.exam.view2.domain)

 

이 패키지 안에 데이터를 담는 클래스를 하나 만든다. 

 

package com.exam.view2.domain;

public class ExamRIO {
	
	//다룰 데이터 선언
	private String name;
	private int studentid;
	private int kor;
	private int eng;
	private int mat;
	
	//constructor 선언 빈 생성자와 데이터가 같이 들어있는 생성자를 같이 만들어 준다.
	public ExamRIO() {
		super();
	}
	public ExamRIO(String name, int studentid, int kor, int eng, int mat) {
		super();
		this.name = name;
		this.studentid = studentid;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}
	
	//getter, setter 메소드 생성 : 데이터를 불러오고 적용할 때 사용한다. 
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getStudentid() {
		return studentid;
	}
	public void setStudentid(int studentid) {
		this.studentid = studentid;
	}
	public int getKor() {
		return kor;
	}
	public void setKor(int kor) {
		this.kor = kor;
	}
	public int getEng() {
		return eng;
	}
	public void setEng(int eng) {
		this.eng = eng;
	}
	public int getMat() {
		return mat;
	}
	public void setMat(int mat) {
		this.mat = mat;
	}
}

 

여기까지 했으면 Controller를 설정해 준다.

 

<HomeController.java>(URL을 매핑해서 데이터를 모델에 담고 view로 이동한다.)

package com.exam.view2;

import java.io.UnsupportedEncodingException;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.exam.view2.domain.ExamRIO;

@Controller
public class HomeController {
	
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	//프로젝트 시작 시 해당 URL로 이동한다. 
	//프로젝트 실행하면 'localhost:8080//프로젝트명/' 이렇게 이동하는데, 맨끝 '/'가 해당 url 이다.
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		
		//바로 home.jsp로 이동한다.
		return "home";
	}
	
	//url에서 경로가 설정될 때 "get1 + 파라메터 값"이 나오면 해당 경로로 들어오면서 파라메터 값을 가져온다
	//파라메터를 메소드의 매개변수 처럼 받는다.(방식1)
	@RequestMapping(value = "/get1", method = RequestMethod.GET)
	public String get1(Model model,String id,String pass ) {
		logger.info("get1.jsp start["+id+" : "+pass+"]");
		
		//id와 pass라는 명칭으로 모델에 값을 담는다.
		model.addAttribute("id",id);
		model.addAttribute("pass",pass);
		
		//get1.jsp로 라우팅 한다.
		//라우팅 : 목적지 설정이란 의미로 쓰면 됨
		return "get1";
		
	}
	
	//url에서 경로가 설정될 때 "get2/id파라메터 값/pass파라메타 값"이 나오면 파마메터 값을 갖고 해당 경로로 들어온다
	//그리고 PathVariable 어노테이션으로 파라메터 값을 인식한다. (방식2)
	@RequestMapping(value = "/get2/{id}/{pass}", method = RequestMethod.GET)
	public String get2(@PathVariable("id") String id,@PathVariable("pass") String pass,Model model) {
		logger.info("get2.jsp start["+id+" : "+pass+"]");
		
		//id와 pass라는 명칭으로 모델에 값을 담는다.
		model.addAttribute("id",id);
		model.addAttribute("pass",pass);
		
		//get2.jsp로 라우팅 한다.
		return "get2";
	}
	
	//url에서 경로가 설정될 때 "post1"이 나오면 해당 경로로 들어온다
	//form 형태로 파라메터 값이 들어온다.
	//모든 파라메터 값을 매개변수 형식으로 받는다.
	@RequestMapping(value = "/post1", method = RequestMethod.POST)
	public String post1(Model model,String name,String studentid,String kor,String eng,String mat) throws UnsupportedEncodingException {
		logger.info("post1.jsp start["+name+" : "+studentid+" : "+kor+" : "+eng+" : "+mat+"]");
		
		//이름은 한글이기 때문에 한글처리 해준다.
		//name = new String(name.getBytes("8859_1"),"utf-8");
		
		//각 요소들의 이름과 값을 정해서 model에 넣는다.
		model.addAttribute("name",name);		//이름
		model.addAttribute("studentid",studentid);	//학번
		model.addAttribute("kor",kor);	//국어
		model.addAttribute("eng",eng);	//영어
		model.addAttribute("mat",mat);	//수학
	
		//post1.jsp로 라우팅 한다.
		return "post1";
	}
	
	//url에서 경로가 설정될 때 "post2"이 나오면 해당 경로로 들어온다
	//파라메터 값을 보내는건 같은데, 위와 다르게 클래스 형태로 값을 받는다.
	//이름이 맞으면 매칭이 되어서 인식이 되고 해당 객체 통으로 값을 넘길 수 있다.
	@RequestMapping(value = "/post2", method = RequestMethod.POST)
	public String post2(Model model,ExamRIO exam) throws UnsupportedEncodingException {
		logger.info("post2.jsp start["+exam.getName()+" : "+exam.getStudentid()+" : "+exam.getKor()+" : "+exam.getEng()+" : "+exam.getMat()+"]");
		
		//이름은 한글이기 때문에 한글처리 해준다.
		//exam.setName(new String(exam.getName().getBytes("8859_1"),"utf-8"));
		
		//각 요소들의 이름과 값을 정해서 model에 넣는다.
		model.addAttribute("exam",exam);
		
		//post2.jsp로 라우팅 한다.
		return "post2";
	}
	
}

 

화면 출력 결과

<home.jsp>(여기에서 파라메터 값을 보냄)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>

<!-- controller 안에서의 매개변수 이름과 view에서 설정하는 name값이 일치해야 매칭이 된다.  -->

<hr>
<!-- get방식으로 URL뒤에 파라미터 이름과 값을 보낸다.(가존 보내던 방식) -->
<!-- 아래처럼 보내면 ''도 같이 보내진다. -->
	get방식 일반<a href="./get1?id='abc'&pass='111'">./get1?id='abc'&pass='111'</a>
<hr>
<!-- 
controller 쪽에서 "/get2/{id}/{pass}" 이렇게 설정을 했는데 중괄호 안에 있는 것이 
parameter이름이다. 이것에 맞게 URL에 /하고 값을 넣어주면 해당 이름으로 값이 넘어간다. 
-->
	get방식 스프링 타입<a href="./get2/abc/111">./get2/abc/111</a>
<hr>
<!-- controller에서 매개변수로 설정한 값과 input태그의 이름이 일치해야 한다. -->
<!-- 해당 URL로 보낼 때 각 파라메터 이름을 인식해서 model에 값을 넣고  해당 경로로 이동한다. -->
	post방식 일반
	<form action="./post1" method="post">
		이름: <input type="text" name="name" value="나영"><br>
		학번: <input type="text" name="studentid" value="209901"><br>
		국어: <input type="text" name="kor" value="90"><br>
		영어: <input type="text" name="eng" value="100"><br>
		수학: <input type="text" name="mat" value="80"><br>
		<input type="submit" value="post1">	
	</form>
<hr>
<!-- 
controller에서 해당 클래스 객체 이름으로 값을 보낸다. 여기서도 파라메터의 이름값이 틀리면 안되는데 
클래스 객체 ExamRIO안에 있는 변수를 참고하는 것이 아니라 getter, setter메소드에서 get, set제거하고 난 뒤의
이름을 참고하는 것 같다.(getter, setter메소드의  이름들을 바꿔주니 name값 바꿔도 값이 날라간다 .)
-->
	post방식 묶어 처리
	<form action="./post2" method="post">
		이름: <input type="text" name="name" value="나영"><br>
		학번: <input type="text" name="studentid" value="209901"><br>
		국어: <input type="text" name="kor" value="90"><br>
		영어: <input type="text" name="eng" value="100"><br>
		수학: <input type="text" name="mat" value="80"><br>
		<input type="submit" value="post2">	
	</form>
</body>
</html>

1. get방식 일반(./get1?id='abc'&pass='111')

 

해당 링크를 클릭 시 url이 'get1?id='abc'&pass='111''이 되면서 Controller로 요청이 간다. 

 

Controller는 get1을 매핑하고 파라메터 값인 id와 pass는 매개변수로서 읽는다. (위 HomeController.java 참조) 그리고 모델에 파라메터 값을 담아서 get1.jsp 로 간다.

 

<get1.jsp>(모델값 출력)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	get1  
</h1>

<hr>
<!-- el(expression languige)를 통해서 넘겨준 값을 받아옴 -->
id=${id} <br>
pass=${pass} <br>

</body>
</html>

 

2. get방식 스프링 타입(./get2/abc/111)

 

해당 링크를 클릭 시 url이 'get2/abc/111'이 되면서 Controller로 요청이 간다. 

 

Controller는 get2/{id}/{pass}을 매핑하고 파라메터 값인 id와 pass는

@PathVariable("파라메터 이름") 를 적어줘서 중괄호 안의 값이 파라메터 값임을 명시한다. (위 HomeController.java 참조) 그리고 모델에 파라메터 값을 담아서 get2.jsp 로 간다.

 

<get2.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>
	get2
</h1>
<hr>
<!-- el(expression languige)를 통해서 넘겨준 값을 받아옴 -->
id = ${id}<br>
pass = ${pass}<br>

</body>
</html>

3. post방식 일반(./post1)

 

해당 링크를 클릭 시 url이 'post1'이 되면서 Controller로 요청이 간다. 

 

요청이 갈 때 form으로 input 태그들의 값을 감싸면서 파라메터 값이 보내진다. 

 

Controller는 post1을 매핑하고 

 

input태그 안의 name을 매개변수로서 인식한다.(그래서 input태그의 name과 controller의 매개변수 이름이 일치해야 한다.)

 

그리고 파라메터 값들을 모델에 담고 post1.jsp로 이동한다.(위 controller참고)

 

<post1.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>
	post1
</h1>
<hr>
<!-- el(expression languige)태그를 통해서 넘겨준 값을 받아옴 -->
이름 : ${name}<br>
학번 : ${studentid}<br>
국어 : ${kor}<br>
영어 : ${eng}<br>
수학 : ${mat}<br>


</body>
</html>

3. post방식 묶어서 처리(./post2)

 

해당 링크를 클릭 시 url이 'post2'이 되면서 Controller로 요청이 간다. 

 

요청이 갈 때 form으로 input 태그들의 값을 감싸면서 파라메터 값이 보내진다. 

 

Controller는 post2을 매핑하고 

 

input태그 안의 name을 매개변수로서 인식한다.(그래서 input태그의 name과 controller의 매개변수 이름이 일치해야 한다.)

 

인식을 하는데 각각의 데이터가 따로 매개 변수로서 있는게 아니라 데이터들을 묶은 형태로 파마메터 값을 받을 수 있다. 나는 위에서 ExamRIO클래스로 이름,학번,국어,영어,수학의 데이터를 담을 수 있게 하였는데, Spring에서 input태그의 name과 ExamRIO의 데이터의 이름이 같다면 알아서 매핑이 되어서 값을 인식 할 수 있다.

 

파라메터 값들을 묶은 ExamRIO형의 객체를 모델에 담고 post2.jsp로 이동한다.(위 controller참고)

 

<post2.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>
	post2
</h1>
<hr>
<!-- el(expression languige)태그를 통해서 넘겨준 값을 받아옴 -->
<!-- 클래스 형을 받아왔기 때문에 그 안에서 값을 호출해야 하는데 getter메소드만 가능한 것이아니라 -->
<!-- 그냥 변수를 넣어도 가능하다 .-->
이름 : ${exam.name}<br>
학번 : ${exam.studentid}<br>
국어 : ${exam.kor}<br>
영어 : ${exam.eng}<br>
수학 : ${exam.mat}<br>
</body>
</html>

 

 

 

 

 

 

 

Comments