Java EE 정리 34
15 Apr 2019
Reading time ~5 minutes
Java EE 정리 34 - 단일 웹 파라미터 처리, Controller에서 JSP로 값 전달(2), 페이지 이동
Web Parameter 처리 - 단일 파라미터 처리
- 전달 받은 데이터가 int형일 경우 Integer.parseInt를 직접 안해도 프레임워크가 숫자 변환처리를 해줌
- 전달받은 값이 문자열인 경우와 정수인 경우
<!-- main_menu.jsp -->
<script type="text/javascript">
function requestString() {
var url = "request_string.do";
if (confirm("문자열의 매개변수를 전송 하시겠습니까?")){
url += "?name=jungyun";
}
location.href=url;
}
function requestInt() {
var url = "request_int.do";
if (confirm("정수형의 매개변수를 전송 하시겠습니까?")){
url += "?age=30";
}
location.href=url;
}
</script>
...
<li><a href="#void" onclick="requestString()">단일 파라미터(문자열) 처리</a></li>
<li><a href="#void" onclick="requestInt()">단일 파라미터(정수형) 처리</a></li>
...
- 전달받은 값이 문자열인 경우
- 웹파라미터 이름(FormControl의 이름)이 method 파라미터의 이름과 같을 때에만 값을 받을 수 있다.
@Controller
public class ParamController {
@RequestMapping(value="/request_string.do", method=RequestMethod.GET)
public String requestString(String name, Model m) {
if (name == null || "".equals(name)) {
// 파라미터 자체가 없거나, 값이 없을 때
name = "Guest";
}
m.addAttribute("name", name+"님 안녕하세요?");
return "param/request_string";
}
...
<!-- param/request_string.jsp -->
...
<div>
<form action="request_string.do" method="get">
<label>이름</label>
<input type="text" name="name" class="inputBox"/>
<input type="submit" value="HTML Form Control을 사용한 전송" class="btn"/>
</form>
</div>
<c:if test="${ not empty name }">
<br/>
<div>
입력값(EL) : <strong><c:out value="${ param.name }"/></strong><br/>
입력값(Model객체) : <strong><c:out value="${ requestScope.name }"/></strong>
</div>
</c:if>
...
- 웹파라미터로 전달받는 값이 정수인 경우
@Controller
public class ParamController {
@RequestMapping(value="/request_int.do", method=RequestMethod.GET)
public String requestInt(int age, Model m) {
m.addAttribute("age", age+"살");
return "param/request_int";
}
<!-- request_int.jsp -->
...
<div>
<form action="request_int.do" method="get">
<label>나이</label>
<input type="text" name="age" class="inputBox"/>
<input type="submit" value="HTML Form Control을 사용한 전송" class="btn"/>
</form>
</div>
<c:if test="${ not empty age }">
<br/>
<div>
입력값(EL) : <strong><c:out value="${ param.age }"/></strong><br/>
입력값(Model객체) : <strong><c:out value="${ requestScope.age }"/></strong>
</div>
</c:if>
...
- int형을 받을 때 파라미터 없다면(null일 때) 에러가 발생!
@RequestParam
- 매개변수가 null인 경우 처리
-
method의 매개변수 앞에 선언
- 뒤에오는 매개변수의 타입은 참조형, 기본형 모두 가능
@RequestMapping
public static method명(@RequestParam(...) 타입 매개변수, ... ) {
@RequestParam(name="web parameter명", defaultValue="web parameter가 없을 때 전달될 값", required=true|false)
-
required 속성
-
true - web parameter가 받드시 존재해야 할 때
- defaultValue를 설정해도 에러가 발생
- false - web parameter가 없어도 괜찮을 때
-
true - web parameter가 받드시 존재해야 할 때
- 파람이 null일 때 사용 예
@Controller
public class ParamController {
@RequestMapping(value="/request_int.do", method=RequestMethod.GET)
public String requestInt(@RequestParam(name="age", defaultValue="1",
required=false) int age, Model m) {
m.addAttribute("age", age+"살");
return "param/request_int";
}
...
- 위에 if로 null을 예외처리했던 걸 @RequestParam으로 default값 처리로 변경할 수 있다.
@RequestMapping(value="/request_string.do", method=RequestMethod.GET)
public String requestString(@RequestParam(defaultValue="anonymous") String name, Model m) {
/*if (name == null || "".equals(name)) { // @RequestParam으로 처리
name = "Guest"; //
}*/
m.addAttribute("name", name+"님 안녕하세요?");
return "param/request_string";
}
Controller에서 JSP로 값 전달
-
HttpServletRequest
- 인터페이스
- 사용가능하나 비권장
- method 매개변수로 정의
- JSP에서 ”${ requestScope.이름 }” 으로 사용
@RequestMapping(...)
public String method명(HttpServletRequest request) {
request.setAttribute("이름", 값);
return "응답할 jsp명";
}
-
Model
- 인터페이스
- viewPage명과 데이터를 구분
- 일반적인 상황에서 사용하는 방법
- method의 매개변수로 정의
- JSP에서 ”${ requestScope.이름 }” 으로 사용
@RequestMapping(...)
public String method명(Model m) {
// 서비스 처리 후 반환된 값을 Model 객체에 저장
...
m.addAttribute("이름",서비스처리값);
return "응답할 jsp명";
}
-
ModelAndView
- 클래스
- view명과 데이터가 합쳐 사용할 때
-
예외처리 상황에 사용
- 프레임워크를 사용할 때 생명주기는 프레임워크가 관리
- ModelAndView를 사용하면 개발자가 생명주기를 관리하기 때문에 비권장
- method의 반환형이 반드시 ModelAndView로 되어야 한다.
@RequestMapping(...)
public ModelAndView method명() {
// 1. 객체화
ModelAndView mav = new ModelAndView();
// View의 이름을 설정
mav.setViewName("view명");
// 처리 데이터를 설정(View JSP에서 보여줄 데이터)
mav.addObject("이름",값);
...
return mav;
}
Web Parameter 처리 - HttpServletRequest 사용
- 메뉴 생성
<!-- main_menu.jsp -->
...
<li><a href="view_request.do">HttpServletRequest사용 데이터 전달</a></li>
<li><a href="view_model.do">Model사용 데이터 전달</a></li>
<li><a href="view_modelandview.do">ModelAndView사용 데이터 전달</a></li>
...
- 5건의 diary 데이터를 가져와 보여주는 예제를 만들 것(diary가 notice라 가정)
- 예제를 위해 mybatis_prj에서 만들었던 MyBatisDAO, mybatis_config.xml을 가져와서 사용
- mybatis_config.xml에서 mapper노드 resource를 notice_mapper.xml 으로 설정
package kr.co.sist.domain;
public class NoticeDomain {
private int num;
private String subject;
// setter, getter 생성
...
<!-- notice_mapper.xml -->
...
<mapper namespace="kr.co.sist">
<resultMap type="kr.co.sist.domain.NoticeDomain" id="noticeResult">
<result column="num" property="num"/>
<result column="subject" property="subject"/>
</resultMap>
<select id="notice" resultMap="noticeResult">
SELECT num, subject
FROM(SELECT num, subject, ROW_NUMBER() OVER( ORDER BY w_date DESC ) r_num
FROM diary)
WHERE r_num between 1 and 5;
</select>
</mapper>
// MyBatsDAO
...
public List<NoticeDomain> selectMainNotice() {
SqlSession ss = MyBatisDAO.getInstance().getSessionFactory().openSession();
List<NoticeDomain> list = ss.selectList("notice");
ss.close();
return list;
}
...
- 단위테스트는 DAO에서 하든 Service에서 하든 위치 상관없음, 필요할 때 할 것
public class NoticeService {
public List<NoticeDomain> searchMainNotice() {
List<NoticeDomain> list = null;
MyBatisDAO mb_dao = MyBatisDAO.getInstance();
list = mb_dao.selectMainNotice();
// 공지사항은 15자까지만 보여준다.
list = mb_dao.selectMainNotice();
for(NoticeDomain temp : list) {
if (temp.getSubject().length() > 15) {
temp.setSubject(temp.getSubject().substring(0, 14)+"...");
}
}
return list;
}
...
-
JSP로 전달하기 위해 Scope객체를 매개변수로 받는다.
- HttpServletRequest는 POJO형식의 클래스가 아니게 되므로 권장하지 않는다.
@Controller
public class DataController {
@RequestMapping(value="/view_request.do", method= { GET, POST })
public String useRequest(HttpServletRequest request) {
// 업무 수행
NoticeService ns = new NoticeService();
List<NoticeDomain> noticeList = ns.searchMainNotice();
// 공지사항을 조회하여 JSP로 전달한다.(Scope 객체 사용)
request.setAttribute("req_data", noticeList);
return "data/use_request";
request.setAttribute("msg", "HttpServletRequest 사용");
return "data/use_data";
}
}
<!-- data/use_data.jsp -->
...
<div>값 전달한 객체 : <c:out value="${ msg }"/></div>
<div style="width:250px; height:186px; float:right; background-image: url('http://localhost:8080/spring_mvc/common/images/postit.png');">
<div style="margin-top:30px; margin-left:25px;">
<ul>
<c:forEach var="notice" items="${ requestScope.req_data }">
<li>
<a href="notice_detail.do?num=${ notice.num }">
<c:out value="${ notice.subject }"/>
</a>
</li>
</c:forEach>
</ul>
</div>
</div>
...
Web Parameter 처리 - Model 사용
// DataController
...
@RequestMapping(value="/view_model.do", method= { GET, POST })
public String useModel(Model m) {
// 업무 수행
NoticeService ns = new NoticeService();
List<NoticeDomain> noticeList = ns.searchMainNotice();
// 공지사항을 조회하여 JSP로 전달한다.(Scope 객체 사용)
m.addAttribute("req_data", noticeList);
m.addAttribute("msg", "Model 사용");
return "data/use_data";
}
...
Web Parameter 처리 - ModelAndView 사용
// DataController
...
@RequestMapping(value="/view_modelandview.do", method= { GET, POST })
public ModelAndView useModelAndView() {
// 업무 수행
NoticeService ns = new NoticeService();
List<NoticeDomain> noticeList = ns.searchMainNotice();
// 공지사항을 조회하여 JSP로 전달한다.(Scope 객체 사용)
// 1. 객체 생성
ModelAndView mav = new ModelAndView();
// 2. view할 JSP명을 설정
mav.setViewName("data/use_data");
// 3. 데이터를 설정
mav.addObject("req_data", noticeList);
mav.addObject("msg", "ModelAndView 사용");
return mav; // ModelAndView 객체 반환!
}
}
페이지 이동
-
forward가 기본
- jsp는 ViewResolver가 찾을 수 있도록 WEB-INF/views 에 있어야 한다
- forward는 jsp가 처리된 데이터를 보여줄 때 사용
- redirect는 jsp의 기능을 사용하면서 DB에서 처리된 데이터를 보여주는 것이 아닐 때 사용
- redirect로 가는 페이지는 WebContent 내 폴더를 만들고 JSP나 HTML을 작성
- redirect 사용 법
- 요청처리 method에서 “redirect:경로명/jsp명.jsp”을 반환해준다.
- prefix, suffix의 영향을 받지 않기 때문에 경로명, 확장자를 직접 입력해 주어야 한다.
return "redirect:경로명/viewJSP명.jsp";
- 리다이렉트 이동 예
<!-- main_menu.jsp -->
...
<li><a href="use_redirect.do">redirect 페이지 이동</a></li>
...
<!-- use_redirect.jsp -->
...
<div style="width:250px; height:186px; float:left; background-image: url('http://localhost:8080/spring_mvc/common/images/postit.png');">
<div style="margin-top:30px; margin-left:20px;"><strong>Redirect로 페이지 이동</strong></div>
</div>
...
@Controller
public class DataController {
@RequestMapping(value="/use_redirect.do")
public String moveRedirect() {
return "redirect:date0415/use_redirect.jsp";
}
...