目录
1.静态资源访问
在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。那么我们放在项目中的什么位置呢?
生成的项目结构中,resources目录下有个static目录,我们可以把静态资源放在下面,直接访问。
访问地址是 localhost:8080/图片.jpeg。不需要加static目录。
Springboot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:
/static /public /resources /META-INF/resources
也就是说,凡是名称为上面四种的目录,就相当于直接放到项目的classpath路径下了。可以直接访问,不需要加文件夹名。
2.渲染Web页面
渲染web页面:
之前我们的示例中,我们都是通过@RestController来处理请求,返回的都是json字符串。
那么如果我们需要跳转到html页面时,要如何实现呢?
模板引擎:
模板引擎的作用是将动态页面转成伪静态页面,目的是提高搜索引擎的收录。
互联网项目请求一般没有以 .jsp 结束,都是以 .html,.htm结束。因为搜索引擎一般会优先搜索 .html,.htm结尾的请求,也就是伪静态页面。
springboot提供了多种模板引擎默认配置支持,方便我们开发动态网站。
主要提供了以下几种:
- Thymeleaf
- FreeMarker
- Velocity
- Groovy
- Mustache
Springboot建议使用这些模板引擎,避免使用JSP,若一定要使用JSP,则无法实现Springboot的多种特性,具体可见后文:支持JSP的配置
当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。
当然也可以修改这个路径,具体如何修改,可在后续各模板引擎的配置属性中查询并修改。
3.使用Freemarker模板引擎渲染web视图
springboot提高了很多模板引擎,我们这里只说一个Freemarker模板引擎。
1.pom文件添加依赖
<!-- 引入freeMarker的依赖包. -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
注意:不能单独只添加freemarker依赖包,还要添加thymeleaf依赖包,否则访问时候会报错。
javax.servlet.ServletException: Circular view path [index]: would dispatch back to the current handler URL [/index] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
2.创建一个FtlIndexController类
package com.itmayiedu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class FtlIndexController {
@RequestMapping("/ftlIndex")
public String ftlIndex(){
return "ftlIndex";
}
}
注意:
1.注解需要用@Controller,而不是@RestController,因为返回的是模板而不是json对象了
2.return "ftlIndex"; 返回值直接写模板名称就可以了,不需要添加后缀了,默认后缀名为 .ftl
3.在templates目录下创建一个ftlInext.ftl文件
4.访问localhost:8080/ftlIndex,访问成功。
5.freemarker的其他用法:在controller类中数据可以传到ftl页面上
@RequestMapping("/ftlIndex2") public String index(Map<String, Object> result) { result.put("name", "张飞"); result.put("sex", "88"); return "ftlIndex"; }
在ftl中可以用$接收到
${name}
${sex}
访问成功
我又试了一下,这样写就访问不到。
@RequestMapping("/ftlIndex2") public String index() { Map<String, Object> result = new HashMap<>(); result.put("name", "张飞"); result.put("sex", "88"); return "ftlIndex"; }
4.使用JSP渲染Web视图
springboot默认不支持jsp页面,默认的是ftl格式的页面,如果想在springboot集成jsp,则需要添加外部Tomcat的依赖jar包,
而且创建springboot项目时,要设置成war类型,如果是jar类型是无法访问到jsp页面的。
1.创建一个springboot项目
2.自动生成的pom文件
注:我们创建成war类型之后,idea默认给我们pom文件添加上了外部Tomcat依赖。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>springboot_jsp</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>springboot_jsp</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
添加依赖:
<!-- SpringBoot 外部tomcat支持jsp--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>
3.项目生成的application.properties文件,是springboot会默认读取的配置文件。
注:springboot项目一般都使用 application.yml 格式配置文件,springboot也会自动读取此配置文件,此处暂时以properties文件为例演示。
在application.properties中添加配置信息
# 前缀 spring.mvc.view.prefix=/WEB-INF/jsp/ # 后缀 spring.mvc.view.suffix=.jsp
创建一个controller类
package com.example.springboot_jsp.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class JspIndexController { @RequestMapping("/jspIndex") public String jspIndex(){ return "jspIndex"; } }
我们自己创建一个jsp,在src/main/目录下,创建webapp/WEB-INF/jsp/jspIndex.jsp
jspIndex.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> 我的JSP页面
访问成功:
注意:
1.创建SpringBoot整合JSP,一定要为war类型,否则会找不到页面.
2.不要把JSP页面存放在resources目录下,resources目录下是资源文件,可以被外部访问到,而jsp是不允许访问到的,所以我们单纯创建webapp目录存放jsp页面。