SpringMVC主要流程
1. 客户端请求提交到DispatcherServlet
2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
3. DispatcherServlet将请求提交到Controller
4. Controller调用业务逻辑处理后,返回ModelAndView
5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
6. 视图负责将结果显示到客户端
概述重要的接口或者类
前端控制器DispactherServlet
控制器映射器HandlerMapping(可以有多个HandlerMapping)
实现类:1、SimpleUrlHandlerMapping 通过配置文件 ,把一个URL映射到Controller
2、DefaultAnnotationHandlerMapping (3.1之前用的)通过注解,把一个URL映射到Controller类上
控制器适配器 HandlerAdapter接口,请求处理的映射(可以有多个HandlerAdapter)
3.1之后用RequestMappingHandlerMapping
AnnotationMethodHandlerAdapter(3.1之前用的)通过注解,把url映射到Controller类的方法上。
3.1之后用RequestMappingHandlerAdapter
控制器
Controller 由于我们使用了@Controller注解,被注解的类就可以担任Controller(action)的功能
视图解析器 ViewResolver接口的实现类
UrlBasedViewResolver类,通过配置文件,把一个视图交给view来处理。
InternalResourceViewResolver 类,比上面的类,加入jstl的支持。
ModelAndView 类
前端控制器DispactherServlet
DispatcherServlet是个Servlet,配置在web.xml中,可多个。根据拦截的规则,拦截后依据某某规则分发到Controller来处理
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup> //随服务器一起启动
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern> //拦截所有,后面要配出静态资源
</servlet-mapping>
springmvc-servlet.xml配置
<context:component-scan base-package="com.app,com.core"/><!--自动扫描的包-->
<!-- 对静态资源访问 使用默认的Servlet来响应静态文件-->
<mvc:default-servlet-handler/>
<!-- 默认注解映射的支持
<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式。<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。-->
<mvc:annotation-driven/>
<!--使用了<mvc:annotation-driven/> 就不能自动配置拦截器。 -->
<mvc:intercepters>
<bean class=""/>
</mvc:intercepters>
<!-- 视图解析器,当Controller返回XXX字符串时,先通过拦截器,然后该类就会在/WEB-INF/views/目录下,查找XXX.jsp文件-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有:
@Controller 声明Action组件
@Service 声明Service组件 @Service("myMovieLister")
@Repository 声明Dao组件
@Component 泛指组件, 当不好归类时.
@RequestMapping("/menu") 请求映射
@Resource 用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName")
@Autowired 用于注入,(srping提供的) 默认按类型装配
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区
@Scope("prototype") 设定bean的作用域
@RequestMapping("/menu") 函数
返回值三种:
ModelAndView,
String(返回逻辑视图),形参可以定义Model
void 形参可以定义request ,response,可以用来相应Json数据。
参数绑定:
客户端传过来的key/value数据,绑定到函数的形参上。使用converter转换器。spring定义很多转换器。
默认支持HttpServletRequest(request),HttpServletResponse(response)、HttpSession、Model(接口)/ModelMap(实现,会把数据传递给request域)(model),modelAndView(modelAndView),简单类型。
简单类型
@RequestParam(放在参数的类型前面)对简单类型绑定,不使用这个注解,需要保证传入的参数和简单类型名称一致。
使用@RequestParam(value="指定传入的参数名" required=true(此参数必须传),defaultValue=“”)可不一致。
绑定POJO
页面input的name 和形参pojo中的成本变量名称一致。就可以绑定到pojo中。
对日期的绑定要自定义参数转换器。