zoukankan      html  css  js  c++  java
  • SpringMVC基础配置

    上一张:SpringMVC环境搭建

    今天我们来说说SpringMVC的基础配置。目前越来越多的主流框架都支持注解,同时我们无敌的Spring也支持基于注解的"零配置"。

    注解相比XML的优势:它可以充分利用Java的反射机制获取类中的结构信息,这些信息可以有效减少配置的工作,注释和Java代码位于一个文件中,更加利于维护。

    注意:必须要在Spring2.5版本之后才可以使用注解方式。

    注解方式将Bean的定义信息和Bean的实现类结合在一起,Spring提供的注解有。

    @Component:声明一个普通的Bean类

    @Repository:声明一个持久层Dao类

    @Service:声明一个业务层类

    @Controller:声明一个控制器类

    这4个注解相信小伙伴们已经非常的熟悉了,废话就少说了。我们使用注解千万不要忘了在类中扫描!!!

    @RequestMapping(非常核心的一个注解),这个注解是用来指定控制器的请求URL。

    在控制器的类定义:提供初步的映射信息,为该类下所有请求方法添加一个前缀。

    在控制器类中的方法定义:提供进一步的映射信息,提供方法的请求路径

    DispacherServlet截获请求后,就通过 控制器上的@RequestMapping提供的映射信息确认请求所对应的处理方法。

    @Controller
    @RequestMapping("user")
    public class UserController {
        @RequestMapping("/hello")
        public String hello(){
            return "hello";
        }
    }

    这个时候我们请求的路径是http://localhost:8080/SpringMvcDemo2/user/hello

    @RequestMapping除了映射请求URL请求,还可以使用请求方法,请求参数和请求头的请求,注解中有几个参数:

    1)value:表示请求的URL

    2)method:表示请求的方式(GET/POST)

    3)params:表示请求的参数

    4)heads:请求头

    他们之间的是与的关系,联合使用多个请求可以让请求更加的精确化。

    @RequestMapping(value="hello2",method=RequestMethod.POST,params={"username","userpass"},headers="contentType=text/*")
        public String hello2(){
            return "hello";
        }

    这段代码表示,请求的地址是hello请求方式为Post必须带username,userpass两个参数,请求头contentType必须是text/开头。我们可以写两个URL一样的方法,请求方式一个POST另一个GET当时会严格根据设置进行调用

    @RequestMapping同时还支持Ant风格的URL,在Ant中支持3种通配符。

    ?:表示配置一个字符。

    *:匹配任意字符

    **:匹配多层路径

    在SpringMVC中对参数的处理:

    @pathVariable:URL模板方式

      用来映射URL中的占位符,映射的变量名必须和占位符中的名称一致,像这种我们的请求地址就会时http://localhost:8080/SpringMvcDemo2/user/testPathVariable/Miya,这个miya就是我们传过去的参数,在传统的URL中testPathVariable?username=miya但是这种不利于百度的收录。

    @RequestMapping("/testPathVariable/{username}")
        public String hello3(@PathVariable("username")String username){
            System.out.println("username :  " + username);
            return "hello";
        }

    @RequestParam:获取请求参数,如果请求参数名字和类型的名字一致我们可以省略吊这个注解,一样可以接受到值。

    @RequestMapping("/textParam")
        public String hello4(@RequestParam("username")String username,@RequestParam("userpass")String userpass){
            System.out.println("userpass :  " + userpass);
            return "hello";
        }

    @RequestHeader:获取请求头的参数

      在这里有三个参数,value:指定参数的名称,required:指定参数是否为必填,defualtValue:指定参数的默认值。

    @RequestMapping("/testRequestHeader")
        public String hello5(@RequestHeader("Accept-Language") String language){
            System.out.println("language=" + language);
            return "hello";
        }

    @CookieValue:用来获取客户端Cookie的信息。

    @RequestMapping("/testCookieValue")
        public String hello6(@CookieValue("JSESSIONID")String sessionid){
            System.out.println("sessionid=" + sessionid);
            return "hello";
        }

    SpringMVC可以使用ServletAPI作为请求方法的参数

    @RequestMapping("/testServletAPI")
        public String hello7(HttpServletRequest request,HttpServletResponse response,HttpSession session){
            //我们可以在这里使用
            return "hello";
        }

    SpringMVC提供了以下几种处理模型数据的方式。

    1)ModelAndView:将处理方法的返回类型设置为ModelAndView方法体可通过该模型对象添加模型数据。既包含视图,也包含模型信息

    @RequestMapping("/testModelAndView")
        public ModelAndView hello8(){
            ModelAndView modelAndView = new ModelAndView("hello");
            //添加单个值
            modelAndView.addObject("h","Hello Spring MVC");        
            return modelAndView;
        }

    2)Map及形参:当形参为Map,Model,ModelMap时,处理方法返回时,Map中的数据会自动添加到模型中。 

      Spring MVC在内部使用了一个Model接口存储数据的数据,在调用方法前会创建一个隐含的模型对象作为数据模型的存储容器。如果传入的参数为Map,Model,ModelMap时,SpringMVC会自动保存到容器中

    @RequestMapping("/testMap")
        public String hello9(Map<String,Object> map){
            map.put("mapdata", "map data");
            return "hello";
        }

    3)@SessionAttributes:将这个模型中的某个属性存储到Session中,以便多个请求之间共享这个属性,只能用来修饰类。在里面的方法如果参数容器中如map里卖弄保存一个与定义的属性名字相同会保存到容器中共享

    4)@ModelAttribute:方法形参标记该注解后,形参对象就会放到模型中。

      SpringMVC在调用方法之前会逐个调用方法上标注了这个注解的方法。将@ModelAttribute中的属性保存到map中,可在执行表单提交生成对象之前,替换执行方法名相同的参数。

    @ModelAttribute
    public User getUser(){
        User user = new User();
        System.out.println("调用 getUser 方法");
        //默认保存名字为类名首字母小写的user对象到Request中
        return user;
    }
    
    @ModelAttribute
    public void getUserById(Integer id,Map<String,Object> map){
        User myuser = new User();
        map.put("myuser", myuser);
        //手动指定user对象的名称,到Request中
        System.out.println("调用 getUser 方法");
    }

    由@SessionAttributs会引发一个很容易轻视的错误当类使用@SessionAttributes修饰,而方法中使用了和SessionAttributes修饰同名的映射参数,确没有添加@ModelAttribute修饰时,则会报错。

  • 相关阅读:
    什么是微服务架构!
    Redis使用总结 (序列三)
    redis centos linux操作系统安装及集群使用(序列二)
    Python操作Redis缓存数据库
    高并发系统的限流实现方式
    如何服务器的操作系统中的型号
    B8 Concurrent JDK中的乐观锁与原子类
    B7. Concurrent 锁的分类
    B6. Concurrent 内存模型与线程
    B5. Concurrent JVM 锁优化
  • 原文地址:https://www.cnblogs.com/SimpleWu/p/9692383.html
Copyright © 2011-2022 走看看