본문 바로가기

웹 프로그래밍

Spring - RequestMapping, Form 데이터 처리, ResponseBody 사용법

@markdown

# RequestMapping, Form 데이터 처리, ResponseBody 사용법

<br/>

## Request Mapping

____

- MethodController 작성

<pre><code class="java" style="font-size:14px">@Controller

@RequestMapping(value="/method/method.do")

public class MethodController {

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

public String callGet(){

return "method/methodForm";

}

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

public String callPost(){

return "method/methodProcess";

}

}

</code></pre>


- jsp 페이지 작성

<pre><code class="html" style="font-size:14px"><methodForm.jsp>

<body>

<form action="<%= request.getContextPath() %>/method/method.do" method="POST">

<input type="submit" value="전송"/>

</form>

</body>

</code></pre>

- methodProcess.jsp

<pre><code class="html" style="font-size:14px"><body>

<h1>MethodSpring클래스에서 호출됨</h1>

</body>

</code></pre>

<br/>


## Form 데이터 처리

- joinForm.jsp 페이지 작성

<pre><code class="html" style="font-size:14px"><body>

<form action="<%= request.getContextPath()%>/form/join.do">

아이디 : <input type="text" name="id" size="20"/><br/>

패스워드 : <input type="password" name="password" size="20"/><br/>

이름 : <input type="text" name="name" size="20"/> <br/>

<input type="submit" value="전송"/>

</form>

</body>

</code></pre>


- memberInfo.jsp 결과 확인 페이지 작성

<pre><code class="html" style="font-size:14px"><body>

<h1>회원 정보</h1>

id : ${member.id}<br/>

password : ${member.password}<br/>

name : ${member.name}<br/>

</body>

</code></pre>

<br/>

### MemberController 코드

<pre><code class="java" style="font-size:14px">@RequestMapping("/join.do")

public String join(HttpServletRequest request) {

String id = request.getParameter("id");

String password = request.getParameter("password");

String name = request.getParameter("name");

MemberVO member = new MemberVO();

member.setId(id);

member.setPassword(password);

member.setName(name);

request.setAttribute("member", member);

return "form/memberInfo";

}

</code></pre>

<br/>


### MemberController - @RequestParam 활용

<pre><code class="java" style="font-size:14px">@RequestMapping("/join.do")

public String join(HttpServletRequest request, 

@RequestParam("id") String id, 

@RequestParam("password") String pass,

@RequestParam("name") String name) {

MemberVO member = new MemberVO();

member.setId(id);

member.setPassword(pass);

member.setName(name);

request.setAttribute("member", member);

return "form/memberInfo";

}

</code></pre>

<br/>


### MemberController - @ModelAttribute 활용

- JSP에서 사용할 공유 객체명 변경

<pre><code class="java" style="font-size:14px">@RequestMapping("/join.do")

public String join(@ModelAttribute("member") MemberVO member) {

System.out.println(member.getId());

System.out.println(member.getPassword());

System.out.println(member.getName());

return "form/memberInfo";

}

</code></pre>

<br/>

### MemberController - VO 객체 활용

- return 받는 `memberInfo.jsp`에서 memberVO를 자동으로 인식하고 사용할 수 있다.

- MemberVO 클래스 이름의 소문자인 memberVO로 인식함

<pre><code class="java" style="font-size:14px">@RequestMapping("/join.do")

public String join(MemberVO member) {

System.out.println(member.getId());

System.out.println(member.getPassword());

System.out.println(member.getName());

return "form/memberInfo";

}

</code></pre>


- memberInfo.jsp 수정

<pre><code class="html" style="font-size:14px">id : ${memberVO.id}

<br /> password : ${memberVO.password}

<br /> name : ${memberVO.name}

<br />

</code></pre>

<br/>


### MemberController - ModelAndView 객체 활용

- view 페이지 및 view에서 사용할 객체 공유하는 방법

<pre><code class="java" style="font-size:14px">@RequestMapping("/join.do")

public ModelAndView join(MemberVO member) {

ModelAndView mav = new ModelAndView();

//리턴할 jsp view 이름 입력

mav.setViewName("form/memberInfo");

//공유영역에서 사용할 member 객체 등록

mav.addObject("member", member);

return mav;

}

</code></pre>

<br/>

## @ResponseBody

____

- `@ResponseBody`는 `xml` 또는 `json`과 같은 메시지 기반의 서비스를 만들 경우 사용

- 예) AJAX 서비스를 제공하는 컨트롤러


### 1. ResBodyController 만들기

<pre><code class="java" style="font-size:14px">@Controller

@RequestMapping("/ajax")

public class ResBodyController {

@RequestMapping("/resBody.do")

@ResponseBody

public String resStringBody() {

return "OK, 성공";

}

}

</code></pre>

<br/>


### 2. 한글 인코딩 처리 및 Converter 등록

- `spring-mvc.xml` 파일 수정

<pre><code class="java" style="font-size:14px"><mvc:annotation-driven>

    <mvc:message-converters>

<!-- Json 한글 인코딩 처리 등록 -->

    <bean class="org.springframework.http.converter.StringHttpMessageConverter">

    <property name="supportedMediaTypes">

    <list>

    <value>text/html; charset=utf-8</value>

    </list>

    </property>

    </bean>

<!-- Json 처리 컨버터 등록 -->

    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

    <property name="supportedMediaTypes">

    <list>

    <value>text/html; charset=utf-8</value>

    <value>application/json; charset=utf-8</value>

    </list>

    </property>

    </bean>

    </mvc:message-converters>

    </mvc:annotation-driven>

</code></pre>

<br/>


### 3. JSON 응답 처리

- ResBodyController 코드 추가

- Map, List, VO 등 다양한 자료형으로 JSON 응답 처리할 수 있다.

<pre><code class="java" style="font-size:14px">@ResponseBody

public Map<String, String> resJsonBody() {

Map<String, String> result = new HashMap<String, String>();

result.put("id", "user");

result.put("name", "lee");

result.put("addr", "서울");

return result;

}

@RequestMapping("/resVOBody.json")

@ResponseBody

public MemberVO resJsonVOBody() {

MemberVO vo = new MemberVO();

vo.setId("user");

vo.setName("lee");

vo.setPassword("1234");

return vo;

}

@RequestMapping("/resVOListBody.json")

@ResponseBody

public List<MemberVO> resJsonVOListBody() {

List<MemberVO> list = new ArrayList<>();

for (int i = 1; i < 4; i++) {

MemberVO vo = new MemberVO();

vo.setId("sbc");

vo.setName("sbc");

vo.setPassword("1234");

list.add(vo);

}

return list;

}

</code></pre>

<br/>


### 4. 관련 라이브러리 denpendency 라이브러리 설정

- `pom.xml` 파일 dependency 추가

- `MappingJackson2HttpMessageConverter`에서 사용하는 라이브러리 다운로드


<pre><code class="java" style="font-size:14px"><dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-core</artifactId>

<version>2.8.9</version>

</dependency>


<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-annotations</artifactId>

<version>2.8.9</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.8.9</version>

</dependency>

</code></pre>

<br/>


### 5. JSON URL 매핑 등록

- `web.xml 파일 수정`

<pre><code class="java" style="font-size:14px"><servlet-mapping>

<servlet-name>dispatcher</servlet-name>

<url-pattern>*.json</url-pattern>

</servlet-mapping>

</code></pre>

<br/>


### 6. 호출

<pre><code class="html" style="font-size:14px"><a href="<%=request.getContextPath() %>/ajax/resBody.json">

JSON 응답

</a><br />

</code></pre>

<br/>

## Controller 없이 페이지 매핑하기

____

- fileUploadForm.jsp

<pre><code class="html" style="font-size:14px"><body>

<h2>파일 업로드 테스트</h2>

<form action="<%= request.getContextPath() %>/file/upload.do"

     method="post"

     enctype="multipart/form-data">

<input type="text" name="id" value="test" /><br/>

<input type="file" name="attachfile1" /><br/>

<input type="file" name="attachfile2" /><br/>

<input type="submit" value="업로드" />

</form>

</body>

</code></pre>

- spring-mvc.xml 파일에 내용 추가


<pre><code class="java" style="font-size:14px"><mvc:view-controller path="/file/uploadForm.do" view-name="file/fileUploadForm"/>

</code></pre>


- 호출할 index.jsp 페이지에서 `.do` 호출

<pre><code class="html" style="font-size:14px"><a href="<%= request.getContextPath() %>/upload/uploadForm.do">

파일업로드

</a><br/>

</code></pre>

- 호출 순서 : `/uploadForm.do` -> `mvc:view-controller path` -> `fileUploadForm.jsp` 요청