Spring之SpringMVC(四)

来源:互联网 发布:java数据字典怎么写 编辑:程序博客网 时间:2024/06/07 15:40

1.Spring MVC概述

Spring MVC基于MVC模式实现,能够构建一个像Spring一样的灵活和松耦合的web应用程序。

2.Spring的工作流程

这里写图片描述
上面是一个请求的流程:

  • 1.请求的第一站是DispatcherServlet,所以Spring容器首先必须先在配置中加载DispatcherServlet的bean。DispatcherServlet就是前端控制器。

  • 2.DispatcherServlet任务是将请求转发到HandlerAdapter(控制器)中,但是该转发到哪个控制器呢?它会根据它携带的url在HandlerMapping(处理器映射)中找到这个控制器。

  • 3.找到了这个控制器,于是DispatcherServlet携带请求和对应参数发给这个控制器,说:“交给你了,兄弟!”

  • 4.控制器进行处理。

  • 5.控制器处理完,把数据打包,连同模型和视图名一同发回给DispatcherServlet,就是说:“我搞定了,拿去!”

  • 6.上面说到返回一个视图名,但是怎么找到对应的页面呢?这时候就有了ViewResolver(试图解析器),例如视图名为‘login’,ViewResolver会把他解析成“localhost:8080/project/login.html”

  • 7.有了返回的数据模型和对应的解析视图,于是对应视图,也就是localhost:8080/project/login.html就能把数据渲染出来。

3.DispatcherServlet的配置

DispatcherServlet可以通过web.xml进行配置,但是,由于Spring3.1功能的增强,同时为了更好地了解DispatcherServlet,将采用java将DispatcherServlet配置到servlet容器中。
下面就是Java实现的配置DispatcherServlet

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{    @Override    protected Class<?>[] getRootConfigClasses() {        return new Class<?>[] {RootConfig.class};    }    @Override    protected Class<?>[] getServletConfigClasses() {        return new Class<?>[] {WebConfig.class};    }    @Override    protected String[] getServletMappings() {        return new String[] {"/"};    }}
  • a protected String[] getServletMappings()这个方法会将一个或多个路径映射到DispatcherServlet上,他映射的是“/”,表示处理进入应用的所有请求。

剩下两个函数,需要了解两个“应用上下文”,SpringWeb中有两个应用上下文,DispatcherServlet和ContextLoaderListener加载的上下文。

DispatcherServlet加载控制器,视图解析器,以及处理器映射的bean。
ContextLoaderListener加载应用中的其他bean,例如后端的中间层和数据层。

  • b.protected Class<?>[] getServletConfigClasses()方法返回带有@Configuration注解的类用来定义DispatcherServlet应用上下文的bean。

  • c.protected Class<?>[] getRootConfigClasses()返回带有@Configuration注解的类用来定义ContextLoaderListener应用上下文的bean。

让我们来简单看一下RootConfig和WebConfig是什么?

@Configuration@EnableWebMvc@ComponentScan("spitter.web")public class WebConfig extends WebMvcConfigurerAdapter{    @Bean    public ViewResolver viewResolver() {        InternalResourceViewResolver resolver = new InternalResourceViewResolver();        resolver.setPrefix("/WEB-INF/views");        resolver.setSuffix(".jsp");        resolver.setExposeContextBeanAsAttributes(true);        return resolver;    }    @Override    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {        configurer.enable();    }}
@Configuration@ComponentScan(basePackages={"spittr"},    excludeFilters= {@Filter(type = FilterType.ANNOTATION , value=EnableWebMvc.class)}        )public class RootConfig {}

我们已经配置好了DispatcherServlet,启用了基本的SpringMVC组件,下面就是使用SpringMVC控制器去处理web请求。

@Controller@RequestMapping(value = "/hello")public class HelloController {    @RequestMapping(value = "/show",method = RequestMethod.GET)    public String showUser(@RequestParam("user_id") long user_id , Model model)        model.addAttribute(userRespository.findOne(user_id));        return "user";    }}

如图请求是xxxx/hello/show 参数是user_id
返回结果是model,储存user信息,渲染视图是user.jsp
当然,在控制器中,可以进行很复杂的处理操作,这些操作可以被一层层封装起来,达到良好的项目质量。

阅读全文
1 0