示例:
HelloController
package com.example;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Value("${age}")
private Integer age;//@value可以获取application.yml配置的值
@RequestMapping(value = "/hello")
public String sayHello() {
return "hello world age:" + age;
}
}
application.yml
age: 18
常用注解
@RestController
= @Controller
+ @ResponseBody
@Controller
需要返回 template 模版,类似于 Django 的模板。
建议使用:@RestController
映射多个路径
- 单个映射:
@RequestMapping(value = "/hello")
@RequestMapping(value = "/hello")
public String sayHello() {
return "hello world name:" + person.getName() + " , age:" + person.getAge();
}
- 多个映射:
@RequestMapping(value = {"hello", "hi"})
@RequestMapping(value = {"hello", "hi"})
public String sayHello() {
return "hello world name:" + person.getName() + " , age:" + person.getAge();
}
- 整个 controller 增加映射,在类上增加:
@RequestMapping(value = "/demo")
@RestController
@RequestMapping(value = "/demo")
public class HelloController {
@Autowired
private Person person;
@RequestMapping(value = {"hello", "hi"})
public String sayHello() {
return "hello world name:" + person.getName() + " , age:" + person.getAge();
}
}
访问方式:
method = RequestMethod.GET
method = RequestMethod.POST
- …
- 简便方式:
@GetMapping(value = "hello")
@PostMapping(value = "hello")
@RestController
@RequestMapping(value = "/demo")
public class HelloController {
@Autowired
private Person person;
@RequestMapping(value = {"hello", "hi"}, method = RequestMethod.GET)
//@GetMapping(value = "hello")
public String sayHello() {
return "hello world name:" + person.getName() + " , age:" + person.getAge();
}
}
注意:什么都不写,默认是 get 和 post 都可以访问,但是不建议这样做,需要明确指定访问方式。
获取访问参数
-
获取
GET
的URL
的参数和POST
的 请求body
参数- 字段field映射
@RequestMapping(value = "hello", method = RequestMethod.GET) public String sayHello(@RequestParam(value = "id", required = false, defaultValue = "0") Integer id) { return "id:" + id; }
- 实体 model 映射
@PostMapping(value = "/addPerson") public Person addPerson(Person person) { return personRespository.save(person); }
-
获取 restfully 参数,访问路径中的参数
@RequestMapping(value = "hello/{id}", method = RequestMethod.GET)
public String sayHello(@PathVariable("id") Integer id) {
return "id:" + id;
}
---------------------
补充一:使用 @Controller 实现响应JSP页面
(与SpringMVC也是一样使用)。 创建PageController,编码如下:
package org.springboot.sample.controller;
import java.util.Date;
import java.util.Map;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class PageController {
// 从 application.properties 中读取配置,如取不到默认值为Hello Shanhy
@Value("${application.hell:Hello Shanhy}")
private String hello = "Hello Shanhy";
/**
* 默认页<br/>
* @RequestMapping("/") 和 @RequestMapping 是有区别的
* 如果不写参数,则为全局默认页,加入输入404页面,也会自动访问到这个页面。
* 如果加了参数“/”,则只认为是根页面。
*
* @return
* @author SHANHY
* @create 2016年1月5日
*/
@RequestMapping(value = {"/","/index"})
public String index(Map<String, Object> model){
// 直接返回字符串,框架默认会去 spring.view.prefix 目录下的 (index拼接spring.view.suffix)页面
// 本例为 /WEB-INF/jsp/index.jsp
model.put("time", new Date());
model.put("message", this.hello);
return "index";
}
/**
* 响应到JSP页面page1
*
* @return
* @author SHANHY
* @create 2016年1月5日
*/
@RequestMapping("/page1")
public ModelAndView page1(){
// 页面位置 /WEB-INF/jsp/page/page.jsp
ModelAndView mav = new ModelAndView("page/page1");
mav.addObject("content", hello);
return mav;
}
/**
* 响应到JSP页面page1(可以直接使用Model封装内容,直接返回页面字符串)
*
* @return
* @author SHANHY
* @create 2016年1月5日
*/
@RequestMapping("/page2")
public String page2(Model model){
// 页面位置 /WEB-INF/jsp/page/page.jsp
model.addAttribute("content", hello + "(第二种)");
return "page/page1";
}
}
pom.xml添加依赖:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
上面说了spring-boot 不推荐JSP,想使用JSP需要配置application.properties。
添加src/main/resources/application.properties内容:
# 页面默认前缀目录
spring.mvc.view.prefix=/WEB-INF/jsp/
# 响应页面默认后缀
spring.mvc.view.suffix=.jsp
# 自定义属性,可以在Controller中读取
application.hello=Hello Shanhy
在 src/main 下面创建 webapp/WEB-INF/jsp 目录用来存放我们的jsp页面。
index.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Spring Boot Sample</title>
</head>
<body>
Time: ${time}
<br>
Message: ${message}
</body>
</html>
page1.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Spring Boot Sample</title>
</head>
<body>
<h1>${content }</h1>
</body>
</html>
要想让spring-boot支持JSP,需要将项目打成war包。
我们做最后一点修改,修改pom.xml文件,将 jar 中的 jar 修改为 war
然后启动spring-boot服务。
访问页面查看结果:
http://localhost:8080
http://localhost:8080/page1
http://localhost:8080/page2
最后附上工程结构: