<참조> https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html
Spring WEB MVC 프레임워크 (3)
작업중...
4. 핸들러 매핑
다음 예는 인터셉터를 구성하는 방법을 보여줍니다.
<beans>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="interceptors">
<bean class="example.MyInterceptor"/>
</property>
</bean>
<beans>
4.1 요청을 가로채기 HandlerInterceptor
<beans>
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="interceptors">
<list>
<ref bean="officeHoursInterceptor"/>
</list>
</property>
</bean>
<bean id="officeHoursInterceptor"
class="samples.TimeBasedAccessInterceptor">
<property name="openingTime" value="9"/>
<property name="closingTime" value="18"/>
</bean>
<beans>
package samples;
public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {
private int openingTime;
private int closingTime;
public void setOpeningTime(int openingTime) {
this.openingTime = openingTime;
}
public void setClosingTime(int closingTime) {
this.closingTime = closingTime;
}
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
Calendar cal = Calendar.getInstance();
int hour = cal.get(HOUR_OF_DAY);
if (openingTime <= hour && hour < closingTime) {
return true;
} else {
response.sendRedirect("http://host.com/outsideOfficeHours.html");
return false;
}
}
}
5. 뷰 해결하기
5.1 ViewResolver인터페이스 로 보기 해결하기
표 3. 확인자 보기
ViewResolver설명
AbstractCachingViewResolver | 뷰를 캐시하는 추상 뷰 리졸버. 종종 보기를 사용하려면 먼저 준비해야 합니다. 이 뷰 리졸버를 확장하면 캐싱이 제공됩니다. |
XmlViewResolver | 이를 구현 ViewResolver하면 Spring의 XML 빈 팩토리와 동일한 DTD로 XML로 작성된 구성 파일을 허용합니다. 기본 구성 파일은 /WEB-INF/views.xml. |
ResourceBundleViewResolver | 그 구현은 번들 기본 이름으로 지정된 ViewResolver에서 빈 정의를 사용합니다 . ResourceBundle일반적으로 클래스 경로에 있는 속성 파일에서 번들을 정의합니다. 기본 파일 이름은 views.properties입니다. |
UrlBasedViewResolver | ViewResolver명시적인 매핑 정의 없이 논리적 뷰 이름을 URL로 직접 확인 하는 인터페이스의 간단한 구현입니다 . 논리적 이름이 임의의 매핑 없이 간단한 방식으로 보기 리소스의 이름과 일치하는 경우에 적합합니다. |
InternalResourceViewResolver | 편리한 서브클래스 (사실상 Servlet 및 JSP)와 및 와 같은 서브클래스 를 UrlBasedViewResolver지원합니다 . 를 사용하여 이 해석기에 의해 생성된 모든 보기에 대한 보기 클래스를 지정할 수 있습니다 . 자세한 내용은 클래스에 대한 Javadocs를 참조 하세요.InternalResourceViewJstlViewTilesViewsetViewClass(..)UrlBasedViewResolver |
VelocityViewResolver/ FreeMarkerViewResolver | 그 편리한 서브클래스 (사실상, Velocity 템플릿) 또는 각각 및 이들의 사용자 정의 서브클래스를 UrlBasedViewResolver지원 합니다.VelocityViewFreeMarkerView |
ContentNegotiatingViewResolver | 요청 파일 이름 또는 헤더 ViewResolver를 기반으로 보기를 확인 하는 인터페이스의 구현입니다 . |
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="views"/>
<property name="defaultParentView" value="parentView"/>
</bean>
5.2 ViewResolver 연결
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="order" value="1"/>
<property name="location" value="/WEB-INF/views.xml"/>
</bean>
<!-- in views.xml -->
<beans>
<bean name="report" class="org.springframework.example.ReportExcelView"/>
</beans>
5.3 보기로 리디렉션
RedirectView
@RequestMapping(value = "/files/{path}", method = RequestMethod.POST)
public String upload(...) {
// ...
return "redirect:files/{path}";
}
redirect:접두사 _
forward:접두사 _
5.4 ContentNegotiatingViewResolver
헤더 의 한 가지 문제는 AcceptHTML 내에서 웹 브라우저에서 헤더를 설정하는 것이 불가능하다는 것입니다. 예를 들어 Firefox에서는 다음과 같이 고정됩니다. 이러한 이유로 브라우저 기반 웹 애플리케이션을 개발할 때 각 표현에 대해 고유한 URI를 사용하는 것을 보는 것이 일반적입니다. |
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="atom" value="application/atom+xml"/>
<entry key="html" value="text/html"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
</list>
</property>
</bean>
<bean id="content" class="com.springsource.samples.rest.SampleContentAtomView"/>
ContentNegotiatingViewResolver의 ViewResolver 목록이 명시적으로 구성되지 않은 경우 애플리케이션 컨텍스트에 정의된 모든 ViewResolver를 자동으로 사용합니다 . |
@Controller
public class ContentController {
private List<SampleContent> contentList = new ArrayList<SampleContent>();
@RequestMapping(value="/content", method=RequestMethod.GET)
public ModelAndView getContent() {
ModelAndView mav = new ModelAndView();
mav.setViewName("content");
mav.addObject("sampleContentList", contentList);
return mav;
}
}
6. 플래시 속성 사용하기
플래시 속성에 대한 요청 일치
7. URI 건물
UriComponents uriComponents =
UriComponentsBuilder.fromUriString("http://example.com/hotels/{hotel}/bookings/{booking}").build();
URI uri = uriComponents.expand("42", "21").encode().toUri();
UriComponents uriComponents =
UriComponentsBuilder.newInstance()
.scheme("http").host("example.com").path("/hotels/{hotel}/bookings/{booking}").build()
.expand("42", "21")
.encode();
HttpServletRequest request = ...
// Re-use host, scheme, port, path and query string
// Replace the "accountId" query param
ServletUriComponentsBuilder ucb =
ServletUriComponentsBuilder.fromRequest(request).replaceQueryParam("accountId", "{id}").build()
.expand("123")
.encode();
또는 컨텍스트 경로를 포함하여 사용 가능한 정보의 하위 집합을 복사하도록 선택할 수 있다.
// Re-use host, port and context path
// Append "/accounts" to the path
ServletUriComponentsBuilder ucb =
ServletUriComponentsBuilder.fromContextPath(request).path("/accounts").build()
또는 DispatcherServlet 이름으로 매핑되는 경우(예: /main/*), 서블릿 매핑의 리터럴 부분을 포함할 수도 있다.
// Re-use host, port, context path
// Append the literal part of the servlet mapping to the path
// Append "/accounts" to the path
ServletUriComponentsBuilder ucb =
ServletUriComponentsBuilder.fromServletMapping(request).path("/accounts").build()
8. 로케일 사용
8.1 AcceptHeaderLocaleResolver
8.2 CookieLocaleResolver
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieName" value="clientlanguage"/>
<!-- in seconds. If set to -1, the cookie is not persisted (deleted when browser shuts down) -->
<property name="cookieMaxAge" value="100000">
</bean>
표 4. CookieLocaleResolver속성
cookieName | classname + LOCALE | 쿠키의 이름 |
cookieMaxAge | Integer.MAX_INT | 쿠키가 클라이언트에서 지속되는 최대 시간입니다. -1을 지정하면 쿠키가 유지되지 않습니다. 클라이언트가 브라우저를 종료할 때까지만 사용할 수 있습니다. |
cookiePath | / | 쿠키의 가시성을 사이트의 특정 부분으로 제한합니다. cookiePath가 지정되면 쿠키는 해당 경로와 그 아래 경로에만 표시됩니다. |
8.3 SessionLocaleResolver
8.4 LocaleChangeInterceptor
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="siteLanguage"/>
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/>
</list>
</property>
<property name="mappings">
<value>/**/*.view=someController</value>
</property>
</bean>
반응형
'SPRING' 카테고리의 다른 글
Spring WEB MVC 프레임워크 (5) (0) | 2022.06.13 |
---|---|
Spring WEB MVC 프레임워크 (4) (0) | 2022.06.13 |
Spring WEB MVC 프레임워크 (2) (0) | 2022.06.13 |
Spring WEB MVC 프레임워크 (1) (0) | 2022.06.12 |
Spring, JDBC 예제 코드 (0) | 2022.06.12 |