美文网首页
Springboot入门注解总结

Springboot入门注解总结

作者: 流年划破容颜_cc55 | 来源:发表于2018-08-01 15:39 被阅读14次

    基于个人的理解:大家肯定都很烦了ssm框架体系中的多个xml文件的,而这个springboot就是采用自动配置的机制,免除或降低了很多的了xml文件的依赖。而这个可能还不是springboot真正厉害之处。基于springboot加springcloud形成的微服务架构必然会是以后发展的主流。甚至实现大一统。

    使用@Controller实现URL路由

    现代Web应用往往包括很多页面,不同的页面也对应着不同的URL。对于不同的URL,通常需要不同的方法进行处理并返回不同的内容。

    匹配多个URL

    @RestController

    public class Application {

        @RequestMapping("/")

            public Stringindex() {

                return"Index Page";   

     }

    @RequestMapping("/hello")

        public Stringhello() {

            return"Hello World!";

        }

    }

    @RequestMapping可以注解@Controller类:

    @RestController

    @RequestMapping("/classPath")

    public class Application {

            @RequestMapping("/methodPath")

                public String method() {

                    return"mapping url is /classPath/methodPath";

        }

    }

    method方法匹配的URL是/classPath/methodPath"。

    提示

    可以定义多个@Controller将不同URL的处理方法分散在不同的类中


    URL中的变量——PathVariable

    在Web应用中URL通常不是一成不变的,例如微博两个不同用户的个人主页对应两个不同的URL: [http://weibo.com/user1](http://weibo.com/user1),[http://weibo.com/user2](http://weibo.com/user2)。我们不可能对于每一个用户都编写一个被@RequestMapping注解的方法来处理其请求,Spring MVC提供了一套机制来处理这种情况:

    @RequestMapping("/users/{username}")

        public String userProfile(@PathVariable("username") String username) {

            return String.format("user %s", username);

    }

    @RequestMapping("/posts/{id}")

        public Stringpost(@PathVariable("id")int id) {

                    return String.format("post %d", id);

    }

    在上述例子中,URL中的变量可以用{variableName}来表示,同时在方法的参数中加上@PathVariable("variableName"),那么当请求被转发给该方法处理时,对应的URL中的变量会被自动赋值给被@PathVariable注解的参数(能够自动根据参数类型赋值,例如上例中的int)。


    支持HTTP方法

    对于HTTP请求除了其URL,还需要注意它的方法(Method)。例如我们在浏览器中访问一个页面通常是GET方法,而表单的提交一般是POST方法。@Controller中的方法同样需要对其进行区分:

    @RequestMapping(value ="/login", method = RequestMethod.GET)

        public StringloginGet() {

            return"Login Page";

        }

    @RequestMapping(value ="/login", method = RequestMethod.POST)

        public StringloginPost() {

            return"Login Post Request";

    }

    在新的springboot版本中,为了结合Restful API风格实现前后端分离的思想。GET方法其实可以写成这个样子@GetMapper()这个注解,post,put,delete方法也是一样。


    模板渲染

    在之前所有的@RequestMapping注解的方法中,返回值字符串都被直接传送到浏览器端并显示给用户。但是为了能够呈现更加丰富、美观的页面,我们需要将HTML代码返回给浏览器,浏览器再进行页面的渲染、显示。

    一种很直观的方法是在处理请求的方法中,直接返回HTML代码,但是这样做的问题在于——一个复杂的页面HTML代码往往也非常复杂,并且嵌入在Java代码中十分不利于维护。更好的做法是将页面的HTML代码写在模板文件中,渲染后再返回给用户。为了能够进行模板渲染,需要将

    @RestController改成@Controller:

    @Controller

    public class  HelloController {

            @RequestMapping("/hello/{name}")

                public Stringhello(@PathVariable("name") String name, Model model) {       

                         model.addAttribute("name", name);

                            return"hello"

        }

    }

    在上述例子中,返回值"hello"并非直接将字符串返回给浏览器,而是寻找名字为hello的模板进行渲染,我们使用Thymeleaf模板引擎进行模板渲染

    详细可以查看thymely官方文档


    处理静态文件

    浏览器页面使用HTML作为描述语言,那么必然也脱离不了CSS以及JavaScript。为了能够浏览器能够正确加载类似/css/style.css,/js/main.js等资源,默认情况下我们只需要在src/main/resources/static目录下添加css/style.css和js/main.js文件后,Spring MVC能够自动将他们发布,通过访问/css/style.css,/js/main.js也就可以正确加载这些资源。


    @RequestHeader、@CookieValue

    @RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。

    示例代码:

    这是一个Request 的header部分:

    Host                                 localhost:8080

    Accept                            text/html,application/xhtml+xml,application/xml;q=0.9

    Accept-Language            fr,en-gb;q=0.7,en;q=0.3

    Accept-Encoding                gzip,deflate

    Accept-Charset                  ISO-8859-1,utf-8;q=0.7,*;q=0.7

    Keep-Alive                            300

    @RequestMapping("/displayHeaderInfo.do")

    public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,

                                  @RequestHeader("Keep-Alive") long keepAlive)  {

                  //...

    }

    上面的代码,把request header部分的 Accept-Encoding的值,绑定到参数encoding上了, Keep-Alive header的值绑定到参数keepAlive上。

    @CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上。

    例如有如下Cookie值:

    JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84

    @RequestMapping("/displayHeaderInfo.do")

    public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie)  {

      //...

    }


    @SessionAttributes, @ModelAttribute

    @SessionAttributes:

    该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用。

    该注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象;

    示例代码:

    @Controller

    @RequestMapping("/editPet.do")

    @SessionAttributes("pet")

    public class EditPetForm {

        // ...

    }

    @ModelAttribute

    该注解有两个用法,一个是用于方法上,一个是用于参数上;

    用于方法上时:  通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;

    用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:

    A) @SessionAttributes 启用的attribute 对象上;

    B) @ModelAttribute 用于方法上时指定的model对象;

    C) 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。


    // Add one attribute

    // The return value of the method is added to the model under the name "account"

    // You can customize the name via @ModelAttribute("myAccount")

    @ModelAttribute

    public Account addAccount(@RequestParam String number) {

        return accountManager.findAccount(number);

    }

    这种方式实际的效果就是在调用@RequestMapping的方法之前,为request对象的model里put(“account”, Account);

    用在参数上的@ModelAttribute示例代码:

    @RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)

        public String processSubmit(@ModelAttribute Pet pet) {

    }

    首先查询 @SessionAttributes有无绑定的Pet对象,若没有则查询@ModelAttribute方法层面上是否绑定了Pet对象,若没有则将URI template中的值按对应的名称绑定到Pet对象的各属性上。

    相关文章

      网友评论

          本文标题:Springboot入门注解总结

          本文链接:https://www.haomeiwen.com/subject/inhrvftx.html