SpringBoot(二)Web 综合开发
文章目录
Web 开发
Spring Boot Web 开发非常的简单,其中包括常用的 json 输出、filters、property、log 等
json 接口开发
在以前使用 Spring 开发项目,需要提供 json 接口时需要做哪些配置呢
- 添加 jackjson 等相关 jar 包
- 配置 Spring Controller 扫描
- 对接的方法添加 @ResponseBody
Spring开发web,现在看来使用json是很复杂的,而Springboot只需要在类中添加注解@RestController,就会默认使类中的方法以json返回。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j7qpDHqo-1605520613663)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106141224473.png)]
如果该类中,有方法用于返回json,有方法用于跳转页面,就使用Controller来注解该类,在Json的方法上加上@ResponseBody
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kpfgMhcA-1605520613666)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106141509550.png)]
自定义 Filter
我们常常在项目中会使用 filters 用于录调用日志、排除有 XSS 威胁的字符、执行权限验证等等。Spring Boot 自动添加了 OrderedCharacterEncodingFilter 和 HiddenHttpMethodFilter,并且我们可以自定义 Filter。自定义filter有两种方法:
通过代码进行注册
-
首先创建Filter类【注意实现Filter】
-
在config配置类,加上该类
@Configuration public class MyConfig { @Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new MyFilter()); filterRegistrationBean.setOrder(1); //设置优先级 filterRegistrationBean.setEnabled(true);//是否启用 filterRegistrationBean.addUrlPatterns("/*");//拦截路径 Map<String, String> initParameters = new HashMap(); initParameters.put("excludes", "/favicon.ico,/img/*,/js/*,/css/*");//排除拦截 filterRegistrationBean.setInitParameters(initParameters); return filterRegistrationBean; }
通过@WebFilter注解进行注册
-
首先创建Filter类【注意实现Filter】
-
用@WebFilter修饰该类
@Order(2)//顺序 @WebFilter(urlPatterns = "/*", filterName = "MyFilter2")//路径和类名
-
在启动类加上@ServletComponentScan
@SpringBootApplication @ServletComponentScan public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ssa7ioFL-1605520613668)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104090516411.png)]
都不设置优先级的情况下,通过代码注册的优先级高
Filter责任链模式
拦截器执行doFilter时,会判断有没有其它过滤器需要执行,如果有则到其它过滤器进行操作,直到已经没有过滤器了才会继续放行代码。
配置文件
在配置文件自定义配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XpGwjfWS-1605520613672)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106162720836.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3JcPlTNM-1605520613674)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106162730355.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L3JBq7ly-1605520613676)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106162744338.png)]
Thymeleaf 模板
Spring Boot 推荐使用 Thymeleaf 来代替 Jsp,Thymeleaf 模板到底是什么东西呢
Thymeleaf 介绍
Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 JSP,Velocity,FreeMaker 等,它也可以轻易的与 Spring MVC 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。Thymeleaf 是与众不同的,因为它使用了自然的模板技术。这意味着 Thymeleaf 的模板语法并不会破坏文档的结构,模板依旧是有效的XML文档。模板还可以用作工作原型,Thymeleaf 会在运行期替换掉静态值。
Thymeleaf: <p th:text="${message}">Hello World!</p>
注意,由于 Thymeleaf 使用了 XML DOM 解析器,因此它并不适合于处理大规模的 XML 文件。
Thymeleaf 的好处
- 动静结合:Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
- 开箱即用:它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、改jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
- 多方言支持:Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
- 与SpringBoot完美整合,SpringBoot提供了Thymeleaf的默认配置,并且为Thymeleaf设置了视图解析器,我们可以像以前操作jsp一样来操作Thymeleaf。代码几乎没有任何区别,就是在模板语法上有区别。
Thymeleaf使用前提
使用Thymeleaf需要导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
导入依赖后,SpringBoot会自动为Thymeleaf注册一个视图解析器:ThymeleafViewResolver
与解析JSP的InternalViewResolver类似,Thymeleaf也会根据前缀和后缀来确定模板文件的位置:
- 默认前缀:classpath:/templates/
- 默认后缀:.html
语法
- ${} :这个类似与el表达式,但其实是ognl的语法,比el表达式更加强大
- th-指令:th-是利用了Html5中的自定义属性来实现的。如果不支持H5,可以用data-th-来代替
- th:each:类似于c:foreach 遍历集合,但是语法更加简洁
- th:text:声明标签中的文本
- 例如1,如果user.id有值,会覆盖默认的1
- 如果没有值,则会显示td中默认的1。这正是thymeleaf能够动静结合的原因,模板解析失败不影响页面的显示效果,因为会显示默认值!
URL
URL 在 Web 应用模板中占据着十分重要的地位,需要特别注意的是 Thymeleaf 对于 URL 的处理是通过语法 @{...}
来处理的。Thymeleaf 支持绝对路径 URL:
<a th:href="@{http://www.thymeleaf.org}">Thymeleaf</a>
条件求值
<a th:href="@{/login}" th:unless=${session.user != null}>Login</a>
for循环
<tr th:each="prod : ${prods}">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>
页面即原型
在 Web 开发过程中一个绕不开的话题就是前端工程师与后端工程师的协作,在传统 Java Web 开发过程中,前端工程师和后端工程师一样,也需要安装一套完整的开发环境,然后各类 Java IDE 中修改模板、静态资源文件,启动/重启/重新加载应用服务器,刷新页面查看最终效果。
但实际上前端工程师的职责更多应该关注于页面本身而非后端,使用 JSP,Velocity 等传统的 Java 模板引擎很难做到这一点,因为它们必须在应用服务器中渲染完成后才能在浏览器中看到结果,而 Thymeleaf 从根本上颠覆了这一过程,通过属性进行模板渲染不会引入任何新的浏览器不能识别的标签,例如 JSP 中的 ,不会在 Tag 内部写表达式。整个页面直接作为 HTML 文件用浏览器打开,几乎就可以看到最终的效果,这大大解放了前端工程师的生产力,它们的最终交付物就是纯的 HTML/CSS/JavaScript 文件。
模板缓存
Thymeleaf会在第一次对模板解析之后进行缓存,极大的提高了并发处理能力。但是这给我们开发带来了不便,修改页面后并不会立刻看到效果,我们开发阶段可以关掉缓存使用:application.properties
# 开发阶段关闭thymeleaf的模板缓存
spring.thymeleaf.cache=false
12
注意:在Idea中,我们需要在修改页面后按快捷键:Ctrl + Shift + F9
对项目进行rebuild才可以。
WebJar
什么是WebJars
什么是WebJars?WebJars是将客户端(浏览器)资源(JavaScript,Css等)打成jar包文件,以对资源进行统一依赖管理。WebJars的jar包部署在Maven中央仓库上。
为什么使用
我们在开发Java web项目的时候会使用像Maven,Gradle等构建工具以实现对jar包版本依赖管理,以及项目的自动化管理,但是对于JavaScript,Css等前端资源包,我们只能采用拷贝到webapp目录下的手工方式,这样做就无法对这些资源进行依赖管理。而且容易导致文件混乱、版本不一致等问题。那么WebJars就提供给我们这些前端资源的jar包形式,我们就可以进行****依赖管理****。
WebJars是将这些通用的Web前端资源打包成Java的Jar包,然后借助Maven工具对其管理,保证这些Web资源版本唯一性,升级也比较容易。关于webjars资源,有一个专门的网站http://www.webjars.org/,我们可以到这个网站上找到自己需要的资源,在自己的工程中添加入maven依赖,即可直接使用这些资源了。
如何使用
WebJars主官网 查找对于的组件,比如bootstrap,jquery
<!-- 引用bootstrap -->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>3.3.7-1</version>
</dependency>
<!-- 引用jquery -->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.1.1</version>
</dependency>
然后我们观察一下项目的依赖jar包,依赖中就有了bootstrap.jar和jquery.jar
然后在src/main/resources/static文件下新建index.html,代码如下:
<meta charset="UTF-8">
<title>Dalaoyang</title>
<link rel="stylesheet" href="/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" />
<script src="/webjars/jquery/3.1.1/jquery.min.js"></script>
<script src="/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js"></script>
alaoyang
到这里,项目就可以用前端的资源啦。
**参考文章**
https://blog.csdn.net/ityouknow/article/details/80490926?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160462735719724835832495%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=160462735719724835832495&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-26-80490926.pc_v1_rank_blog_v1&utm_term=springboot&spm=1018.2118.3001.4450