java框架(2.1)@Controller和@RequestMapping注解

  • • 发表于 7年前
  • • 作者 大妖怪
  • • 2514 人浏览
  • • 1 条评论
  • • 最后编辑时间 7年前
  • • 来自 [技 术]

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

上章讲到了框架的搭建,在搭建框架的过程中我们用到了两个注解,一个是@Controller,另一个是@RequestMapping,其中@Controller用来标记控制器,@RequestMapping用来映射地址,下面来详细讲讲这两个注解的用法。

  • @Controller:
    @Controller注解只能标注在java类上主要是用于将普通的java类标记为控制器让SpringMVC可以扫描到。讲到这个注解,不得不讲一下一个和他很像的注解:@RestController,此注解是Spring4.0之后新增的,作用也是标记java类为控制器,但是多了一点特性,可以让类下所有方法都返回json格式的数据,我们来做个实验:
    在做这个之前,我们要开启”annotation-driven”:
    在spring-servlet.xml中加入这段配置就行了:
    <mvc:annotation-driven />
    

    这个注解的作用是
  • 注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。
    它解决了@Controller注解的使用前提配置,本来上章中忘了配置,发现@Controller能被请求所以就没写了这里要加上
  • 然后我们新建一个controller,用@Controller注解标记,在里面写一个方法return一个字符串”dayaoguai”(由于没有设置字符编码,所以用拼音):

    @Controller
    @RequestMapping(value = "/json")
    public class JsonController {
    
      @RequestMapping(value = "/test")
      public String jsonTest(){
    
          return "dayaoguai";
      }
    }
    

    写好之后我们启动项目,访问这个地址:

    恩,页面直接404了

    控制台也报了个错,至于为什么会这样,以后的课程中你就会知道原因了。
    那么我们将@Controller换成@RestController试试:

    @RestController
    @RequestMapping(value = "/json")
    public class JsonController {
    
      @RequestMapping(value = "/test")
      public String jsonTest(){
    
          return "dayaoguai";
      }
    }
    


    页面成功打印了dayaoguai,而控制台什么都没报。其实这就是返回了json格式的数据了,大家下去可以将”dayaoguai”这个字符串换成一个json字符串(一般用fastjson将对象转成json字符串)试试。

总结下异同:

  • 相同点:
    • 两个注解都可以将实体类标记为控制器让SpringMVC扫描到
  • 不同点:
    • @Controller return的内容不能被页面直接接收到
    • @RestController会将标记的内容返回为一个json格式的字符串,页面可以直接接收到
  • 接下来说说@RequestMapping这个注解:
    • 请求方式
      我们前面一直都是用GET请求方式,其实在我们还可以把请求方式改为POST,设置method属性即可:
      在上章TestController基础上修改
      @RequestMapping(value = "/test", method = RequestMethod.POST)
      public void test(){
        System.out.println("进来了");
      }
      
      改完运行之后再访问:

      页面报了405,说GET请求方式不允许被访问,

      控制台也报了同样的错误,
      我们用Poster进行POST请求试试:

      虽然页面报了404,但是我们可以看到控制台有打印,所以这个证明请求成功了。
      • restful:
        我们还可以将url映射成restful风格。
        @RequestMapping(value = "/restful/{id}")
        public void restful(@PathVariable int id){
        System.out.println(id);
        }
        
        这里我们还有另外两种写法:
        @RequestMapping(value = "/restful/{id}")
        public void restful(@PathVariable("id") int userId){
        System.out.println(userId);
        }
        
        @RequestMapping(value = "/restful/{id}")
        public void restful(@PathVariable(value="id") int userId){
        System.out.println(userId);
        }
        
        两种方式的效果是一样的。
        我们可以试着访问几个连接:
        http://localhost:8080/SpringMVC_Demo/test/restful/1
        http://localhost:8080/SpringMVC_Demo/test/restful/2
        http://localhost:8080/SpringMVC_Demo/test/restful/3
        通过查看控制台,你会发现,我们可以通过这种方式将参数携带进url中进行传递

        这种方式有个场景,比如说我们做app的文章分享页,页面是H5的,然后app点击分享之后提交个url给分享平台比如QQ,微信啥的,我们就可以利用这种连接,将文章id进行base64啥的方式进行加密,然后由app拼接连接,用户访问连接之后,后端拿到加密的id再解密,查到文章详情渲染给页面。
        当然,被”{}”包住的内容很强大,还可以支持正则表达式,有兴趣的同学可以私下研究。

总结:

  • @RequestMapping注解可以注解到类上也可以注解到方法上,如果类上没有可以直接访问方法的value路径,如果类上有,并且value不为空,需要先访问类的路径再访问方法的路径。
  • value属性表示访问的具体路径,如果注解只有这一个属性可以省略value,如”@requestMapping(“/test”)”。
  • method指定url的请求方式,需要使用RequestMethod枚举类,除了常用的GET,POST还有一些其它的,可以自行去了解。
  • 如果使用restful风格url进行传参,参数必须使用{}进行包裹,在接收参数的位置之前必须使用@PathVariable注解,如果接收参数变量名和{}的内容一样,@PathVariable注解可以不用设置属性,如果想自定义变量名,必须给@PathVariable设置value属性或者直接写上属性值。

另外附上项目源码:https://share.weiyun.com/72baeaceadb60a087a22f10309deb0ce

分享到:
1条评论
Ctrl+Enter
作者

大妖怪

大妖怪

APP:1 帖子:76 回复:200 积分:7517

已加入社区[2943]天

梦里巷口,可有你倚门回首

作者详情》
Top