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"
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
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>123456789
上面说了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 Shanhy123456
在 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>12345678910111213
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>1234567891011
要想让spring-boot支持JSP,需要将项目打成war包。
我们做最后一点修改,修改pom.xml文件,将 jar 中的 jar 修改为 war
然后启动spring-boot服务。
在开发 SpringBoot 项目的时候,启动项目,启动失败,提示如下,只截取关键部分:
该异常的 Description 只是表面现象,而不是根本原因,要想知道根本原因,就需要查看是否之前就抛出了其他异常。正是更早的异常导致 Spring 不能符合预期的工作。
虽然上面的问题可以根据上面的提示信息:
在 SpringBootApplication 启动类上的,@EnableAsync 或 @EnableCaching 注解中加上 proxyTargetClass=true,来解决,也可以完成启动。
如果想要知道具体问题的原因,需要继续下面的分析。
Spring 在启动的过程中,最重要的过程就是 refresh Context 的过程。
Spring refresh () 方法源码:
如果是 refresh () 方法执行失败了,可能会抛出异常,可以在日志中搜索:
上面日志中的 refresh 异常内容 如下:
可以看到 monitorConsumer 类实例化失败,是因为 dispatcherHandlerService 注入失败,是因为 dispatcherActionOneHandlerService 注入失败,是因为 handleActionOneMonitors 注入失败,是因为 oneMonitor 注入失败,是因为 ZooBiz 注入失败。
此时,应该检查 ZooBiz 具体的错误原因,是不是没有定义接口,而直接使用;或者该类存在其他问题等。
修改完该类的问题后,再次启动项目,看看能否正常启动成功。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)