전달 받은 데이터가 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 파라미터의 이름과 같을 때에만 값을 받을 수 있다.
@Controllerpublic 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>...
웹파라미터로 전달받는 값이 정수인 경우
@Controllerpublic 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의 매개변수 앞에 선언
뒤에오는 매개변수의 타입은 참조형, 기본형 모두 가능
@RequestMappingpublic static method명(@RequestParam(...) 타입 매개변수, ... ) {
@RequestParam(name="web parameter명", defaultValue="web parameter가 없을 때 전달될 값", required=true|false)
required 속성
true - web parameter가 받드시 존재해야 할 때
defaultValue를 설정해도 에러가 발생
false - web parameter가 없어도 괜찮을 때
파람이 null일 때 사용 예
@Controllerpublic 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";}
@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형식의 클래스가 아니게 되므로 권장하지 않는다.
@Controllerpublic 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"; }}