更多Spring相关文章可查看
Spring学习(一)
Spring学习(二) 自动装配的歧义
五、spring mvc
spring mvc框架是spring的一个子项目,它天生与spring集成,不需要像struts2一样去整合,它基于模型-视图-控制器实现,将web层的职责解耦,简化了web开发.今天我们就来初步认识一下Spring mvc.
1、解析Spring mvc请求的流程
每当用户发起一个请求,Spring mvc会对它进行一系列的工作.
图片如下(图片来自网上)
(1)请求发出后,会带有用户所请求的信息,类似请求的url,提交的表单信息等等.它会把请求发送给DispatcherServlet,即Spring mvc的前端控制器.
(2)DispatcherServlet需要把请求发送给控制器去处理,但是在应用程序中会有多个控制器,
DispatcherServlet需要先去查询一个或多个处理器映射器(handler mapping)来确定应该去找哪一个控制器.
(3)找到了控制器之后,DispatcherServlet会再根据处理器适配器(handler adapter)去调用具体的控制器来处理请求(一般的业务逻辑最好委托给服务对象进行处理,在控制器中调用这些服务对象即可)
(4)控制器在处理完请求后,会将一些信息返回给DispatcherServlet,即ModelAndView
(5)DispatcherServlet会使用视图解析器(view resolver)来解析ModelAndView.
(6)最后将view进行渲染后,通过相应对象传递给用户
从上述中我们可以知道,DispatcherServlet
是Spring mvc的核心,我们在web.xml中配置DispatcherServlet.
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC需要加载的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 匹配所有请求,此处也可以配置成 *.do 形式 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
在Servlet3规范和spring3.1后,我们也可以使用java进行配置
package com.shiqy.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
//指定配置类
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
//将DispatcherServlet映射到"/"
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
package com.shiqy.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
//启用Spring mvc
@EnableWebMvc
//启用组件扫描
@ComponentScan
public class WebConfig extends WebMvcConfigurerAdapter{
//配置jsp视图解析器
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("WEB-INF/jsp");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
/*配置静态资源的处理,
将静态资源的请求转发到Servlet容器中默认的Servlet中
而不是用DispatcherServlet本身来处理此类请求*/
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
configurer.enable();
}
}
package com.shiqy.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = EnableWebMvc.class)})
public class RootConfig {
}
扩展了AbstractAnnotationConfigDispatcherServletInitializer
的任意类都会自动的配置Dispatcher-Servlet和Spring应用上下文.它重写了3个方法:
- getServletMappings,它会将一个或多个路径映射到DispatcherServlet上
- getServletConfigClasses,该方法返回的带有
@Configuration
注解的类将会用来定义DispatcherServlet应用上下文中的bean. - getRootConfigClasses,该方法返回的带有
@Configuration
注解的类将会用来配置ContextLoaderListener创建的应用上下文中的bean
2.使用Spring mvc控制器处理web请求
最简单的Spring mvc控制器类
package com.shiqy.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
@Controller
public class HelloWorldController {
@RequestMapping(value = "/",method = GET)
public String helloWorld(){
return "helloWorld";
}
}
@RequestMapping
注解的value属性指定了这个方法所要处理的请求路径,method属性指定了所要处理的http方法.当收到对”/”的http get请求时,就会调用helloWorld()
方法,返回视图名.
注意:当@RequestMapping
注解添加在类级别上时,这个注解会应用到该控制器的所有方法上.