您的位置:首页 > 编程语言 > Java开发

Spring in Action 5th 004开发一个Spring Web项目

2019-04-11 15:40 281 查看

我们以一个网上订购玉米饼的案例为例,完成一个基本的Web项目。

首先,我们需要在界面上显示玉米饼的制作原料。

我们需要从数据库中读取数据并显示到界面上,往往在web项目中,这是Controller的活。

所以,我们需要以下清单里的内容:

1. 一个domain类,定义玉米饼的属性

2. 一个controller类获取数据并传递给界面渲染

3. 一个显示模板,负责在用户的浏览器上渲染出原料数据

由于本章节中主要是Spring Web的部分,不将过多的精力放在从数据库中获取数据上。

 

定义Domain类

 

此类使用了lombok库,可以自动生成getter和setter方法,@RequiredArgsConstructor为定义为final的字段设置为构造函数参数。

在代码中使用lombok?在Maven中添加Lombok依赖。

 

定义控制器

 

控制器在本章中的体现就是接受用户请求,获取数据,传递给前端模板引擎进行渲染。

控制器清单:

1. 处理Get请求

2. 创建原料清单

3. 处理请求,交给模板渲染数据

@Slf4j是lombok提供的日志插件,其效果类似于:

[code]private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(DesignTacoController.class);

 @controller标记主要是为了自动绑定和包扫描做提示用的,spring boot会自动将标记Controller的类创建为Bean添加到容器中。

@RequestMapping为本控制器的基础路由定义了URL访问地址 https://host:port/project/design

@GetMapping也是一个新的注解,其含义是将当前方法映射为Get方法。

根据Restful风格的要求,还有其他的方法,分别处理对应的Action:

控制器与前端模板引擎之间的数据传递是靠Model来完成的。

 

定义前端渲染模板

 

添加Thymeleaf依赖:

Thymeleaf可以获取到前端Servlet的attribute,例如可以将message属性的值渲染到p标签里:

Thymeleaf可以遍历collection,达到循环的效果。例如使用th:each遍历wrap数组:

 

渲染效果

 

 

Post提交的方法

 

 

使用Design绑定从前端传来的数据:

但是与上文不同的是,本该返回模板引擎的名称,现在多了一些:return “redirect:/orders/current”

这里的作用是进行页面重定向,重定向到指定的模板页面。

既然重定向到一个指定的位置了,那么就需要有个控制器去处理这个请求:

我们设计好orderForm的模板:

th:action指定了Url,th:object指定的是绑定的模型名称。

以上红色框内的字段全部绑定到th:object指定的对象里,作为参数提交到下面的controller:

form提交的字段与Order类是一一对应的

在这里,我们并没有对输入的数据进行验证,下面添加验证。

 

Validate Data

 

我们可以借助Java‘s Bean Validation API及JSR-303进行数据验证.

为字段添加注解就可以实现模型验证,@NotNull进行非空验证,@Size进行长度验证

@Size也可以作为集合的大小验证。

@NotBlank作为非空验证

@CreditCardNumber作为信用卡验证

@Pattern作为正则表达式验证

@Digits作为浮点数验证

更多验证的注解方法

 

添加模型验证后没有太大的变化:

在模型上添加了@Valid注解,后面添加Errors对象作为参数

 

为前端提示错误信息

 

th:if用于判断是否有错误进行显示,${#feilds.hasErrors('ccNumber')}用于查询指定字段是否出错,th:errors用于替换显示的文字

瞧,最简单的模型验证就这样完成了!

 

如果你的页面单纯的就是为了显示静态页面,没有其他作用,不需要传递数据,也不是Post方法,还要创建一个Controller是不是杀鸡用牛刀了呢?

我们可以这样简化操作:

通过添加配置文件,这个类需要实现WebMvcConfigurer,重写AddViewControllers方法,通过添加registry.addViewController(String route).setViewName(string viewName)添加指定的控制器来渲染页面。

 

默认情况下,模板只会在第一次被调用的时候解析一次,其余都是缓存起来的。 这在生产环境是很不错的提高响应的方法,但是开发环境下需要停用cache:

在配置文件中设置:

spring.thymeleaf.cache = false

你就会发现不再缓存前端页面了。当然,DevTools可以达到同样的效果。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐