파게로그

[Spring MVC] POST 입력 및 한글 깨짐 본문

콤퓨타 왕기초/Spring

[Spring MVC] POST 입력 및 한글 깨짐

파게 2021. 5. 3. 04:52

POST 입력을 위해 Admin Controller가 필요하다.

com.ddoongi.web.controller.admin.board에 EmpController를 만들어준다.

 

@Controller("adminEmpController")
@RequestMapping("/admin/board/emp/")
public class EmpController {
    @RequestMapping("/list")
    public String list() {
        return "list";
    }
    
    @RequestMapping("/reg")
    @ResponseBody
    public String reg() {
    	return "reg";
    }
    
    @RequestMapping("/edit")
    public String edit() {
    	return "edit";
    }
    
    @RequestMapping("/del")
    public String del() {
    	return "del";
    }
}

 

 

사용자가 입력할 수 있느 페이지를 마련해준다.

webapp/static/admin/board/event/emp/reg.html

 

근데 이게 RequestMapping이 패턴 기반이라 reg.html로 접속해도 reg Controller로 연결되어버린다.

(임시방편으로 reg.html 대신 reg1.html 이런식으로 이름 바꾸어주기)

 

어쨌든..

<form action="reg" method="post">

<input type="text" name="title" />

<input type="text" name="content" />

</form>

 

이렇게 하고

 

@Controller("adminEmpController")
@RequestMapping("/admin/board/emp/")
public class EmpController {
    @RequestMapping("/list")
    public String list() {
        return "list";
    }
    
    @RequestMapping("/reg")
    @ResponseBody
    // public String reg(HttpServletRequest request) 도 가능은 하다. 선호되지는 않음.
    public String reg(String title, String content) {
    	return "title:"+title+"<br/>"+"content:"+content;
    }
    
    @RequestMapping("/edit")
    public String edit() {
    	return "edit";
    }
    
    @RequestMapping("/del")
    public String del() {
    	return "del";
    }
}

 

이렇게 받아서 사용하면 된다.

 

 


 

 

콤보박스 값 입력

 

드롭다운 메뉴를 말한다.

 

<select name="category">

    <option>정치</option>

    <option>경제</option>

    <option>사회</option>

    <option>문화</option>

</select>

 

String category로 받는다. -> 정치/경제/사회/문화 등의 label을 그대로 받는다.

 

그러나 실제로는 사용자가 보는 label과 전달되는 값은 다른게 보통이다.

 

식별자를

<option value="1">정치</option>

 

이렇게 설정해준다.

이러면 value가 전달된다.

 


체크박스

 

<input type="checkbox" name="정치" value="1" id="check1" />

<input type="checkbox" name="사회" value="2" id="check2" />

...

 

이렇게 하면 서버에서도 String 정치, String 사회, ... 이렇게 일일이 받아야 한다.

 

sol) 

<input type="checkbox" name="categories" value="1" id="check1" />

<input type="checkbox" name="categories" value="2" id="check2" />

<input type="checkbox" name="categories" value="3" id="check2" />

<input type="checkbox" name="categories" value="4" id="check2" />

...

 

이렇게 하고 1,2번을 체크하고 보내면

Form Data에 category: 1, category: 2 이런 식으로 전달된다.

(title=sdf&category=1&category=2&...)

 

그러면 서버에서 String[] categories로 받으면

[1, 2] 와 같이 받아올 수 있다.

 


라디오버튼

 

<input type="radio" name="category" value="1" id="radio1" />

<input type="radio" name="category" value="2" id="radio2" />

...

 

(name이 그룹을 묶어주는 역할도 해서 name이 다르면 여러 개 선택 가능. 같은 name끼리의 input 내에서만 배타적 선택)

 

서버에서는 String[] category로 받는다. 그럼 value가 전달된다.

 


 

멀티바이트 문자 전송과 관련된 문제

한글은 Form Data에서 확인하면 잘 날라와있음

 

POST할 때 UTF-8로 날리는데, Tomcat 웹서버의 기본 설정은 ISO-8859-1...

 

1. Tomcat 설정을 바꾸기 - 권장하지 않음

2. Servlet이나 Controller에 설정

 

request.setCharacterEncoding("UTF-8");

근데 입력받을때마다 이걸 해줘야함

 

그래서 ServletFilter를 사용ㅇㅇ

웹서버 <-> WAS <-resp/req-> Servlet에서

 

WAS와 Servlet 사이 resp/req를 관장.

권한이나 인코딩 등...

 

Spring이 필터를 만들어준다.

web.xml에서...

 

<filter>
  <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

 

Comments