Spring @MVC

这一次学习使用Spring MVC框架进行基于Web的应用开发。Spring MVC是Spring框架最重要的模块之一,构建于强大的Spring IoC容器之上,大量使用容器的特性简化其配置。

1.用Spring MVC开发简单的Web应用

SpringMVC的核心组件是一个控制器,需要在Java Web部署描述符(Web.xml文件)中配置唯一的Servlet,常被称作调度Servlet(Dispatcher Servlet),实现JavaEE设计模式之一——前端控制器(Front Control)。

控制器类必须以@Controller注解标记,用@RequestMapping注解修饰的控制器方法成为处理程序的方法。。控制器类选择合适的处理程序,使用收到的请求调用处理程序方法的逻辑,完成后将控制委派给一个视图,这个视图表现为处理程序方法的返回值。

我们打算为体育中心开发球场预定系统,先在domain子包中定义领域类(见代码包的Reservation,Player,SportType),然后在service子包中定义服务接口(ReservationService),并将接口实例化(ReservationServiceImpl)。

web.xml定义servlet以及web请求道这些servlet的映射方式。

在Web应用上下文中注册一个DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例启用SpringMVC注解扫描。

2.用@RequestMapping映射请求

处理程序映射与上下文路径(也就是Web应用上下文的部署路径)和servler路径(也就是映射到DispatcherServlet的路径)的相对路径匹配URL。例如在URL http://localhost:8998/court/welcome,匹配的路径是/welcome,因为上下文路径是/court而没有servlet路径,会议一下,web.xml中servlet路径声明为/。

相关类有MemberController。

3.用处理程序拦截器拦截请求

SpringMVC允许你通过处理程序拦截器(Handler interceptors)拦截Web请求进行预先和事后处理。处理程序拦截器在Spring的web应用上下文中配置,所以它们可以使用任何容器特性,并且引用容器中声明的任何Bean。可以为特定的URL映射注册处理程序拦截器,这样它只拦截映射到某些URL的请求。

每个程序拦截器都要实现HandlerInterceptor接口,preHandle()和postHandler()在处理程序前后调用,postHander()允许访问返回的ModelAndView对象,afterCompletion()在请求完成后调用。

代码使用DefaultAnnotationHandlerMapping的形式有一个特殊的缺点,拦截器分配给一个用@Controller注解定义的类。如果有几对控制器,可能希望区分拦截器所应用的控制器。为此需要定义自定义的处理程序拦截器,Scott Murphy的spring-plugins项目允许使用URL在控制器的基础上应用拦截器,可以在http://code.google.com/p/springplugins/downloads/list下载项目。

相关类有MeasurementInterceptor,可以在welcome.jsp中显示出耗费的毫秒数。

4.解析用户区域

在SpringMVC应用中,用户区域由区域解析器(Locale resolver)识别,区域解析器必须实现LocaleResolver接口。SpringMVC自带多个LocaleResolver实现,供你用不同的条件解析区域,当然你也可以实现自己的区域解析器。

有三种方式:按照HTTP请求头标解析区域、按照会话属性解析区域、根据Cookie解析区域(在代码court-servlet.xml中给出示例)。除了调用setLocale()显示修改用户区域外,还可以将LocaleChangeInterceptor应用到处理程序映射,这个拦截器检测是否存在一个特殊参数,这个参数名可以用这个拦截器的paramName属性定制,如果存在,拦截器将根据参数值修改用户区域。

5.外部化区分区域的文本信息

为了避免不同区域创建不同的页面版本,你应该使用外部化区分区域的文本信息,使网页独立于区域。Spring能够使用信息源为你解析文本信息,信息源必须实现MessageSource接口。然后,你的JSP文件可以使用Spring标记库里定义的<spring:message>标记,解析特定代码的信息。

注册MessageSource类型的Bean。

6.按照名称解析视图

在SpringMVC应用中,视图由在Web应用上下文中声明的一个或者多个视图解析器Bean解析。这些Bean必须实现ViewResolver接口,使DispatcherServlet自动检测它们。SpringMVC自带的ViewResolver实现有:根据模板名称和位置解析视图、从XML配置文件解析视图、从一个资源集解析视图、用多个解析器解析视图以及Redirect前缀。

7.视图和内容协商

当web应用接收一个请求时,请求包含一系列的属性,让处理框架能够确定返回给请求方的正确内容和类型。

首先说明如何与其他解析器集成。

<bean id="contentNegotiatingResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
		<property name="oreder" value="#{T(org.springframework.core.Ordered).HIGHEST_PRECEDENCE}" />
		<property name="mediaTypes">
			<map>
				<entry key="html" value="text/html" />
				<entry key="pdf" value="application/pdf" />
				<entry key="xsl" value="application/vnd.ms-excel" />
				<entry key="xml" value="aplication/xml" />
				<entry key="json" value="application/json" />
			</map>
		</property>
	</bean>
	<bean id="resourceBundleResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
		<property name="order" value="#{contentNegotiatingResolver.order+1}" />
	</bean>
	<bean id="secondaryResourceBundleResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
		<property name="basename" value="secondaryviews" />
		<property name="order" value="#{resourceBundleResolver.order+1}" />
	</bean>
	<bean id="internalResourceResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="order" value="#{secondaryResourceBundleResolver.order+1}" />
	</bean>

 8.映射异常视图

在一个SpringMVC应用中,可以在Web应用上下文中注册一个或者多个异常解析器Bean以解析未捕捉的异常。这些Bean必须实现HandlerExceptionResolver接口,以便使DispatcherServlet能自动检测它们。SpringMVC自带了一个简单的异常解析器,让你将各类异常映射到视图。

相关类有ReservationNotAvailableException.java,reservationNotAvailable.jsp,error.jsp。

9.用@Value在控制器中赋值

@Value注解使得控制器字段能使用Spring表达式语言(SpEL)赋值。你可以使用@Value注解和SpEL一起,查询应用上下文中的Bean,提取帮助你初始化控制器字段的值。

将servlet1中的welcome改为about运行即可!

10.用控制器处理表单

当用户与表单交互时,需要控制器对两个操作的支持,首先是在表单刚开始接受请求时,要求控制器用一个HTTP GET请求显示表单,这个请求将表单视图显示给用户。然后在表单提交时,需要一个HTTP POST请求用于处理表单中存在的数据的校验和业务处理。如果处理成功,则会向用户显示一个成功视图,否则显示带有错误信息的表单。

相关类有SportTypeEditor,ReservationValidator,ReservationFormController等。

关注我们发送:SpringMVC,获取代码!代码中的不足之处敬请指正!

猜你喜欢

转载自blog.csdn.net/qq_39391192/article/details/82747020