资讯专栏INFORMATION COLUMN

spring-mvc注解

EdwardUp / 2448人阅读

摘要:关键注解的关键注解主要有其中主要是用于标记该类是一个控制器,用于指示的哪一个类或方法来处理请求动作,即用于标识具体的处理器。默认已经装配了作为组件的实现类,而由使用,将请求信息转换为对象。

关键注解

springmvc的关键注解主要有@Controller/@RequestMapping/@RequestParam/@PathVariable/@RequestHeader/@CookieValue/@SessionAttributes/@ModelAttribute
其中@Controller主要是用于标记该类是一个控制器,@RequestMapping用于指示spring的哪一个类或方法来处理请求动作,即用于标识具体的处理器。

Model/ModelAndView和ModelMap的区分

每个请求处理方法可以有多个不同类型的参数,可以出现在请求处理方法中的参数类型有:HttpServletRequest/HttpServletResponse/HttpSession/WebRequest/NativeWebRequest/Locale/InputStream/OutputStream/Principal/Map/Model/ModelMap/RedirectAttributes/Errors/BindingResult/SessionStatus/UriComponentsBuilder等。举例如下:若需要访问HttpSession

@RequestMapping("")
public String login(HttpSession session){....}

Model是一个Spring MVC类型,其中包含了Map对象用来存储数据,如果方法中添加了Model参数,则每次调用请求处理方法时,SpringMVC都会创建model对象,并将其作为参数传递给方法。

如何将模型数据传递给控制器和视图是Spring MVC的一项重要工作,Spring MVC主要提供了多种途径,下面分类进行介绍:
1.Model和ModelMap: Spring MVC在内部使用了一个Model接口存储数据模型数据,它的功能类似于Map接口,但是比map接口容易使用,而ModelMap接口实现了Map接口。Spring MVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器,如果处理方法的参数有Model或ModelMap类型,则Spring MVC会将隐含模型的引用传递给这些参数,在处理方法内部,开发者就可以通过这些参数来引用模型数据,当然也可以向模型中添加新的属性。
2.ModelAndView :其和Model差不多,但是其不仅包含模型数据,还包含视图信息,可以通过ModelAndView设置其视图路径:举例如下:

@RequestMapping("")
public ModelAndView login(ModelAndView mv){
    mv.setViewName("视图路径");
    return mv;
}
参数绑定

@RequestParam举例如下:
注意:一旦使用了@RequestParam注解,就要求前台必须传递@RequestParam要求的参数,否则后台就不会响应

@RequestMapping("")
public ModelAndView login(@RequestParam("loginname") String loginname,
                          @RequestParam("password") String password){
    ..........
}

@PathVariable
用于获取URL中的动态参数

URL:http://localhost:8080/pathtest/1
@RequestMapping("/pathtest/{userId}")
public ModelAndView login(@PathVariable Integer userId){
    ..........
}
//上例中userId就是动态参数

@RequestHeader
用于将请求头中的信息映射到处理方法的参数中,举例如下:

@RequestMapping("/pathtest")
public ModelAndView login(@RequestHeader("User-Agent") String userAgent){
    ..........
}

@CookieValue
用于将请求的Cookie数据映射到功能处理的方法参数上。

@RequestMapping("/pathtest")
public ModelAndView login(@CookieValue("JSESSIONID") String sessionId){
    ..........
}

@SessionAttribute
允许我们有选择地指定Model中哪些属性需要存储到HttpSession对象中
注意@SeesionAttribute只能声明在类上,不能声明在方法上

@Controller
@SessionAttribute("user")
public class SessionController{......}
@ModelAttribute

@ModelAttribute注解的方法,会在请求进入处理方法之前,先拦截请求,做过处理后再将请求转发给具体的处理方法,举例如下:

@Controller
public class ModelAttributeController{
    @ModelAttribute("loginname")
    public String userModel(RequestParam(loginname) String loginname){
    //使用@ModelAttribute注释的value属性,来指定model属性的名称,model属性的值就是方法的返回值
        return loginname;    
    }
    @RequestMapping("/login")
    public String loing1(){
        return "result"
    }
}
上例中,在请求进入login1方法之前,请求会先进入userModel方法

@Controller
public class ModelAttributeController{
    @ModelAttribute
    public String userModel(String loginname,Model model){
    //model中将会存储一个参数(String=loginname)
        return loginname;    
    }
    @RequestMapping("/login")
    public String loing1(Model model){
        return "result"
    }
}

@Controller
public class ModelAttributeController{
    
    @ModelAttribute("username")
    @RequestMapping("/login")
    public String loing1(Model model){
        return "result"
    }
}
上述示例中,@ModelAttribute和@RequestMapping同时注释一个方法,loing1的返回值不再是视图名称,而是model的属性值,视图名称是@RequestMapping的value值“login”


@Controller
public class ModelAttributeController{
    
    @ModelAttribute("user")
    public User userModel5(){
        ....
    }
    @RequestMapping("/login")
    public String login5(@ModelAttribute("user") User user){
        return "result"
    }
}
//上例中userModel5(...)方法先于login5(...)方法调用,userModel5(...)方法会在Model中添加一个属性,key是@ModelAttribute的值“user”,value是userModel5(...)方法的返回值。 login5(...)方法中的@ModelAttribute的意思是将Model中的user属性赋值给login5(...)的方法参数。
信息转换

Spring3.0 新增加了一个重要信息转换接口HttpMessageConverter,该接口负责将请求信息转换为一个对象,对象类型为T,并将转换后的对象绑定到请求方法的参数中。DispatcherServlrt默认已经装配了RequeestMappingHandlerAdapter作为HandlerAdapter组件的实现类,而HttpMessageConverter由RequestMappingHandlerAdapter使用,将请求信息转换为对象。

HttpMessageConverter接口的具体实现类有:StringHttpMessageConverter ,FormHttpMessageConverter ,XmlAwareFormHttpMessageConverter ,ResourceHttpMessageConverter ,SourceHttpMessageConverter ,ByteArrayHttpMessageConverter等。

RequestMappingHandlerAdapter可以默认已经安装了几个HttpMessageConverter,如果需要装配其他类型的HttpMessageConverter,需要自定义一个RequestMappingHandlerAdapter,举例如下:


    
        
            
            ......
        
    
Json数据转换

如果要想使用SpringMVC处理JSON格式的数据,首先需要在RequestMappingAdapter上配置JSONX信息转换器,如下所示:


    
        
            
            
                
                    text/html
                    application/json
                
            
            
            ......
        
    

@Requestbody注解用于读取Request请求中的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到Controller中方法的参数上。当前台页面使用GET或POST方法提交数据时,数据编码格式由请求头的ContentType指定,可以分为以下几种情况:
1.application/x-www-form-urlencoded,这种情况可以由@RequestBody处理也可以由其他注解处理;
2.multipart/form-data,@RequestBody不能处理这种格式;
3.application/json、application/xml等格式的数据,必须使用@RequestBody来处理;

在实际开发中可以使用@RequestBody注解很方便地接收JSON格式的数据,并将其转换为对应的数据类型。@RequestBody的使用举例如下:

@Controller
public class JsonController{
    @RequestMapping("/json")
    @ResponseBody
    public Map  testJson(@RequestBody Book  book){....}
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70502.html

相关文章

  • 『SpringMVC』<context:include-filter>&<

    摘要:现在给定一个项目的包结构在中有以下配置只扫描注解可以看出要把最后的包写上,不能包含子包,所以不能写成。   大家好,我是猪弟,猪在我心中从来不是蠢的代名词,而是懒的代名词,本次准备记录一个在开发测试过程中遇到的问题,跟踪了三天spring和第三方RPC组件的源码,最终发现了问题是因为第三方组件没有处理好而父子容器导致的,还有一个因素是spring注解扫描重叠。 Spring版本:4.3...

    darryrzhong 评论0 收藏0
  • spring-MVC源码解读(一)

    摘要:处理器是继前端控制器的后端控制器,在的控制下对具体的用户请求进行处理。由于涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发。 1、mcv整体架构和流程 showImg(https://segmentfault.com/img/bV55Qq?w=860&h=406); 用户发送请求至前端控制器 DispatcherServlet DispatcherServlet 收到...

    I_Am 评论0 收藏0
  • SpringMVC入门笔记

    摘要:入门笔记简介是一种基于的实现了设计模式的请求驱动类型的轻量级框架,是系开源项目中的一个,和配合使用。配置在中需要添加使用的和映射规则。入门较快,而掌握起来相对较难。 SpringMVC入门笔记 1. 简介 Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架 ,是Spring系开源项目中的一个,和IoC配合使用。通过策略接口,Spring...

    zhaochunqi 评论0 收藏0
  • 使用maven创建简单的多模块 Spring Web项目

    摘要:第一次写技术文章,主要内容是使用创建一个简单的项目,如有操作或理解错误请务必指出,当谦虚学习。基本思想其实就是一个项目引用别的模块包,最终项目被打成包发布。 第一次写技术文章,主要内容是使用maven创建一个简单的SpringMVC WEB 项目,如有操作或理解错误请务必指出,当谦虚学习。做这一次的工作主要是因为想加强一下自己对Spring Web 项目的理解,因为平时都是直接写业务代...

    DevYK 评论0 收藏0
  • 轰轰烈烈的搭建Spring + Spring MVC + Mybatis

    摘要:配置和编码格式使用提供过滤器处理字符编码。请求从不改变资源的状态,无副作用。中添加,采用默认配置已经足够面对大多数场景注入参考链接手把手教你整合最优雅框架我的编码习惯接口定义设计最佳实践 创建项目 打开IDEA -> Create New Project勾选Create from archetypeshowImg(https://segmentfault.com/img/bV5tS4?...

    Fourierr 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<