【Spring Boot 二】Controller
最近工作太忙了,写了一篇【spring Boot】 Hello World 开山篇就开始忙下一个项目,大大小小的事情,今天抽时间把spring boot 更新一下。
接上篇文章,HelloWorld程序中我们已经创建了一个HellController,里面包含了响应JSON的方法,本文针对Controller再做一下讲解。
回顾上篇文章,我们在Controller中使用 @RestController 注解,该注解是spring 4.0引入的。查看源码可知其包含了 @Controller 和 @ResponseBody 注解。我们可以理解为 @Controller的增强版。专门为响应内容式的 Controller 而设计的,可以直接响应对象为JSON。 而 @Controller 用来响应页面,spring-boot 支持多种模版引擎包括:
- FreeMarker
- Groovy
- Thymeleaf (Spring 官网使用这个)
- Velocity
- JSP (貌似Spring Boot官方不推荐,STS创建的项目会在src/main/resources 下有个templates 目录,这里就是让我们放模版文件的,然后并没有生成诸如 SpringMVC 中的webapp目录)
不过本文还是选择大家都熟悉的JSP来举例,因为使用JSP与默认支持的模版需要特殊处理,所以拿来举例更好。
关于Controller 方法可以接收参数使用@RequestBody、@RequestParam、@ModelAttribute、JSONObject、HttpEntity 等方式,皆与Spring的使用一样,这里不做赘述。
下面我们来说一下如何使用 @Controller 实现响应JSP页面(与SpringMVC也是一样使用)。
创建PageController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
package com.spring.boot; 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; import java.util.Date; import java.util.Map; /** * Created by XJH on 2017/8/21. */ @Controller @RequestMapping("/page") public class PageController { // 从 application.properties 中读取配置,如取不到默认值为Hello Xiao @Value("${application.hello:Hello Xiao}") private String hello = "Hello Xiao"; /** * 默认页<br/> * * @param model * @return * @RequestMapping("/") 和 @RequestMapping 是有区别的 * 如果不写参数,则为全局默认页,加入输入404页面,也会自动访问到这个页面。 * 如果加了参数“/”,则只认为是根页面。 */ @RequestMapping() public String index(Map<String, Object> model) { model.put("time", new Date()); model.put("message", this.hello); return "index"; } /** * 响应到JSP页面page1 * * @return */ @RequestMapping("/page1") public ModelAndView page1() { ModelAndView mav = new ModelAndView("page/page1"); mav.addObject("content", hello); return mav; } /** * 响应到JSP页面page1(可以直接使用Model封装内容,直接返回页面字符串) * * @param model * @return */ @RequestMapping("/page2") public String page2(Model model) { model.addAttribute("content", hello + "(第二种)"); return "page/page1"; } } |
pom.xml添加依赖:
1 2 3 4 5 6 7 8 9 10 |
<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内容为:
1 2 3 4 5 6 7 8 |
# 页面默认前缀目录 spring.mvc.view.prefix=/WEB-INF/jsp/ # 响应页面默认后缀 spring.mvc.view.suffix=.jsp # 自定义属性,可以在Controller中读取 application.hello=Hello Xiao 27wy.cn |
(注意,如果spring boot版本太低的话,是访问不到内容的,或者说访问的结果是jsp的源码)
(如果版本太低的话,想看到jsp页面的话,把上面的spring.mvc.view.prefix=/WEB-INF/jsp/ 改成 spring.view.prefix=/WEB-INF/jsp/ 去掉了[.mvc],路径的话自定义就行,后缀类似...建议升级版本)
1 2 3 4 5 6 |
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> </parent> |
在 src/main 下面创建 webapp/WEB-INF/jsp 目录用来存放我们的jsp页面。
index.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Spring Boot Sample</title> </head> <body> Time: ${time} <br> Message: ${message} </body> </html> |
page1.jsp
1 2 3 4 5 6 7 8 9 10 11 12 |
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Spring Boot Sample</title> </head> <body> <h1>${content }</h1> </body> </html> |
然后启动spring-boot服务。
访问页面查看结果:
访问:http://localhost:8080/page
结果:
1 2 |
Time: Mon Aug 21 19:46:47 CST 2017 Message: Hello Xiao 27wy.cn |
访问:http://localhost:8080/page/page1
结果: Hello Xiao 27wy.cn
访问:http://localhost:8080/page/page2
结果:Hello Xiao 27wy.cn(第二种)
最后附上工程结构:
只有舍,才有得。
发表评论