restful风格,restcontroller与controller

初步接触springmvc的时候,被要求使用restful风格,彼时一头雾水,不懂何谓restful,参阅了很多资料,慢慢的接触的也越来越多,如今spring的况且已基本运用熟练,简单谈一下我的一些看法,当然,只是我自己的浅显粗陋的见解,不对的地方还望指正。

restful风格

简单的理解,restful是一种url风格,或者说是规范,在以前的网址中,假定一个业务,取得数据网址为http://test/get,添加信息的网址为http://test/post,类似这样。 
但是在restful风格中,取得数据和添加数据的网址均应为http://test,方法为get或者post;所以,在restful风格中,一个网址就是一个资源,其形式类似于http://xxx.com/xx/{id}/{id} ,例如某购物网站,产品有很多种类,每种产品下有很多子类型,那么http://shop.com/laptop/lenovo/1103 代表了联想1103型号电脑,而http://shop.com/laptop/hp/1024 代表了2014型号电脑。

在spring mvc中,有@requestparm, @requestbody和@pathvariable 三种注解来获得浏览器端的参数,其中前两者都是由浏览器post提交的参数,而@pathvariable 则是从网址中取得参数;假设代码如下:

@Requestmapping(value="/{category}/{brand}/{id},method=RequestMethod.POST)
public void getbyid(@PathVariable("category") String category
@PathVariable("brand") String brand
@PathVariable("id") String id){
//具体代码略
}
在上述代码中,访问http://shop.com/laptop/hp/1024网址时,则,category为“laptop”,brand为”hp”,id为”1024”;所以说,在restful风格中,一个网址即表示了一个资源。

restcontroller与controller

假定一个user对象,对象有很多属性(name,sex,age,birth,address,tel) 
在我的了解中,这二者的区分为:@restcontroller为@controller和@responsebody的结合 
在@controller注解中,返回的是字符串,或者是字符串匹配的模板名称,即直接渲染视图,与html页面配合使用的,在这种情况下,前后端的配合要求比较高,java后端的代码要结合html的情况进行渲染,使用model对象(或者modelandview)将user的属性渲染到页面; 
java示例代码如下:

@Controller
@RequestMapping(method = RequestMethod.GET, value = "/")
public String getuser(Model model) throws IOException { model.addAttribute("name",bob);
model.addAttribute("sex",boy);
return "user";
}
对应的html代码:
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div>
<p>"${name}"</p>
<p>"${sex}"</p>
</div>
</body>
</html>
而在@restcontroller中,返回的应该是一个对象,即return一个user对象,这时,在没有页面的情况下,也能看到返回的是一个user对象对应的json字符串,而前端的作用是利用返回的json进行解析渲染页面,java后端的代码比较自由。 

java端代码:

@RestController
@RequestMapping(method = RequestMethod.GET, value = "/")
public User getuser( ) throws IOException {
User bob=new User();
bob.setName("bob");
bob.setSex("boy");
return bob;
}

访问网址得到的是json字符串{“name”:”bob”,”sex”:”boy”},前端页面只需要处理这个字符串即可。

http://blog.csdn.net/pinebud55/article/details/52183238?locationNum=12;

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

1.@RestController与@Controller的作用及区别

作用:

都是用来表示spring某个类的是否可以接收HTTP请求

原因:使用@RestController注解后,无法跳转指定页面的问题 
解决:改用@Controller注解即可

一,对比@Controller与@RestController

@Controller注解源码:

package
org.springframework.stereotype;

import
java.lang.annotation.Documented;

import
java.lang.annotation.ElementType;

import
java.lang.annotation.Retention;

import
java.lang.annotation.RetentionPolicy;

import
java.lang.annotation.Target;

import
org.springframework.stereotype.Component;

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Component

public @interface Controller {

String value() default "";

}

@RestController注解源码:

package org.springframework.web.bind.annotation;
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
 
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    String value() default "";
}

官方文档对@RestController的解释:

@RestController is a stereotype annotation that combines @ResponseBody and @Controller.

结论 : @RestController注解相当于@ResponseBody + @Controller合在一起的作用。

为Controller类使用@RestController注解

Controller类使用@RestController注解,Controller中的方法无法返回jsp页面
配置的视图解析器InternalResourceViewResolver不起作用
例如:return “hello" 不会返回hello.jsp页面,会直接输出hello字符串

这里大家要清楚一个概念:

1)返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行
 
2)如果需要返回JSONXML或自定义mediaType内容到页面显示,需要在对应的方法上加上@ResponseBody注解。

RestController 和Controller的区别的更多相关文章

  1. @restcontroller与@controller的区别

    这段时间偷偷看了下spring boot.结果引用模板时没注意,把@restcontroller替换了@controlle,结果模板出不来.终究原因是spring的知识不到位. 下面说说这2的说明和区 ...

  2. 注解@RestController与@Controller的区别

    开发RESTful API 时,一般都会在Controller上加上@Controller注解,但是有时候加上@RestController,当同事问为什么的时候,我也一脸懵逼,默默的看了资料,现在就 ...

  3. 浅谈@RestController和@Controller的区别

    在做Spring MVC开发时,如果对@RestController或者@Controller这两个注解理解不够清晰的话,就难免会出现用混的情况.而混用的结果往往是无法实现期望的跳转结果或者是直接将跳 ...

  4. @RestController 与 @Controller 注解区别

    文章来源:https://www.cnblogs.com/hello-tl/p/9202658.html @RestController注解相当于@ResponseBody + @Controller ...

  5. RestController和Controller的区别

    知识点:@RestController注解相当于@ResponseBody + @Controller合在一起的作用. 1) 如果只是使用@RestController注解Controller,则Co ...

  6. SpringMVC中@RestController和@Controller的区别

    在使用SpringMVC时,对于Controller中的注解@RestController和@Controller需要我们区分清楚 @RestController注解相当于@ResponseBody和 ...

  7. SpringBoot 中 @RestController 和 @Controller 的区别

    1 - 在springboot中,@RestController 相当于 @Controller + @ResponseBody;2 - 即在Controller类中,若想返回jsp或html页面,则 ...

  8. @RestController和@Controller的区别与作用

    在springMvc中controller层类上的要使用@Controller来注明该类属于控制层,在controller层常返回的数据形式有以下几种: 页面:静态页面 ModelAndView:返回 ...

  9. @RestController 与 @Controller @RequestMapping("/") 区别很大

    后者可以通过返回字符串,返回到指定路径的html http://localhost:8080/  这样显示 ,但是仍以get方式请求的. https://www.cnblogs.com/zgqys19 ...

随机推荐

  1. nagios二次开发(四)---nagios监控原理和nagios架构简介

    nagios监控原理 下面根据上面摘自网络的原理图对nagios的监控原理进行一下简单的说明: 1.nagios通过nsca进行被动监控.那么什么是被动监控呢?被动监测:就是指由被监测的服务器主动上传 ...

  2. BASE64编码和解码(VC源代码) 并 内存加载 CImage 图像

      BASE64可以用来将binary的字节序列数据编码成ASCII字符序列构成的文本.完整的BASE64定义可见 RFC1421和 RFC2045.编码后的数据比原始数据略长,为原来的4/3.在电子 ...

  3. 实现android手机来电拦截系统页面弹出自定义页面特效

    如何实现android手机来电拦截系统页面弹出自定义页面特效, 首先:    我们需要注册一个监听来电的广播PhoneStateReceiver 类:其次:    在onReceive里面我们获取an ...

  4. C#Json序列化数据库对象

    //该方法使用NewtonJson.dll插件,需要引用 //using Newtonsoft.Json;//using Newtonsoft.Json.Converters; var data = ...

  5. webapp开发中的一些注意的

    和大多数响应式的布局一样,webapp开发也是需要浮动布局和百分比布局,需要考虑的是小屏幕手机250px和大屏幕设备768px,但是习惯以320px和640px来分割,jq中的一句话$(functio ...

  6. NLua - 基于Lua的C#脚本引擎

    Nlua NLua is the bind between Lua world and the .NET world. NLua is a fork of project LuaInterface ( ...

  7. Windows 磁盘检查命令

    今天在给朋友重装系统时,发现每次重启时总是出现下面的问题 上网搜索了下这个问题,可能的原因是:把磁盘格式转换成NTFS时没等转换完就重启或关机造成的. 解决方案:使用 "chkdsk/f D ...

  8. C#获取本机公网IP

    /// <summary> /// 获取本机公网IP /// </summary> /// <returns></returns> public sta ...

  9. iOS 9/10强制使用https访问网络,使用了第三方SDK的应用需要配置的信息

    2017年01月01日起苹果将全面禁止使用http来访问网络. 网上扒了一些资源,解决方法还是有的,但是都不确定是否可以通过审核,毕竟实践才是检验真理的唯一标准. 后续如果上线成功,再来分享. 如果应 ...

  10. node.js 基础学习笔记3 -express

    1.工作原理 当通过app.js建立的服务器时,会看到一个简单的页面.返回页面时,浏览器会向服务器发送请求.app会解析请求的路径,调用相应的逻辑,调用对应的视图模板,传递对象数值,最终生成HTML页 ...