Mapping
XML_Beans Configuration
- 가상 경로를 생성하여 실제 경로를 대체하여 주소 지정
- webapp>WEB-INF>spring>appServlet>servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans>
<resources mapping="/res/**" location="/resources/" />
<resources mapping="/image/**" location="/WEB-INF/image/" />
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/day1005/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="spring.mvc.start" />
</beans:beans>
- <context:component-scan>태그의 base-package 속성 값에 해당하는 패키지의 Controller를 참조
- <resources>태그의 location 속성은 실제 경로이며, mapping 속성으로 이를 대체할 가상 경로를 지정 (맨 앞의 ‘/’는 root 경로) …㉡
- <beans:bean>태그로 Beans에 등록되는 매핑 주소의 기본 정보를 지정 (위의 경우에는 등록 매핑 주소의 앞에는 ‘/WEB-INF/day1005/’를, 뒤에는 ‘.jsp’를 생략하여 입력해야 함) …㉠
Using Annotation
- Model과 Controller의 클래스와 메서드를 View에서 사용하기 위해서는 xml을 통해 Beans에 등록하여야 함
- 이 과정을 간소화하기 위해 @(annotation) 사용
Requesting Mapping
@Controller
public class StartController {
@GetMapping("/")
public String start(Model model) {
model.addAttribute("name", "김영환");
model.addAttribute("addr", "서울시 강남구");
return "start";
}
}
- Controller 클래스는 @Controller 어노테이션으로 Beans에 등록
- 매핑은 메서드를 단위로 하고, 각 메서드에 @GetMapping 어노테이션으로 가상 경로 매핑
- 시작 페이지의 경로는 root 페이지이며, root의 매핑 경로는 ‘/’로 표기
- ㉠… 여기서 ‘start’는 매핑 주소의 기본 정보인 앞뒤 내용을 제외한 것만 작성
- Model : request에 데이터를 저장하기 위한 인터페이스로, 매핑된 주소로 값을 넘겨줌 (addAttribute() 메서드를 사용하여 데이터 저장 → 데이터는 입력 시 입력한 형식대로 저장, “str”처럼 문자열로 입력하면 문자열, 34처럼 숫자로 입력하면 숫자형)
<body>
<b>이름:${requestScope.name} </b>
<b>주소:${addr} </b>
</body>
- 위의 Controller로 부터 포워딩된 이 코드의 경로는 ‘WEB-INF/day1005/start.jsp’이 되며, 웹 상에서는 가상 경로인 ‘start/’로 표현됨 …㉠
- Controller에서 request에 저장한 데이터를 표현식(${ })으로 호출해 표현
Forwarding Ex_1
<body>
<ul>
<li><a href="apple/list">apple/list</a></li>
<li><a href="apple/list.do">apple/list.do</a></li>
<li><a href="apple/list.kyh">apple/list.kyh</a></li>
<li><a href="banana/insert">banana/insert</a></li>
<li><a href="orange/delete">orange/delete</a></li>
</ul>
</body>
@Controller
public class ResultController {
@GetMapping("/apple/list.do")
public String result1(Model model) {
model.addAttribute("name", "김영환");
model.addAttribute("nick", "홍박사");
return "result1";
}
}
- 매핑 어노테이션의 인자 값으로 이동시킬 가상 경로 지정 (확장자가 없으면 위 링크의 ‘list’, ‘list.do’, ‘list.kyh’ 모두 호출 가능)
- 이 Controller의 실제 경로는 ‘WEB-INF/day1005/result1.jsp’
<body>
<h2>제 이름은 ${name}이며, 별명은 ${nick}입니다</h2>
</body>
Forwarding Ex_2
@Controller
public class ResultController {
@GetMapping("/banana/insert")
public ModelAndView banana() {
ModelAndView mv=new ModelAndView();
mv.addObject("java", 88);
mv.addObject("spring", 99);
mv.setViewName("result2");
return mv;
}
- 이번에는 전의 일반 방법과는 다른 방법으로 포워딩 해보겠다
- ModelAndView : request에 저장하기 위한 Model과 포워드하는 View를 합친 기능 (addObject() 메서드를 사용하여 데이터 저장 → 저장된 데이터는 Object 형식으로 저장됨, 문자열이나 숫자같은 일반 자료형 아님)
- 일반 방법과 달리 ModelAndView 방식에서는 포워딩할 경로를 setView() 메서드로 지정
<body>
<c:set var="tot" value="${java+spring }"></c:set>
<c:set var="avg" value="${tot/2 }"></c:set>
<h2>점수 출력 결과</h2>
<pre>
자바점수:${java }
스프링점수:${spring }
총점:${tot }
평균:${avg }
</pre>
</body>
Forwarding Ex_3
<ul>
<li><a href="shop/detail">resource의 이미지출력</a></li>
<li><a href="board/insert/data">WEB-INF의 이미지출력</a></li>
</ul>
@Controller
public class ResultController {
@GetMapping("/shop/detail")
public String resImage() {
return "result4";
}
@GetMapping("/board/insert/data")
public String webImage() {
return "result5";
}
}
<body>
<h2>리소스 폴더안의 이미지출력</h2>
<img src="../res/02.png">
<img src="../res/image1/01.png">
</body>
- 파일의 경로를 찾기 위해서는 가상 경로를 알아야 함 (Controller에서 확인 가능)
- 지정된 매핑 주소가 ‘/shop/detail’이므로 root 폴더인 ‘/’까지 한 단계 회귀 (../)
- resources 폴더에 있는 ‘02.png’ 파일이며, resources/ 경로를 res/로 대체하였으므로 대체한 가상 경로를 기준으로 경로 확인 …㉡
<body>
<img src="../../image/11.png">
<img src="../../image/shop/12.png">
</body>
- 지정된 매핑 주소가 ‘/board/insert/data’이므로 root 폴더인 ‘/’까지 두 단계 회귀 (../../)
- WEB-INF>image 폴더에 있는 ‘11.png’ 파일이며, WEB-INF/image/ 경로를 image/로 대체하였으므로 대체한 가상 경로를 기준으로 경로 확인 …㉡