SpringBoot 中如何使用JSP页面开发?
前言
我们学校的计算机科学与技术、软件工程,作为一个培养IT技术人才的专业,依旧开着古老的JSP课程,倒也并不是课程跟不上IT时代,是IT行业发展太快了。
SpringBoot诞生于2014年,那个时候SSH框架如日中流,就在SpringBoot飞速发展的几年中,SSM逐渐取代了SSH以至于现在仍有很多企业使用SSM,但这一切都赶不上SpringBoot发展的浪潮,时间点说来也巧,大概在2018年,我进入大学的那年,SpringBoot纵身一跃名冠前列,直接超过了SSM。
说到JSP,它对服务器的依赖只增不减,这种连体开发或许在早些年还能独挡一面,但放在现在真是想让人跑路。
看了看手中的JSP教材,还有未完成的大作业,干吧,不就是在SpringBoot中来使用JSP开发页面吗。
tip:本文操作在IDEA中实现
正文 SpringBoot 中如何使用JSP页面开发
依赖引入与加载
引入POM
- 在SpringBoot中,我们直接引入pom依赖就可以了。由于JSP是动态网页,光有SpringBoot自带的Tomcat是无法完成解析的,所以我们必须引入
tomcat-embed-jasper
这一项,而servlet
由于SpringBoot已经提供,我们可以忽略,这个地方其实是有一点小小的影响的,我在文章后面会提到。对于jstl
的引入作用是让项目能够使用JSP页面编程,这个也是必加项。
<!--对jsp的支持-->
<!--引入springBoot 内嵌的Tomcat对JSP的解析包-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!--jstl-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
创建webapp
-
如果了解SSM或的应该接触过webapp文件夹,它在ssm有jsp开发的应用中经常见到,就算是SpringBoot也不能例外。我们直接在SpringBoot项目中的main文件夹(与resources/java同级的目录)创建webapp文件夹。
-
创建文件夹后还不能直接作为jsp的开发文件夹使用,如果你同样使用IDEA开发工具,请将webapp添设置为web模块,信息参考如下图
-
然后就是webapp文件夹里的内容了,其中的web.xml是必须的,这里参考代码,可以根据实际使用修改
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--错误跳转页面-->
<error-page>
<exception-type>com.cloud.lost.common.config.exception.CloudException</exception-type>
<location>/WEB-INF/error/404.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/error/500.jsp</location>
</error-page>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.ico</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
</web-app>
配置解析器
- 需要注意的是,在SpringBoot中使用JSP还需要在application.yml配置文件中添加解析配置,让SpringBoot能够解析到jsp页面。
spring:
mvc:
view:
prefix: /WEB-INF/jsp
suffix: .jsp
业务实现
新建JSP页面
- 因为我配置的jsp文件路径在/WEB-INF/jsp,所以我们在里面添加jsp文件即可,这里我创建了一些页面,作为测试我就不贴页面代码了,主要看看Controller的编写。比如下面的代码实现的是当你访问localhos项目主页时将会访问到(/user/login/index)WEB-INF目录下的jsp/user/login/index.jsp页面。
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @author Long
*/
@Controller
@RequestMapping("/")
public class IndexController {
@RequestMapping("/")
public ModelAndView index(){
return new ModelAndView("/user/login/index");
}
}
- 测试结果
ModelAndView的使用
数据携带
- 这里我并不想单独拿出来说的,但是鉴于其传递数据与页面控制的特性,就算是JSP,我们也能用ModelAndView达到数据与页面的解耦效果。
- 例如在下面的代码中,我们同样是完成了向/user/login/index页面的跳转,同时还携带了一个数据,这个数据的key是name,值是张三,这样我们就可以在页面中渲染出来我们想要的效果,这一点与其他的模板引擎倒是非常相似。
ModelAndView modelAndView = new ModelAndView("/user/login/index");
modelAndView.addObject("name", "张三");
return modelAndView;
数据获取
- 获取数据,我们使用JSP的EL功能,即
${}
,它与很多的模板引擎都很相似,例如下面的代码在页面中,如果跳转时通过ModelAndView携带了数据,我们就能根据key拿到数据并渲染到页面上
<span>${name}</span>
- 至此,我们便能在SpringBoot中使用JSP页面进行开发了,仿佛又回到了从前后端程序员为项目时生产拖家带口的时代了。
其他问题
- 后来开发中,因为业务需求,需要在项目中集成QQ登录的功能,但是集成在SpringBoot与JSP项目中会出现异常,这个异常并不是人为的,有可能是Tomcat冲突,但在我写这篇博客时我仍然没有找到问题所在。