* admin์ ์ํ ์ปจํธ๋กค๋ฌ ์ถ๊ฐ
์ฌ์ฉ์์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ก์ด ์ปจํธ๋กค๋ฌ๋ฅผ ์ถ๊ฐํ๋ค.
NoticeController.java (com.newlecture.web.controller.admin.board)
@Controller("adminNoticeController")
@RequestMapping("/admin/board/notice/")
public class NoticeController {
@RequestMapping("list")
public String list() {
return "";
}
@RequestMapping("reg")
@ResponseBody //์
๋ ฅ๊ฐ์ ์ฌ์ฉ์์๊ฒ ๋ค์ ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํ๊ธฐ ์ํด์ ์ฌ์ฉ
public String reg() {
return "reg";
}
@RequestMapping("edit")
public String edit() {
return "";
}
@RequestMapping("del")
public String del() {
return "";
}
}
@Controller ์ด๋ ธํ ์ด์ ์ ์ด๋ฆ์ ์ง์ ํ ์ด์ ๋, ๋ค๋ฅธ ํจํค์ง์ ๊ฐ์ ์ด๋ฆ์ NoticeController๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋น์ ์์ฑํ ๋ ์ด๋ฆ์ด ๊ฒน์ณ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ฌ์ฉ์์ ๊ฐ์ ์ ๋ ฅ ๋ฐ์ reg ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ "http://localhost:8080/admin/board/notice/reg" url ์์ฒญ์ ํ๋ฉด ํ๋ฉด์ reg๊ฐ ๋ฌ๋ค. @ResponseBody ์ด๋ ธํ ์ด์ ์ ํตํด ์์ฒญํ ๊ฐ์ ๊ทธ๋๋ก ํ๋ฉด์ ์ถ๋ ฅํ์๋ค.
* POST ์ ๋ ฅ ๋ฐฉ๋ฒ - ํ ์คํธ ๋ฐ์ค
์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ์์ฌ ์ ์๋ ๊ธ์ฐ๊ธฐ ํ๋ฉด์ ์คํํด ๋ณด์.
html, css, image, js ๋ฑ ์ ์ ํ์ผ์ static ํด๋์ ๋ชฐ์์ ๋ฃ์ด๋์๋ค. ์คํํ ๋๋
localhost:8080/static/admin/board/notice/reg.html์ด ์๋
localhost:8080/admin/board/notice/reg.html์ผ๋ก ์์ฒญํด์ผ ํ๋ค.
๊ทธ ์ด์ ๋ ๋งคํ ๋ฐฉ์์์ ์ฐพ์๋ณผ ์ ์๋ค.
servlet-context.xml
<mvc:resources location="/static/" mapping="/**"></mvc:resources>
"/**"์ผ๋ก ์์ฒญ์ด ์์ ๋(mapping) "/static/" ๊ฒฝ๋ก์์ ์ฐพ์๋ณด๊ฒ ์ฒ๋ฆฌํ์๋ค(location). (์ ์ ํ์ผ ๋งคํ ํฌ์คํ ์ฐธ๊ณ )
"localhost:8080/static/admin/board/notice/reg.html" ์์ฒญ์ ํ๋ฉด ํ๋ฉด์ reg๊ฐ ์ถ๋ ฅ๋๋๋ฐ, NoticeContoller์์ "/reg"๋ผ๋ url๋ก ๋งคํ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
NoticeController.java
@RequestMapping("reg")
@ResponseBody
public String reg() {
return String.format("title:%s, content:%s<br>", title, content);
}
reg.html ํ์ผ์ ์ด๋ฆ์ reg1.html์ผ๋ก ์์ ํ ํ ๋ค์ ์คํํ๋ค.
reg1.html
<form action="reg" method="post">
<div class="margin-top first">
<h3 class="hidden">๊ณต์ง์ฌํญ ์
๋ ฅ</h3>
<table class="table">
<tbody>
<tr>
<th>์ ๋ชฉ</th>
<td class="text-align-left text-indent text-strong text-orange" colspan="3">
<input type="text" name="title" />
</td>
</tr>
<tr>
<th>์ฒจ๋ถํ์ผ</th>
<td colspan="3" class="text-align-left text-indent"><input type="file" name="file" /> </td>
</tr>
<tr class="content">
<td colspan="4"><textarea class="content" name="content"></textarea></td>
</tr>
<tr>
<td colspan="4" class="text-align-right"><input class="vertical-align" type="checkbox" id="open" name="open" value="true">
<label for="open" class="margin-left">๋ฐ๋ก๊ณต๊ฐ</label>
</td>
</tr>
</tbody>
</table>
</div>
<div class="margin-top text-align-center">
<input class="btn-text btn-default" type="submit" value="๋ฑ๋ก" />
<a class="btn-text btn-cancel" href="list.html">์ทจ์</a>
</div>
</form>
form ํ๊ทธ์ action ๊ฒฝ๋ก๋ "reg"์ผ๋ก ์ค์ ๋์ด ์๋ค. ์ ๋ชฉ๊ณผ ๋ด์ฉ input์ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ณ submit ๋ฒํผ(๋ฑ๋ก)์ ํด๋ฆญํ๋ฉด ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ ๊ฐ์ ํ๋ฉด์ ์ถ๋ ฅํ๋ค.
form ํ๊ทธ๋ action="reg"์ผ๋ก ์ค์ ๋์ด ์๋๋ฐ, submit ํด๋ฆญ ์ admin/board/notice/reg1.html์ ๊ฐ์ ์์น์์ ์์ํด์ admin/board/notice/reg์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๋ฐ๊ฒ ๋๋ค. <form action="/admin/board/notice/reg"...>์ผ๋ก ์ค์ ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
(๋ง์ฝ action="admin/board/notice/reg" ์ด๋ผ๋ฉด http://localhost:8080/admin/board/notice/admin/board/notice/์ด ๋จ)
* POST ์ ๋ ฅ ๋ฐฉ๋ฒ - ์ฝค๋ณด ๋ฐ์ค
reg1.html
<form action="reg" method="post">
<div class="margin-top first">
<h3 class="hidden">๊ณต์ง์ฌํญ ์
๋ ฅ</h3>
<table class="table">
<tbody>
<tr>
<th>์ ๋ชฉ</th>
<td class="text-align-left text-indent text-strong text-orange" colspan="3">
<input type="text" name="title" />
</td>
</tr>
<tr>
<th>์นดํ
๊ณ ๋ฆฌ</th>
<td class="text-align-left text-indent text-strong text-orange" colspan="3">
<select name="category">
<option value="1">์นดํ
๊ณ ๋ฆฌ1</option>
<option value="2">์นดํ
๊ณ ๋ฆฌ2</option>
<option value="3">์นดํ
๊ณ ๋ฆฌ3</option>
<option value="4">์นดํ
๊ณ ๋ฆฌ4</option>
</select>
</td>
</tr>
<tr>
<th>์ฒจ๋ถํ์ผ</th>
<td colspan="3" class="text-align-left text-indent"><input type="file" name="file" /> </td>
</tr>
<tr class="content">
<td colspan="4"><textarea class="content" name="content"></textarea></td>
</tr>
<tr>
<td colspan="4" class="text-align-right"><input class="vertical-align" type="checkbox" id="open" name="open" value="true">
<label for="open" class="margin-left">๋ฐ๋ก๊ณต๊ฐ</label>
</td>
</tr>
</tbody>
</table>
</div>
<div class="margin-top text-align-center">
<input class="btn-text btn-default" type="submit" value="๋ฑ๋ก" />
<a class="btn-text btn-cancel" href="list.html">์ทจ์</a>
</div>
</form>
์ ๋ชฉ ๋ฐ์ ์นดํ ๊ณ ๋ฆฌ๋ผ๋ select ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ค.
โป ์ฐธ๊ณ
์ต์ ํ๊ทธ์ value๊ฐ ์๋ค๋ฉด?
(ex. <option>์นดํ ๊ณ ๋ฆฌ1</option>)
ํด๋น ์ต์ ์ ์ ํํ๊ณ submitํ๋ฉด ํ๋ฉด์์ ํ๊ธ์ด ๊นจ์ ธ์ ์ถ๋ ฅ๋๋ค. servlet-context.xml์์ ๋ฉ์์ง ์ปจ๋ฒํฐ ์ค์ ์ ํตํด @ResponseBody์ String ํ๊ธ ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ์ถ๋ ฅํ ๋์ ๋ฌธ์ ๋ ์๋๊ณ ์ ๋ ฅ๋ฐ์ ๋์ ์ธ์ฝ๋ฉ ๋ฌธ์ ์ด๋ค. (@ResponseBody => ์ถ๋ ฅ ๊ฐ์ ๊ดํ ์ค์ )
<mvc:annotation-driven>
<mvc:message-converters>
<!--
@ResponseBody๋ก String ์ฒ๋ฆฌํ ๋ ํ๊ธ ์ฒ๋ฆฌ
๋งคํ๋ url์ ์ฐพ์๊ฐ ํ ๊ฐ์ ResponseBody ํ์
์ผ๋ก ๊ฐ์ ๋ฆฌํดํ ๋, ๋ฐํํ๋ ๊ฐ์ด ํ๊ธ์ด๋ผ๋ฉด ๊ฐ๋ก์ฑ์ ํ๊ธ ์ค์ .
์ถ๋ ฅํ ๋ ํ๊ธ์ด ๊นจ์ง์ง ์๊ฒ ํจ.
-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
NoticeController.java
@RequestMapping("reg")
@ResponseBody
public String reg(String title, String content, String category) {
return String.format("title:%s, content:%s<br>category:%s", title, content, category);
}
category ๊ฐ๋ ์ถ๋ ฅํ ์ ์๋๋ก ์ปจํธ๋กค๋ฌ๋ฅผ ์์ ํ๊ณ ์คํํ๋ฉด ํ๋ฉด์ ์นดํ ๊ณ ๋ฆฌ๊ฐ option์ value ๊ฐ์ผ๋ก ์ถ๋ ฅ๋๋ค.
* POST ์ ๋ ฅ ๋ฐฉ๋ฒ - ์ฒดํฌ ๋ฐ์ค
reg1.html
<tr>
<th>์ข์ํ๋ ์์</th>
<td class="text-align-left text-indent text-strong text-orange" colspan="3">
<input type="checkbox" name="foods" value="1" id="ch1"><label for="ch1">์์ฅ๋ฉด</label>
<input type="checkbox" name="foods" value="2" id="ch2"><label for="ch2">์งฌ๋ฝ</label>
<input type="checkbox" name="foods" value="3" id="ch3"><label for="ch3">๋ณถ์๋ฐฅ</label>
<input type="checkbox" name="foods" value="4" id="ch4"><label for="ch4">ํ์์ก</label>
</td>
</tr>
reg1.html์ ์ฒดํฌ๋ฐ์ค๋ฅผ ์ถ๊ฐํ๊ณ name="foods"์ผ๋ก ์ค์ ํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํ๊ณ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฐ ์ํ์์ ๋ฑ๋ก ๋ฒํผ์ ๋๋ฅธ๋ค(submit).
Network ํญ์์ reg์ ํด๋ฆญํ๋ฉด Form ํ๊ทธ๋ฅผ ํตํด ์ ์ก๋๋ ๊ฐ์ ๋ณผ ์ ์๋ค. foods์ ๊ฐ์ผ๋ก๋ ์ง์ฅ๋ฉด๊ณผ ์งฌ๋ฝ์ ๊ฐ์ธ 1, 2๊ฐ ๊ฐ๊ฐ ๋ณด์ฌ์ง๋ค.
view source๋ฅผ ํด๋ฆญํ๋ฉด ์ด์ ๊ฐ์ด ์์ฒญ url ๊ฒฝ๋ก๋ฅผ ๋ณผ ์ ์๋ค. foods๋ผ๋ ์ด๋ฆ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ด ์ ์ก๋๋ฏ๋ก ์ปจํธ๋กค๋ฌ์์๋ ๋ฐฐ์ด๋ก ๋ฐ์ผ๋ฉด ๋๋ค.
NoticeController.java
@RequestMapping("reg")
@ResponseBody //์
๋ ฅ๊ฐ์ ์ฌ์ฉ์์๊ฒ ๋ค์ ๋ณด์ฌ์ฃผ๊ธฐ๋ง ํ๊ธฐ ์ํด์ ์ฌ์ฉ
public String reg(String title, String content, String category, String[] foods) {
for(String f : foods) {
System.out.println(f);
}
return String.format("title:%s, content:%s<br>category:%s", title, content, category);
}
String[] foods, ์ฆ ๋ฐฐ์ด๋ก ๋ฐ๊ณ ์ถ๋ ฅํ๋ฉด value ๊ฐ์ด ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
* POST ์ ๋ ฅ ๋ฐฉ๋ฒ - ๋ผ๋์ค ๋ฒํผ
reg1.html
<tr>
<th>๊ฐ์ฅ ์ข์ํ๋ ์์</th>
<td class="text-align-left text-indent text-strong text-orange" colspan="3">
<input type="radio" name="food" value="1" id="rd1"><label for="rd1">์์ฅ๋ฉด</label>
<input type="radio" name="food" value="2" id="rd2"><label for="rd2">์งฌ๋ฝ</label>
<input type="radio" name="food" value="3" id="rd3"><label for="rd3">๋ณถ์๋ฐฅ</label>
<input type="radio" name="food" value="4" id="rd4"><label for="rd4">ํ์์ก</label>
</td>
</tr>
๋ผ๋์ค ๋ฒํผ์์ name์ ๋ค ๋ค๋ฅด๊ฒ ์ ํํ๋ฉด ์๋ก ๋ค๋ฅธ ํญ๋ชฉ์ ๋ฒํผ์ผ๋ก ๊ฐ์ฃผํ์ฌ ๋ค ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ๋๋ง ์ ํํ ์ ์๊ฒ ํ๋ ค๋ฉด ์ ๋ถ name์ food๋ก ๊ฐ๊ฒ ์ค์ ํด์ผ ํ๋ค.
NoticeController.java
@RequestMapping("reg")
@ResponseBody
public String reg(String title, String content, String category, String[] foods, String food) {
for(String f : foods) {
System.out.println(f);
}
return String.format("title:%s, content:%s<br>category:%s, food:%s", title, content, category, food);
}
์ปจํธ๋กค๋ฌ์์ value๋ฅผ String์ผ๋ก ๋ฐ์ผ๋ฉด ๋๋ค.
* ํ๊ธ ์ ๋ ฅ์ด ๊นจ์ง๋ ๋ฌธ์
form์์ ํ๊ธ์ ์ ๋ ฅํด์ submit ํ๋ฉด ์์ ๊ฐ์ด ๊นจ์ ธ์ ๋ํ๋๊ฒ ๋๋ค.
์ฌ์ฉ์๊ฐ ํ๊ธ์ ์ ๋ ฅํด์ ์๋ฒ์ ์ ๋ฌํ๊ณ ์ ํ ๋, ํ๊ธ์ด ์ง์ ์ ์ก๋๋ ๊ฒ์ด ์๋๋ผ ํ๊ธ์ ๋์ ํ๋ ์๋ณ์(๋ฌธ์ ์ฝ๋)๊ฐ ์ ๋ฌ๋๋ค.
UTF-8๋ก 6๋ฐ์ดํธ์ ํ๊ธ์ ์ ๋ฌํ๋ ์ํฉ์ ์๊ฐํด ๋ณด์. POST ๋ฐฉ์์ผ๋ก ์์ฒ๋ผ URL Encoding์ด ์ ๋ฌ๋ ๊ฒ์ด๋ค. ํ๊ธ ํ๋๋ 2๋ฐ์ดํธ๋ฅผ ์๋นํ๋ค. (๊ทธ๋ฆผ์์ ํ๋์ ๋ฐ์ค ํ๋๊ฐ 1๋ฐ์ดํธ)
์ด๋ ์๋ฒ์ชฝ์ ์ธ์ฝ๋ฉ์ ๋ฐ๋ผ์ ์ ๋ฌ๋ฐ์ ๊ฐ์ ํด์์ด ๋ฌ๋ผ์ง ์ ์๋ค. ํฐ์บฃ์ ๊ธฐ๋ณธ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ISO-8859-1์ด๋ฏ๋ก 1๋ฐ์ดํธ์ฉ ๋์ด์ ์ฝ๊ฒ ๋๋ค. ํน์ ๋ค๋ฅธ 2๋ฐ์ดํธ์ฉ ์ฝ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํ๋๋ผ๋ ๋ค๋ฅธ ๋ฌธ์ ์ฝ๋๋ก ํด์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์๋ชป ํด์๋๋ค.
ํด๋ผ์ด์ธํธ ์ชฝ์์ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ request๋ฅผ ํตํด ์ฝ์ด์ค๋๋ฐ ๊ทธ ๋ request.setCharacterEncoding์ ํตํด ์ธ์ฝ๋ฉ์ "UTF-8"๋ก ์ง์ ํด ์ฃผ๋ฉด ํ๊ธ์ด ๊นจ์ง๋ ๊ฒ์ ํด๊ฒฐํ ์ ์๋ค. (UTF-8๋ก ์ฝ์ด๋ผ, ๋ผ๋ ์ค์ )
๋ชจ๋ ์๋ธ๋ฆฟ๋ง๋ค ์ผ์ผ์ด request.setCharacterEncoding ์ค์ ์ ํ ์๋ ์๊ณ , <Connector URIEncoding="UTF-8"> ์ฒ๋ผ ํฐ์บฃ ์ค์ ์ ์ ๋ถ ๋ฐ๊ฟ ์๋ ์๋ค. ํ์ง๋ง ํ์์ ๋ฐฉ๋ฒ์ฒ๋ผ ํฐ์บฃ ์ ์ฒด์ ์ธ์ฝ๋ฉ์ ๋ฐ๊พธ๋ ๊ฒ์ ์ํ ์์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ธ๋ฆฟ์์ ์ธ์ฝ๋ฉ ์ค์ ์ ํด์ฃผ๋ ํธ์ด ์ข๋ค. ์ด๋, ์ ๋ ฅ์ ๋ฐ์ ๋๋ง๋ค ์๋ธ๋ฆฟ์ ์ธ์ฝ๋ฉ ์ค์ ์ ํ๋ ๊ฒ์ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ํํฐ๋ฅผ ์ด์ฉํ๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ก๋๋ ์๋ธ๋ฆฟ์ ์ธ์ฝ๋ฉ๊ณผ ๊ฐ์ ์ฌ์ ์์ ์ ํ๊ณ ์ถ์ ๋ ํํฐ๋ฅผ ์ค์ ํ ์ ์๋ค. ํํฐ๋ ์์ฒญ๊ณผ ์๋ธ๋ฆฟ์ ์ค๊ฐ ์ญํ ์ ํ๋ค. ํํฐ๋ ์ฌ๋ฌ ๊ฐ ์ค์ ํ ์๋ ์๋ค. ์ธ์ฝ๋ฉ ํํฐ, ์ฌ์ฉ์ ๊ถํ์ ์ฒ๋ฆฌํ๋ ํํฐ ๋ฑ์ด ์๋ค. ํํฐ๋ ๋ง๋ค์ด์ ์ฌ์ฉํ ์๋ ์๊ณ ์คํ๋ง์ด ์ ๊ณตํ๋ ํํฐ๋ฅผ ๊ฐ๋จํ ์ค์ ๋ง์ผ๋ก ์ฌ์ฉํ ์๋ ์๋ค.
web.xml
<filter>
<filter-name>charaterEncodingFilter</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>charaterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
web.xml์ ํํฐ ์ค์ ์ ํ๊ณ ํ๊ธ ๊ฐ์ ์ ๋ ฅ, submit ํ๋ฉด ํ๊ธ์ด ๊นจ์ง์ง ์๊ฒ ์ธ์ฝ๋ฉ ๋์์์ ํ์ธํ ์ ์๋ค.
'๐ปStudy > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
POST ์ ๋ ฅ - ํ์ผ ์ ๋ก๋ (0) | 2021.03.04 |
---|---|
์ ๋ ฅ์ ์ข ๋ฅ / QueryString ์ ๋ ฅ (0) | 2021.03.04 |
๋ฐ์ดํฐ ํํ / JSON ์ถ๋ ฅํ๊ธฐ (0) | 2021.03.03 |
@RestController์ ํ๊ธ ์ถ๋ ฅ ์ค์ (0) | 2021.03.03 |
๋ฌธ์ ์ถ๋ ฅ ๋ฐฉ๋ฒ 4๊ฐ์ง, @ResponseBody (0) | 2021.03.03 |