728x90
300x250

[Spring-Framework] 9. MVC웹 - POST, GET 방식, c태그 목록 출력


웹 게시판 작성에서 필요한 POST, GET 방식 처리에 대해서 Spring-Framework를 통해서 소개하려고 한다.

자료구조(Data Structure)인 List, Hash-Map에 대한 내용은 생략하겠다.


일반 범용 "게시판"에서 사용될 수 있는 것 위주로 작성하였다.


* IDE: Spring Tool-Suite 4(Eclipse)

-> Spring Legacy Project의 Spring MVC Project를 기반으로 작성함.





1. 결과부터 살펴보는 POST, GET 방식 처리


크게 데이터를 전송하는 방식에는 POST, GET 방식이 있다.

기능으로 요약하면, 외부에 노출되서 전송되는 방식은 GET이고, 숨겨서 전송하는 방식은 POST방식이다.


이 프로젝트의 특징은 추후에 MyBatis 등의 라이브러리까지 고민하여 작성하였다.




그림 1. 글쓰기 양식



그림 2. POST 방식 처리 - Map 목록 출력




그림 3. GET 방식 처리 - List 목록 출력





2. 프로젝트


Controller, VO(Value Object)는 다음처럼 해준다.



그림 4. 프로젝트 구성(Controller와 VO)



View 영역은 아래처럼 구성해준다.



그림 5. 프로젝트 구성(view영역의 jsp 파일)





3. 코드(MemberVO)


MemberVO는 매우 간단하게 작성하였다.


package com.springMVC1.web.vo;


public class MemberVO {


private String id;

private String passwd;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getPasswd() {

return passwd;

}

public void setPasswd(String passwd) {

this.passwd = passwd;

}

}



파일명: MemberVO.java




4. 코드(Controller - BoardController)


BoardController를 구성해보았다.


package com.springMVC1.web.controller;


import java.text.DateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Locale;

import java.util.Map;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

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

import org.springframework.web.bind.annotation.RequestMethod;


import com.springMVC1.web.vo.MemberVO;



@Controller

@RequestMapping(value="/board")

public class BoardController {

private static final Logger logger = LoggerFactory.getLogger(BoardController.class);

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

public String list(Locale locale, Model model) {

logger.info("Welcome board - list! The client locale is {}.", locale);

Date date = new Date();

DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

String formattedDate = dateFormat.format(date);

model.addAttribute("serverTime", formattedDate );

return "/board/list";

}

// GET, POST 방식 모두 가능

@RequestMapping(value = "insert")

public String insert(Locale locale, Model model) {

return "/board/insert";

}

// POST방식만 사용

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

public String insertResult(Model model, MemberVO memberVO) {

model.addAttribute("serverTime", "1군");


logger.info("로거 사용"); // 로거

HashMap<String, Object> map = new HashMap<String, Object>();

MemberVO node1 = new MemberVO();

// 1번 회원

node1.setId("user1");

node1.setPasswd("1234");

map.put("1", node1);

// 2번 회원

node1 = new MemberVO();

node1.setId("user2");

node1.setPasswd("9876");

map.put("2", node1);

// model 속성으로 등록

model.addAttribute("map", map);

return "/board/insert_result_post";

}

// GET방식만 사용 - 편법(매개변수 하나 더 추가) 

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

public String insertResult(Model model, MemberVO memberVO, String s) {

model.addAttribute("serverTime", "2군");


logger.info("로거 사용"); // 로거

// 다중 회원 목록 출력 실험

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

MemberVO node1 = new MemberVO();

// 1번 회원

node1.setId("user1");

node1.setPasswd("1234");

member.add(node1);

// 2번 회원

node1 = new MemberVO();

node1.setId("user2");

node1.setPasswd("9876");

member.add(node1);

model.addAttribute("list", member);

return "/board/insert_result_get";

}

}


파일명: BoardController.java


이 프로젝트에서 POST, GET을 하나의 RequestMapping Value값 "insertResult"로 처리하는 방법에 대해서 소개하고 있다.




5. 코드(View - JSP 파일)


insert.jsp 파일을 기반으로 POST, GET 방식 실험을 동시에 할 수 있도록 설계하였다.


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>글쓰기 - 양식</title>

</head>

<body>


<%

String context = request.getContextPath();

%>

<h3>POST 방식</h3>

<form action="<%=context%>/board/insertResult" method="POST">

ID: <input type="text" name="id"><br/>

비밀번호: <input type="password" name="passwd"><br/>

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

</form>

<br />

<h3>GET 방식</h3>

<form action="<%=context%>/board/insertResult" method="GET">

ID: <input type="text" name="id"><br/>

비밀번호: <input type="password" name="passwd"><br/>

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

</form>


</body>

</html>


파일: /board/insert.jsp


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>등록 결과 - GET방식(실험)</title>

</head>

<body>


<!-- 결과 -->

<h3>GET 방식 - 실험</h3>

<h5>GET으로 전송받은 데이터</h5>

<table border="1" style="width:500px">

<tr>

<td>서버시간</td>

<td>${serverTime }</td>

</tr>

<tr>

<td>ID</td>

<td>${memberVO.id}</td>

</tr>

<tr>

<td>비밀번호</td>

<td>${memberVO.passwd }</td>

</tr>

</table>

<br />

<h5>ArrayList 결과 출력하기</h5>

<!-- 다중 회원 출력 -->

<table border="1" style="width:500px">


<c:forEach items="${list}" var="list">

<tr>

<td>ID</td>

<td>${list.id}</td>

<td>비밀번호</td>

<td>${list.passwd }</td>

</tr>

</c:forEach>

</table>


</body>

</html>


파일: /board/insert_result_get.jsp


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>


<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>등록 결과 - Post방식(실험)</title>

</head>

<body>


<!-- 결과 -->

<h3>POST 방식 - 실험</h3>

<br/>

<table border="1" style="width:500px">

<tr>

<td>서버시간</td>

<td>${serverTime }</td>

</tr>

<tr>

<td>ID</td>

<td>${memberVO.id}</td>

</tr>

<tr>

<td>비밀번호</td>

<td>${memberVO.passwd }</td>

</tr>

</table>


<h5>Map 결과 출력하기</h5>

<!-- 다중 회원 출력 -->

<table border="1" style="width:700px">


<c:forEach items="${map}" var="i">

<tr>

<td style="width:50px">1. Key값</td>

<td style="width:150px">${i.key}</td>

<td style="width:50px">2. 객체주소</td>

<td style="width:200px">${i.value}</td>

<%

%>

<td style="width:50px">3. 객체값(ID)</td>

<td style="width:100px">${i.value.id}</td>

<td style="width:50px">3. 객체값(Passwd)</td>

<td style="width:100px">${i.value.passwd}</td>

</tr>

</c:forEach>

</table>


</body>

</html>


파일: /board/insert_result_post.jsp


* 형식문자

-> 년도 출력

<fmt:formatNumber value="${변수명}" pattern="yyyy-mm-dd" />

<fmt:formatNumber value="${객체명.멤버변수명}" pattern="yyyy-mm-dd" />



* 맺음글(Conclusion)


게시판 구현에 대해서 조금 더 쉽게 접근할 수 있는 방법에 대해서 소개하였다.

복잡한 기능들 다 제거해보았더니, 나름대로 Spring-Framework도 쉽고 빠르게 접근할 수 있다고 본다.

반응형
728x90
300x250

[Spring-Framework] 8. Spring MVC 웹 프로젝트 생성하기, UTF-8 문제(1)


Spring MVC 프로젝트를 이해하기 위해서는 몇 가지 가벼운 지식이 요구된다.


* 웹 서버: Apache Tomcat 9

  - JSP/Servlet 기초 이해력

* 라이브러리: Maven(메이븐)

* Spring 프레임워크없이, JSP/Servlet 기반으로 MVC2를 직접 구현할 수 있는 수준


jQuery, Ajax 등 기반으로 만들어진 시중 책들이 굉장히 많은데 이건 별도의 영역이다.

같이 취급해서는 안 된다고 본다.


엄밀히 보면, jQuery나 Ajax는 javascript 영역이다.


시중 책들이 워낙 어렵게 소개되고 있어서 간단하고 알기 쉽게 소개하려고 한다.


운영체제: Microsoft Windows 10

개발환경: Spring Tool-Suite 4-4.7.2. Release (Eclipse 기반 개발)

웹 서버: apache-tomcat-9.0.37-windows-x64




1. Eclipse Marketplace에서 "Spring Tools 3 Add-On for Spring Tools 4 3.9.14. RELEASE" 설치하기

(부재: Spring Legacy Project 기능 추가하기)


Spring MVC Project를 쉽고 빠르게 사용하려면, Spring Legacy Project 기능을 설치해야 한다.

현재 최신 STS 4-4.7.2를 보면, Spring Boot나 Spring Starter 등 최신 기능을 주력으로 하는 것 같다.



그림 1. Eclipse의 Help 메뉴


"Help->Eclipse Marketplace"를 들어간다.



그림 2. STS 검색하기


sts를 검색한다.

"Spring Tools 3 Add-On for Spring Tools 4 3.9.14. RELEASE"를 Install한다.


(중략함. 설치 과정 자체가 쉬움.)



2. 새 프로젝트 만들기


File-> New-> Others를 누른다.



그림 3. Project 생성하기


Spring 폴더의 Spring Legacy Project를 선택한다.

Next를 누른다.



그림 4. Project 생성하기


Spring MVC Project를 선택한 후 Next를 누른다.




그림 5. Project 생성하기


프로젝트 상위 패키지명을 입력한 후 Finish를 누른다.


의외로 쉽게 MVC 프로젝트가 생성되는 것을 확인할 수 있다.

참고로 com.springMVC1.web으로 작성하면, 태스트 배포 주소는 "홈페이지주소:8080/web"이 된다.



3. 신규 프로젝트 구경하기


시작이 반이다.

Spring MVC에 겁먹지 말고, 프로젝트를 구경해보기 바란다.



그림 6. Controller 모습



그림 7. View 영역의 WEB-INF/views/home.jsp 모습





그림 8. servlet-context.xml


과거에는 힘들게 servlet-context.xml을 작성하였지만, 지금은 힘들게 작성할 필요는 없다.


<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/mvc"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:beans="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd

http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">


<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!-- Enables the Spring MVC @Controller programming model -->

<annotation-driven />


<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->

<resources mapping="/resources/**" location="/resources/" />


<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<beans:property name="prefix" value="/WEB-INF/views/" />

<beans:property name="suffix" value=".jsp" />

</beans:bean>

<context:component-scan base-package="com.springMVC1.web" />

</beans:beans>


* 소스코드 원문: servlet-context.xml





그림 9. root-context.xml





그림 10. servlet-context.xml


web.xml 파일이다. 

servlet 작성하면서, 작업해본 경험이 있을 수 있다. 동일하게 사용할 수 있다.

참고로 maven으로 웹 프로젝트를 개설하면, 자동으로 생성된다.



그림 11. pom.xml


Spring Framework는 maven 프로젝트의 핵심인 pom.xml 기능을 그대로 사용할 수 있다.




그림 12. Hello World - 초기 접속


Spring MVC를 처음으로 구성하고 접속해보면, 그림 12의 화면을 볼 수 있다.



4. 한글 문제 해결하기(UTF-8 문제)


한글 문제 해결에 관한 이슈이다.

web.xml 파일을 수정하여 해결할 수 있다.



그림 13. 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>


<!-- UTF-8 -->

<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>



* 파일명: web.xml


[첨부(Attachments)]

web.zip



그림 14. 한글 문제가 해결된 모습




5. Controller - 입문하기


Spring MVC Controller를 활용하여 쉽고 간단하게 작성하는 방법을 소개하겠다.



그림 15. 클래스 만들기(Controller로 개조 예정)


패키지에서 오른쪽 버튼을 클릭한다.

New->Class를 클릭한다.

"BoardController"를 하나 만들어준다.



그림 16. 클래스 만들기(Controller) - HomeController.java


HomeController의 내용을 신규 생성한 "BoardController.java" 파일을 열어서 복사, 붙여넣기를 해준다.




그림 17. 클래스 만들기(Controller) - BoardController.java


편집을 완료한 BoardController의 모습이다.


정정: 

(1) HomeController.class -> BoardController.class로 변경 (탈자)
(2) Welcome home: The ..... -> Welcome board: The...로 변경





그림 18. lisp.jsp 생성하기 -> src/main/webapp/WEB-INF/views/board/list.jsp


views내에 board폴더를 만든다.

board폴더 내에 list.jsp 파일을 만든다.



그림 19. 서버를 로드했을 때 모습 - STS 4


Spring-Framework MVC를 웹서버에서 실행시켜보면, 매우 간단한 구조로 동작하는 모습을 살펴볼 수 있다.

web.xml 파일 수정도 안 했으며, Controller하고 list.jsp 파일만 만들었는데 작동하는 모습을 보면, 프레임워크가 좋긴 좋다는 것을 느낄 수 있다.



그림 20. board/list 호출한 결과



* 맺음글(Conclusion)


매우 간단한 형태로 Spring MVC Project를 구성하는 방법에 대해서 소개하였다.


반응형

+ Recent posts