undertow其实是支持jsp的,从我第一次接触undertow时就知道了。但是波总的jfinal-undertow旨在抛弃jsp,所以之前很多码友在社区询问的时候我还是紧跟波总路线方针,建议使用html。
但是今天我自己遇到了一个问题,不能不用jsp了,至少我还没有想到如何使用html来实现我的需求。事情还是得从这篇帖子说起:【分享】Jfinal+Undertow自定义对静态资源的404错误处理
通过上面那篇文章我已经可以自定义静态资源的404页面,but……问题出现了。由于这个跳转是由undertow直接处理的,并不是jfinal来处理的,所以跳转到目标html页面后,该页面无法被enjoy渲染,那么相关指令就无法使用,我的需求(保存此次404访问记录)就没法实现。所以万般无奈之下,我还是想到了jsp,因为在jsp页面上我能接收到此次会话的request对象,相关信息就能获取到。so,我开始兼容改造。
第一步:pom中添加依赖
<!-- jsp支持 --> <dependency> <groupId>io.undertow.jastow</groupId> <artifactId>jastow</artifactId> <version>2.1.0.Final</version> <exclusions> <!-- 以下两个包跟jfinal-undertow依赖冲突 --> <exclusion> <groupId>io.undertow</groupId> <artifactId>undertow-servlet</artifactId> </exclusion> <exclusion> <groupId>org.jboss.logging</groupId> <artifactId>jboss-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.jboss.spec.javax.servlet.jsp</groupId> <artifactId>jboss-jsp-api_2.3_spec</artifactId> <version>2.0.0.Final</version> </dependency>
第二步:再次改造com.jfinal.server.undertow.WebBuilder,添加一个方法。(提示:大家只需要把WebBuilder这个类的源代码放到你的项目里,保证包路径跟原项目一致,然后进行修改即可,Jfinal-undertow使用当前maven库最新的版本,不需要自己重新打包。后续波总往maven库发布了新版本,这个类就能删掉了)
public WebBuilder setJspDependency() { deploymentInfo.addServlet(JspServletBuilder.createServlet("Default Jsp Servlet", "*.jsp")); HashMap<String, TagLibraryInfo> tagLibraryInfo = new HashMap<String, TagLibraryInfo>(); JspServletBuilder.setupDeployment(deploymentInfo, new HashMap<String, JspPropertyGroup>(), tagLibraryInfo, new HackInstanceManager()); return this; }
第三步:开启jsp支持
UndertowServer.create(Config.class).configWeb(builder -> { // jsp支持 builder.setJspDependency(); // 错误页面(undertow捕获处理,不走enjoy渲染) builder.addErrorPage(404, "/error/404.jsp"); }).start();
第四步:由Jfinal控制的404自定义跳转保持不变
me.setError404View("/error/404.html");
这样就ok了,完美实现了我的需求。如果有更好的思路,还请各路大神不吝赐教。
有想体验undertow,但是还想用jsp的小伙伴,现在可以耍起来了。不过新项目的话,还是建议大家用html,Enjoy模板引擎真的很好用。
点赞 + 收藏是必须的,感谢