spring实用注解(二)--springMvc注解

前一篇介绍了spring基本的实用注解,本文将对springMVC注解进行介绍。
一、开启springMvc的注解
1、@EnableWebMvc
开启对spring web mvc支持的配置类,此注解会开启一些默认配置,如ViewResolver等。
2、定制spring mvc需要在加注解@EnableWebMvc类上,实现接口
org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter,
并且加上映射器viewResolver、
静态资源映射、
拦截器等
如:
@ComponentScan("com.dragon.springStudy")
@Configuration
@EnableWebMvc
public class SpringWebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public InternalResourceViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/classes/views/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setViewClass(JstlView.class);
        return viewResolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }

    @Bean
    public MultipartResolver multipartResolver(){
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
        commonsMultipartResolver.setMaxUploadSize(1000000);
        return commonsMultipartResolver;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(simpleInterceptor());
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        super.addViewControllers(registry);
        registry.addViewController("directPage").setViewName("directPage");
        registry.addViewController("servletAsync").setViewName("servletAsync");
    }

    @Bean
    public SimpleInterceptor simpleInterceptor(){
        return new SimpleInterceptor();
    }

}

3、对于加注解@EnableWebMvc的springMvc配置类,需要在实现org.springframework.web.WebApplicationInitializer接口的类来加载springMvc配置类,
WebApplicationInitializer是用来配置servlet3.0+配置的接口,用来代替配置文件web.xml的功能,
如:
public class WebInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringWebConfig.class);
        ctx.setServletContext(servletContext);
        ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher",new DispatcherServlet(ctx));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
        servlet.setAsyncSupported(true); //开启servlet3.0+的异步方法支持
    }
}

二、springMvc常用注解

1、@Controller

声明控制器

2、@RequestMapping

映射web请求,注解在类上或方法上,

内部有参数,

value,表示路径,如value="path";

produces,表示返回的媒体类型和字符集

如返回json数据,则有

@RequestMapping(value = "/getJson", produces = {"application/json;charset=utf-8"})
@ResponseBody
如返回xml数据,则有

@RequestMapping(value = "/getXml",produces = "application/xml;charset=UTF-8")
@ResponseBody

如返回文本,则有

@RequestMapping(value = "/getText" ,produces = {"text/plain;charset=utf-8"})
@ResponseBody

实例如:

@RequestMapping(value = "/getJson", produces = {"application/json;charset=utf-8"})
@ResponseBody
public Student getJson(Student stu) {
    stu.setName("apple");
    return stu;
}

@RequestMapping(value = "/getXml",produces = "application/xml;charset=UTF-8")
@ResponseBody
public Student getXml(Student stu){
    stu.setName("apple");
    return stu;
}

备注:添加json和xml的maven依赖


    com.fasterxml.jackson.core
    jackson-databind
    2.6.0


    com.fasterxml.jackson.dataformat
    jackson-dataformat-xml
    2.6.0

3、@ResponseBody

将返回值直接给用户,而不是表示逻辑页面

4、@RequestBody

表示请求参数在request请求体中,而不是在url后面

5、@RequestParam

表示接收请求参数

6、@PathVariable

用来接收路径中的参数

7、@RestController

是一个组合注解,是@Controller和@ResponseBody的组合,表示是一个控制器,且直接返回结果

8、@ControllerAdivce

注解在类上,开启对控制器全局配置,

@ControllerAdvice
public class BaseControllerAdvice {}

在类内部方法上,有几下注解进行全局配置:

a)@ExceptionHandler

全局处理控制器内的异常,如

@ExceptionHandler(value = Exception.class)
public String exceptionHandler(Exception e, WebRequest request, Model model){
    model.addAttribute("errorMsg",e.getMessage());
    return "error";
}

b)@InitBinder

用来设置WebDataBinder,WebDataBinder用来自动绑定前台请求参数到Model中

@InitBinder
public void initBinder(WebDataBinder webDataBinder){
    webDataBinder.setDisallowedFields("name"); //忽略name值的绑定,注意是model中,如自定义的Student实例对象
    webDataBinder.registerCustomEditor(Date.class,new MyDateEditor());  //定义string到Date的映射
}

//自定义Date绑定格式
class MyDateEditor extends PropertyEditorSupport{
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        try {
            Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(text);
            setValue(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

c)@ModelAttribute

全局绑定键值对到Model中,也就是绑定后,全局controller内的model都有设定的值

@ModelAttribute
public void addDate(Model model){
    model.addAttribute("nowDate", DateFormatUtils.format(new Date(),"yyyy-MM-dd hh:mm:ss"));
}
当然也可以在请求方法内,通过注解@ModelAtttribute获取绑定的值,如:

@RequestMapping("/")
public String index(@ModelAttribute("nowDate") String nowDate) {}


你可能感兴趣的:(spring)