spring学习(四) 初学spring mvc

更多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个方法:

  1. getServletMappings,它会将一个或多个路径映射到DispatcherServlet上
  2. getServletConfigClasses,该方法返回的带有@Configuration注解的类将会用来定义DispatcherServlet应用上下文中的bean.
  3. 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注解添加在类级别上时,这个注解会应用到该控制器的所有方法上.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值