第3章 核心概念 - 3.2 响应
前面的一个章节讲解了请求的用法,本章节来看看 Response
响应对象。我们都知道从浏览器访问一个网址浏览器就会向我们返回一个响应。
打开 www.baidu.com 从浏览器的开发者工具里可以看到一个响应是这样的:
那么我们在编写 web 应用的时候通常会用到 响应
相关的哪些API呢?我举几个例子你就明白了。
返回一个页面
前面我们已经做了一个简单的登录功能,在这个功能中我们已经做到了访问一个 URL
可以看到 HTML
页面的过程。
你去查看代码只有一行。
@GetRoute("login")
public String login() {
return "login.html";
}
那么框架是怎么做的呢? Blade
将模板默认都存放在 classpath
下的 templates
目录中,当我们编写一个路由的时候返回值是 String
或 ModelAndView
类型则框架会帮你渲染到对应的视图页面,所以上面代码片段中访问 /login
会跳转到 templates/login.html
页面。
当然除了上面的方式,返回一个页面还有一种做法:
@GetRoute("login")
public void login(Response response) {
response.render("login.html");
}
这两个代码片段达到的效果是相同的,随你爱好。
返回JSON数据
很多时候我们会开发一些web api程序,返回 json
格式的数据,在 Blade
中更是方便,怎么做呢?
@GetRoute("users")
public void users(Response response) {
List<String> users = Arrays.asList("jack", "tom", "biezhi");
response.json(users);
}
没错,就是这么 easy
,有同学说只能这样吗?我连 response.json(users)
都不想写。。。好吧,果然程序猿都是偷懒才聪明的。还有一种方式,像 SpringMvc
:
@GetRoute("users")
@Json
public List<String> users() {
return Arrays.asList("jack", "tom", "biezhi");
}
这里使用 @JSON
注解标识当前的路由返回一定是一段 json
数据,返回值框架会帮你处理。我们访问浏览器得到的将是:
["jack", "tom", "biezhi"]
设置Cookie
Cookie
是我们web开发中常用的一个技术,通常用于 记住我
等操作。在 Blade
中向浏览器写入 Cookie
也是使用 Response
对象完成的,来看看吧。
response.cookie("c1", "value1");
这样就向当前域下写入了一个永不过期的 Cookie
数据,名称为 c1
数据为 value1
。可以打开浏览器的开发者工具看到。
当然上面的写法是写最简单的 Cookie
,但很多时候我们需要定制化,这时候可以看看 Response
对象里 Cookie
相关的API了。
Response removeCookie(String name)
Response cookie(Cookie cookie)
Response cookie(String name, String value)
Response cookie(String name, String value, int maxAge)
Response cookie(String name, String value, int maxAge, boolean secured)
Response cookie(String path, String name, String value, int maxAge, boolean secured)
还挺多的吗,一个比一个长呢。。是的,看到这些API大概都清楚怎么使用了。第一个是移除一个 Cookie
的,后面都是写入一个 Cookie
的方法。具体解释都可以在源码注释中看到。
返回文本/html
返回文本/html也非常的简单,Blade
提供了两个API帮你完成返回文本和html。
void text(String text)
void html(String html)
只需要将响应给客户端的字符串传递即可。
重定向
有时候我们会希望做完某个操作后重定向到另一个页面,在HTTP中其实就是 302
状态码干的。比如登录后后台直接跳转到登录成功的页面。
@PostRoute("login")
public void doLogin(Response response) {
response.redirect("/index");
}
其他操作
在 Response
中还有一些其他不常用的操作,我们来看看它的API
Response status(int status)
Response notFound()
Response contentType(String contentType)
Map<String, String> headers()
Response header(String name, String value)
Map<String, String> cookies()
void json(String json)
void body(@NonNull byte[] data)
void download(String fileName, File file) throws Exception
好了,各位看官,关于 Response
响应的介绍就到这里,我们下次来讲 Blade
中的 IOC
容器。