SpingBoot跳转页面详解

SpringBoot里面没有我们之前常规web开发的WebContent(WebApp),它只有src目录,在src/main/resources下面有两个文件夹,static和templates,springboot默认static中放静态页面(public文件夹中也可以),而templates中放动态页面
 

静态页面:

静态页面可以直接访问。这里我们直接在static放一个hello.html,然后直接输入http://localhost:8080/hello.html便能成功访问(pubic文件夹同理)。
SpingBoot跳转页面详解_第1张图片
也可以通过controller跳转:
注入的时候一定要是@Controller,而不要是@RestController,因为它是rest接口(json格式)是解析不到html

@Controller
public class HelloController {

	@RequestMapping("/hehe")
	public String hehe() {
		return "hello.html";
	}
	
	@RequestMapping("/haha")
	public String haha() {
		return "user/test.html";
	}
}

hello.html:





测试1


    

Hello World!

test.html:





测试2



    

我的第一个标题

我的第一个段落。

然后输入http://localhost:8080/haha就可以成功访问

注意:@RequestMapping中的url不要跟视图重名,否则会抛出Circular view path异常,如:

	@RequestMapping("/hello")
	public String hehe() {
		return "hello.html";
	}

SpingBoot跳转页面详解_第2张图片

动态页面:

动态页面需要先请求服务器,访问后台应用程序,然后再转向到页面,比如访问JSP。spring boot建议不要使用JSP,默认使用Thymeleaf来做动态页面。

要在pom中要添加Thymeleaf组件:

		
			org.springframework.boot
			spring-boot-starter-thymeleaf
		

但你加上了上面的thymeleaf后,你必须重启工程,即使是你配置了热启动后,也要重启工程,才可以看到效果。
我们先在templates文件夹中也新建一个hello.html但内容不同,然后先试一下直接访问该页面。输入http://localhost:8080/hello.html后结果显然访问的是静态文件夹里面的那个hello.html。
然后我们现在再试一下用controller:http://localhost:8080/hehe
SpingBoot跳转页面详解_第3张图片
我们需要这样改controller,然后就可以成功跳转了:

	@RequestMapping("/hehe")
	public String hehe() {
		return "hello";
	}

如果在使用动态页面时还想跳转到/static/xxx.html,可以使用重定向return “redirect:/xxx.html”。

	@RequestMapping("/hehe")
	public String hehe() {
		return "redirect:hello.html";
	}

我们看看返回一点数据在前端利用Thyemleaf来拿:

@Controller
public class HelloController {

	@RequestMapping("/Hi")
	public ModelAndView sayHello() {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("hello");
		modelAndView.addObject("key", 12345);
		return modelAndView;
	}
}

Templates/hello.html:





Insert title here



this is the hello.html in templates

?

效果:
SpingBoot跳转页面详解_第4张图片

使用thymeleaf来达到以前jsp获取Model值这样的效果:

在配置文件:application.yml或application.property中加配置:
# 在构建URL时预先查看名称的前缀,写/templates/也可以
spring.thymeleaf.prefix=classpath:templates/
# 构建URL时附加查看名称的后缀.
spring.thymeleaf.suffix=.html
# 模板编码
spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.encoding=UTF-8
# Content-Type值
spring.thymeleaf.content-type=text/html
# 关闭thymeleaf缓存 开发时使用 否则没有实时画面
spring.thymeleaf.cache=false


    net.sourceforge.nekohtml
    nekohtml
    1.9.22

要想使用LEGACYHTML5这个编码格式必须引入上面pom中‘避坑包’否则用不了。肯定有人要问为什么不用HTML5,你可以试试。因为你可能会发现在默认配置下,thymeleaf对.html的内容要求很严格,比如,如果少最后的标签封闭符号/,就会报错而转到错误页。也比如你在使用Vue.js这样的库,然后有

这样的html代码,也会被thymeleaf认为不符合要求而抛出错误。因此,建议增加下面这段:spring.thymeleaf.mode = LEGACYHTML5

spring.thymeleaf.mode的默认值是HTML5,其实是一个很严格的检查,改为LEGACYHTML5可以得到一个可能更友好亲切的格式要求。需要注意的是,LEGACYHTML5需要搭配一个额外的库NekoHTML才可用,也就是上面的避坑包。注意导入该依赖后你必须重启工程,即使是你配置了热启动后,也要重启工程,才可以看到效果

再写控制类时把Model加在参数中:

	@RequestMapping(value = "/action",method = RequestMethod.GET)
	public String index(Model model){
		model.addAttribute("aaa","我是一个兵");
		return "index";
	}

index.html:


   


这里是测试

Today is:

效果:
SpingBoot跳转页面详解_第5张图片

补充:热部署

就是说在项目中修改代码可以不用重新停止应用再重新启动,可以自动重启

在pom文件中引入devtools依赖:

		
			org.springframework.boot
			spring-boot-devtools
			
			true
		

原理:
深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。

说明:
(1)某些资源在更改时不一定需要触发重新启动。例如, Thymeleaf 模板可以就地进行编辑。默认情况下更改资源路径包括了:/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或者 /templates 不会触发重新启动, 但会触发实时重新加载。
如果逆向排除这些路径,可以使用如下配置:spring.devtools.restart.exclude=static/,public/,WEB-INF/**
(2)如果要保留这些默认值并添加其他排除项, 请使用 spring.devtools.restart.additional-exclude属性代替。如:spring.devtools.restart.additional-paths=src/main/java
(3)通过System.setProperty(“spring.devtools.restart.enabled”, “false”); 方法,可以在SpringApplication.run()方法运行天使用关闭devtools。
(4)当我们再次启动的时候,使用的加载器就变为了restartedMain了,说明热部署已经成功。
SpingBoot跳转页面详解_第6张图片
注意:devtools由于是双类加载机制,再结合了通用Mapper后可能会出现java.lang.ClassCastException异常(例如:说class x.x.A cannot be cast to x.x.A。)
解决:在src/main/resources中创建META-INF目录,在此目录下添加spring-devtools.properties配置,内容如下:

restart.include.mapper=/mapper-[\\w-\\.]+jar
restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar

你可能感兴趣的:(Spring,boot,前端)