美文网首页Springboot核心技术Spring Boot 核心技术java
第二章:SpringBoot与JSP间不可描述的秘密

第二章:SpringBoot与JSP间不可描述的秘密

作者: 恒宇少年 | 来源:发表于2017-04-03 16:54 被阅读19443次

    springboot内部对jsp的支持并不是特别理想,而springboot推荐的视图是Thymeleaf,对于java开发人员来说还是大多数人员喜欢使用jsp,接下来我们来讲解下springboot是如何支持jsp的。

    本章目标

    整合springboot web项目支持jsp作为视图输出。

    开始构建项目

    我们使用IntelliJ IDEA 工具来构建项目,首先我们需要创建一个springboot项目,如下图1所示.

    图1

    点击Next后输入一些项目的基本参数(包名,工程名,打包形式,maven形式构建等),如下图2所示:

    图2

    点击Next后选择我们预先加入到工程的springboot内置的jar包组件,我们这里选择一个web组件。如下图3所示:

    图3

    点击Next输入项目名称后店家Finish既可以完成了项目的构建。新构建的项目目录结构如下图4所示:

    图3

    可以看到上图中比我们lessonOne项目中多出来了一个类文件,ServletInitlalizer,打开该类我们不难发现它继承了SpringBootServletInitializer这个父类,而SpringBootServletInitializer这个类是springboot提供的web程序初始化的入口,当我们使用外部容器(后期文章讲解使用外部tomcat如何运行项目)运行项目时会自动加载并且装配。
    实现了SpringBootServletInitializer的子类需要重写一个configure方法,方法内自动根据LessontwoApplication.class的类型创建一个SpringApplicationBuilder交付给springboot框架来完成初始化运行配置。

    配置springboot支持jsp

    我们打开pom.xml(maven配置文件)可以看到我们之前构建项目时已经添加了web模块,而springboot给我们自动添加了spring-boot-starter-tomcat配置引入。springboot内部集成了tomcat组件,这里我们就不需要重复引入tomcat组件。

    JSP maven

    我们先来添加jsp的maven支持,如下图4所示:

    图4

    Servlet maven

    我们还需要引入jsp对servlet容器的支持,如下图5所示:

    图5

    JSTL maven

    除了上面的jsp,servlet支持以外,如果你还需要在jsp页面使用jstl标签来处理界面逻辑,那么需要引入jstl maven,如下图6所示:

    图6

    初尝试运行项目

    上面配置就是我们本章需要的全部配置,那么我们先来尝试运行下项目是否已经可以正常运行。这里项目运行也可以使用IntelliJ IDEA工具提供的组件来完成,如下图7所示,:
    (注意:如果你已经开启了另外一个spring boot项目请先关闭,因为springboot内置的端口号都是8080这样会引起冲突)

    图7

    点击绿色三角号即可开始运行项目,我们先来尝试下点击后看看控制台输入的日志信息。可以看到项目已经正常运行了,右上角的绿色三角号也变成了重启的按钮,如下图8所示:

    图8

    项目运行如图9所示:

    图9

    可以看到项目已经正常运行,但是我们现在还没有配置,创建JSP文件,我们接下来开始配置,创建JSP。

    配置视图

    基本配置

    如果是使用过eclipse工具的人肯定知道jsp文件之前是在/webapp/WEB-INF/jsp目录下,那么我们也沿用eclipse的风格。
    1. 在main目录下创建webapp文件夹
    2. 在webapp下创建jsp文件夹如下图10所示:

    3. 修改application.properties文件让springmvc支持视图的跳转目录指向为/main/webapp/jsp,配置如下图11所示:

    图11 图11

    创建index.jsp

    我们在webapps/jsp目录下创建一个index.jsp用于测试我们的配置是否已经支持了jsp,新建jsp文件如下图12所示:

    图12

    创建IndexController

    上面工作我们已经完成了jsp的所有配置,那么接下来我们需要配置springmvc的控制器,我们新建indexController如下图13所示:

    图13

    可以看到上图我们在IndexController配置文件内添加了index()方法配置了@RequestMapping注解来描述index()方法是一个可以被springmvc管理的请求视图。我们的index()方法返回值这里是"index"。
    为什么我们返回"index",还记得上述步骤中配置的application.properties文件的springmvc请求前缀以及后缀,那么当我们访问/index时springmvc就会去找/webapp/WEB-INF/jsp/index.jsp文件。

    重启项目

    重启项目我们尝试访问127.0.0.1:8080/index,可以看到如下图14的效果,证明已经完成了springboot与jsp的整合:

    图14

    总结

    上述便是我们本章的全部内容,本章主要是讲解了springboot集成jsp作为渲染视图,结合springmvc来转发请求。

    本章内容已经上传到码云:

    SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter

    SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter

    SpringBoot相关系列文章请访问:目录:SpringBoot学习目录

    QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录

    SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录

    SpringBoot相关文章请访问:目录:SpringBoot学习目录,感谢阅读!

    欢迎加入QQ技术交流群,共同进步。

    QQ技术交流群

    相关文章

      网友评论

      • c0e2b406777c:@恒宇少年 我想问下 在application.properties 配置视图解析器的前后缀时,前后缀的属性名是固定的写法吗,必须是 :spring.mvc.view.prefix 吗? 如果不是 ,那么在处理http请求时他是怎么定位到 前缀/index/后缀的页面中的 ,请楼主不吝赐教,谢谢
      • mohaoyang:如果你出现了下面的信息:
        “Whitelabel Error Page
        This application has no explicit mapping for /error, so you are seeing this as a fallback.

        Sat Sep 29 09:11:19 CST 2018
        There was an unexpected error (type=Not Found, status=404).
        /WEB-INF/jsp/index.jsp”
        说明了不是配置依赖问题,是IDEA的内置tomcat问题,这个时候请使用IDEA插件的方式运行程序,具体方式如下(由于评论不能贴图,囧,所以只能描述了):
        1.打开Maven Project,找到maven的依赖菜单
        2.在Lifecycle,Plugins,Dependencies中选择Plugins
        3.在Plugins中找到springboot
        4.spring-boot:run双击运行或者右键(run maven build)都可以!
        希望能够帮助到你!
        恒宇少年:@mohaoyang 404
      • 俞啊:表示我也404 只不过是因为 配置前缀的时候 JSP/ 后面斜杠没有带上
      • 拉风小丸子:有个疑问, webapp下的目录结构到底是怎么样的? 在src/main/webapp/WEB-INF/jsp,还是src/mian/webapp/jsp目录下? application.yml中配置的也是WEB-INF/jsp
        另外,我现在两边都配置成webapp/WEB-INF/jsp,pom.xml、application.yml、代码目录都配置ok了,但现实的是Controller里return的那个字符串。但没有到*.jsp
        拉风小丸子:@恒宇少年 OK 一会再仔细看看源码
        恒宇少年:@拉风小丸子 去看源码
      • coolzpw:好了= = 创建时有个东西没勾选
        coolzpw:@coolzpw 我添加tomcat-embed-jasper 这个依赖还是报红诶= =
        coolzpw:@恒宇少年 恩恩 谢谢了
        恒宇少年:@coolzpw 创建项目选择war类型构建就有那个类了
      • coolzpw:ServletInitlalizer 这个类我没自动创建出来呀?
        coolzpw:而且我这个添加tomcat-embed-jasper idea上说找不到这个
      • peter_puff:出现404的小伙伴们,记得查看一下版本哦 我用的2.0.4版本404,换成了博主的版本1.5.2 直接就OK啦 哈哈哈
        迪奥炸:没有1.5.2,只有1.5.15
      • peter_puff:不得不说,博主的文章确实很棒,但是比较好奇为什么图11和图12目录结构不一致呢,而且看评论中的404现象,我也出现了,不知道如何解决
      • Man_10:您好!我这边遇到一些问题,就是controller映射不到jsp页面,我是按照你的文档写的。但是不知怎么办是好,希望您能抽空解答一下,谢谢
        706a8da1d0a6:我也是这个问题 一直404
        求大神指点一下
        塞尔达And林克:@90d0n 直接使用IDEA按照楼主的教程来创建,应该是没有问题的
        90d0n:您好, 我也遇到这个问题了, 请问您现在解决了吗?
      • 和风拂柳花香醉人:我用Eclipse建的Maven项目,然后逐步配置Springboot,然后我又参考了别人的博客,发现没有ServletInitlalizer 这个类也能运行起来,没有报错,很神奇。谁知道这是什么原因吗?
        和风拂柳花香醉人:@恒宇少年 明白,谢谢
        恒宇少年:没有当然也可以运行,这个类的作用你可以去看看servlet3.0的特性,这也是为什么没有web.xml可以运行的原因
        恒宇少年:@Conca_Mo 你创建war类型的就有了
      • f0be3167aaef:你好,刚学习想请教一下,不考虑传统公司和旧项目,使用thymeleaf模板引擎的是否超过了jsp呢,替代jsp是必然吗(Spring Boot替代SSM)?
        恒宇少年:@zerotwo 挺简单的,毕竟底层都一样,不过你需要搭建好springboot 框架
        f0be3167aaef:@恒宇少年 谢谢,请问SSM移植spring boot麻烦吗。
        恒宇少年:@zerotwo thymeleaf是springboot 默认支持的模版,也是有趋势替换的
      • 9e9f624b7a18:我自己建一个工程加一个jasper依赖、properties改了下、拷你的controller和webapp,就是好的,但是你的工程不知道为啥怎么也访问不到
        9e9f624b7a18:那个我没忘,我又试了下新new的project,按这个走完全没问题,但如果new的是module就不行,因为你那50多个工程我是一起导入的,它变成了50个module,不知道是不是这个原因
        恒宇少年:@HeyAmigo 你导入工程的时候是否提示你自动添加依赖了?
      • 小宋_ed76:老哥,你写的关于springboot的内容很好,点赞。希望能分享更多干货。
        小宋_ed76:@恒宇少年 嗯嗯 好的谢谢。
        恒宇少年:谢谢你,可以进群,群二维码在文章下面
      • YouGuangFu:2018-04-12 20:14:49.278 INFO 8380 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'
        2018-04-12 20:14:49.278 INFO 8380 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
        2018-04-12 20:14:49.296 INFO 8380 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 18 ms
        楼主呀 这个404 怎么解决呀 新手
        YouGuangFu:@恒宇少年 谢谢群主
        恒宇少年:进群吧,方便解答
      • YouGuangFu:作者您好 很喜欢你分享的技术 请问 我可以将你的文章打印下来用作学习资料吗
        YouGuangFu:@恒宇少年 谢谢你谢谢你
        恒宇少年:@YouGuangFu 可以,不过要标注下版权
      • 41d7d33d1547:hello,为什么我在eclipse中按照上面方式配置的jsp页面,但是访问的时候直接在页面上显示出了jsp文件的名字,并不能显示页面呢
        恒宇少年:你要再熟悉下spring
        41d7d33d1547:@恒宇少年 我该了一下好用了,谢谢啊!我想问一下这是什么原因
        恒宇少年:@selfsalvation 你应该是用了RestController或者ResponseBody注解,你这个要用Controller注解
      • 義_6c3c:直接返回的 index 字符串 不知道错在哪里
        Cody__:使用@Controller注解 而不是@RestController
      • f_double:我springboot 整合jsp的时候 通过eclipse run 是可以访问 jsp的。但是打包成jar 运行后, 提示404
      • f6af9f9138f3:There was an unexpected error (type=Not Found, status=404).
        /WEB-INF/jsp/index.jsp
        一直404,源码哪里有错吗
        一碗米汤_bb44:不知道你的问题解决了没。我是根据最下面那位发的根据官方的例子解决的。我的jsp路径是main/webspp/jsp/*.jsp;然后通过yml配置文件配置的。spring:
        mvc:
        view:
        prefix: /jsp/
        suffix: .jsp 然后就可以正常返回了。
        f_double:我springboot 整合jsp的时候 通过eclipse run 是可以访问 jsp的。但是打包成jar 运行后, 提示404
        恒宇少年:@f6af9f9138f3 你先去下载源码看看,如果代码没有问题,考虑项目配置问题
      • 小猪lxh:springboot+security怎么访问自定义登录页面 ,在/webapp/WEB-INF/jsp/login.jsp 访问报了404
      • 烈酱:为啥都是返回index字符串
        当把jsp文件放到web-inf的pages文件夹里(相关配置有更改),则是下载了jsp文件

        始终无法直接返回jsp内容,求解
        烈酱:@Touchyoudeepins 最后选择不用jsp,就是这么皮
        647643016d13:解决了么
        恒宇少年:@烈酱 估计应该是浏览器的问题,不识别页面,再检查检查配置
      • 设计者之路:springboot 1.5.8

        报错 网上查了好久未能解决?求作者解答

        baocun

        Whitelabel Error Page

        This application has no explicit mapping for /error, so you are seeing this as a fallback.

        Wed Nov 22 10:20:57 CST 2017
        There was an unexpected error (type=Internal Server Error, status=500).
        No Java compiler available for configuration options compilerClassName: [null] and compiler: [null]
        恒宇少年:@设计者之路 根据后台的错误信息解决问题
        烈酱:在`pom.xml`里把`org.springframework.boot` 改成1.5.2.RELEASE吧,直接抄作者的`pom.xml`
      • a7508a3f7a84:页面报错
        There was an unexpected error (type=Not Found, status=404).
        /WEB-INF/jsp/index.jsp
        将代码写成诗:@恒宇少年 嗯嗯,看到下面的二维码了,所以把评论删了,没想到回复这么及时。谢谢楼主分享
        恒宇少年:@月牙宝宝 文章下面二维码, 扫描加群就可以了
        恒宇少年:@今日沉 下载源码看下,有问题进群问下
      • laughing_9f0d:ServletInitlalizer 这个我创建的时候怎么没有
        恒宇少年:@laughing_9f0d 创建war项目才有
      • meguri:图片里面的路径不一致吧? 图11是在/webapp/WEB-INF/jsp/index.jsp下面,图12\13的路径变成了/webapp/jsp/index.jsp
        706a8da1d0a6:@李泰然 解决了吗?我的也是一直404 求大神啊
        淡若S悠然:@恒宇少年 我的就很奇怪了,和你的一模一样,但是访问的时候提示404
        恒宇少年:@meguri 这个地方是我截图错了,正确的路径是/webapp/WEB-INF/jsp/index.jsp
      • libmi:还是用Thymeleaf吧,文章很棒,正在学习。
        恒宇少年:@libmi 可以,官方推荐使用的前端视图处理
      • 缘意天:我也正在学习spring boot呢,我还在犹豫使用传统的jsp还是推荐的Thymeleaf,文章写的不错,我支持你
        恒宇少年: @缘意天 非常感谢支持,请多多关注。

      本文标题:第二章:SpringBoot与JSP间不可描述的秘密

      本文链接:https://www.haomeiwen.com/subject/vlcoottx.html