响应 (接上文)

张开发
2026/4/6 20:02:52 15 分钟阅读

分享文章

响应 (接上文)
在我们前⾯的代码例⼦中都已经设置了响应数据,Http响应结果可以是数据,也可以是静态⻚⾯,也可 以针对响应设置状态码,Header信息等.返回静态⻚⾯创建前端⻚⾯index.html(注意路径)html代码如下:!DOCTYPE html html langen head meta charsetUTF-8 titleIndex⻚⾯/title /head body Hello,Spring MVC,我是Index⻚⾯. /body /html后台代码:RestController public class IndexController { RequestMapping(/index) public Object index(){ //返回index.html return /index.html; } }运⾏结果:http://127.0.0.1:8080/index结果却发现,⻚⾯未正确返回,http响应把 /index.html 当做了http响应正⽂的数据 那SpringMVC如何才能识别出来index.html 是⼀个静态⻚⾯,并进⾏返回呢? 我们需要把RestController 改为Controller正确代码如下:Controller public class IndexController { RequestMapping(/index) public Object index(){ return /index.html; } }再次运⾏:http://127.0.0.1:8080/index发现⻚⾯正确展⽰了RestController 和Controller 有着什么样的关联和区别呢? 咱们前⾯讲了MVC模式,后端会返回视图,这是早期时的概念随着互联⽹的发展,⽬前项⽬开发流⾏前后端分离模式, Java主要是⽤来做后端项⽬的开发,所以也就 不再处理前端相关的内容了MVC的概念也逐渐发⽣了变化,View不再返回视图,⽽是返回显⽰视图时需要的数据. 所以前⾯使⽤的 RestController 其实是返回的数据.RestController Controller ResponseBody Controller :定义⼀个控制器,Spring框架启动时加载,把这个对象交给Spring管理. ResponseBody :定义返回的数据格式为⾮视图,返回⼀个text/html信息RestController 源码Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Controller ResponseBody public interface RestController { AliasFor( annotation Controller.class ) String value() default ; }如果想返回视图的话,只需要把 ResponseBody 去掉就可以了,也就是 Controller返回数据ResponseBodyController ResponseBody public class IndexController { RequestMapping(/index) public Object index(){ return /index.html; } }加上 ResponseBody 注解,该⽅法就会把/index.html当做⼀个数据返回给前端.运⾏:http://127.0.0.1:8080/indexResponseBody 既是类注解,⼜是⽅法注解如果作⽤在类上,表⽰该类的所有⽅法,返回的都是数据,如果作⽤在⽅法上,表⽰该⽅法返回的是数据. 也就是说:在类上添加 ResponseBody 就相当于在所有的⽅法上添加了 ResponseBody 注解. 同样,如果类上有 RestController 注解时表⽰所有的⽅法上添加了 ResponseBody 注 解,也就是当前类下所有的⽅法返回值做为响应数据如果⼀个类的⽅法⾥,既有返回数据的,⼜有返回⻚⾯的,就把 ResponseBody 注解添加到对应的⽅ 法上即可.Controller public class IndexController { RequestMapping(/index) public Object index(){ return /index.html; } RequestMapping(/returnData) ResponseBody public String returnData(){ return 该⽅法返回数据; } }多个注解时,没有先后顺序,先写哪个都可以运⾏程序,浏览器响应结果如下:http://127.0.0.1:8080/returnData如果去掉ResponseBody 注解,程序会报404错误.Controller public class IndexController { RequestMapping(/index) public Object index(){ return /index.html; } RequestMapping(/returnData) public String returnData(){ return 该⽅法返回数据; } }程序会认为需要返回的是视图,根据内容去查找⽂件,但是查询不到,路径不存在,报404返回HTML代码⽚段后端返回数据时,如果数据中有HTML代码,也会被浏览器解析RequestMapping(/returnHtml) ResponseBody public String returnHtml() { return h1Hello,HTML~/h1; }运⾏程序,浏览器响应结果如下:http://127.0.0.1:8080/returnHtml通过Fiddler观察响应结果, Content-Type 为 text/html响应中的Content-Type常⻅取值有以下⼏种:• text/html :body数据格式是HTML• text/css :body数据格式是CSS• application/javascript :body数据格式是JavaScript• application/json :body数据格式是JSON如果请求的是js⽂件,SpringMVC会⾃动设置Content-Type为 application/javascript如果请求的是css⽂件,SpringMVC会⾃动设置Content-Type为 text/cssRequestMapping(/index2) public Object index2(){ return /a.js; } RequestMapping(/index3) public Object index3(){ return /b.css; }返回JSONSpringMVC也可以返回JSON 后端⽅法返回结果为对象RequestMapping(/returnJson) ResponseBody public HashMapString, String returnJson() { HashMapString, String map new HashMap(); map.put(Java, Java Value); map.put(MySQL, MySQL Value); map.put(Redis, Redis Value); return map; }运⾏程序,浏览器响应结果如下:http://127.0.0.1:8080/returnJson通过Fiddler观察响应结果, Content-Type 为application/json设置状态码SpringMVC会根据我们⽅法的返回结果⾃动设置响应状态码,程序员也可以⼿动指定状态码通过SpringMVC的内置对象HttpServletResponse提供的⽅法来进⾏设置RequestMapping(value /setStatus) ResponseBody public String setStatus(HttpServletResponse response) { response.setStatus(401); return 设置状态码成功; }运⾏程序,浏览器响应结果如下:http://127.0.0.1:8080/setStatus状态码不影响⻚⾯的展⽰通过Fiddler来观察设置的结果:设置HeaderHttp响应报头也会向客⼾端传递⼀些附加信息,⽐如服务程序的名称,请求的资源已移动到新地址等,如: Content-Type,Local等. 这些信息通过 RequestMapping 注解的属性来实现 先来看 RequestMapping 的源码:Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented Mapping public interface RequestMapping { String name() default ; AliasFor(path) String[] value() default {}; AliasFor(value) String[] path() default {}; RequestMethod[] method() default {}; String[] params() default {}; String[] headers() default {}; String[] consumes() default {}; String[] produces() default {}; }1. value:指定映射的URL2. method:指定请求的method类型,如GET,POST等3. consumes:指定处理请求(request)的提交内容类型(Content-Type)例如application/json, text/html;4. produces:指定返回的内容类型还可以同时设置返回值的字符编码5. Params:指定request中必须包含某些参数值时才让该⽅法处理6. headers:指定request中必须包含某些指定的header值才能让该⽅法处理请求了解即可,更多说明参考RequestMapping::SpringFramework设置Content-Type我们通过设置produces属性的值,设置响应的报头Content-TypeRequestMapping(value /returnJson2,produces application/json) ResponseBody public String returnJson2() { return {\success\:true}; }运⾏程序,浏览器响应结果如下:http://127.0.0.1:8080/returnJson2通过Fiddler来观察设置的结果:如果不设置produces,⽅法返回结果为String时,SpringMVC默认返回类型,是text/html.设置返回类型时,也可以同步设置响应编码RequestMapping(value /returnJson2,produces application/json;charsetutf-8) ResponseBody public String returnJson2() { return {\success\:true}; }观察Fiddler的响应结果设置其他Header设置其他Header的话,需要使⽤SpringMVC的内置对象HttpServletResponse提供的⽅法来进⾏设置RequestMapping(value /setHeader) ResponseBody public String setHeader(HttpServletResponse response) { response.setHeader(MyHeader,MyHeaderValue); return 设置Header成功; }voidsetHeader(Stringname,Stringvalue)设置⼀个带有给定的名称和值的header.如果name 已经存在,则覆盖旧的值.运⾏程序,浏览器响应结果如下:http://127.0.0.1:8080/setHeader通过Fiddler来观察设置的结果:

更多文章