写点什么

Java MVC 1.0 规范开始进入公开评审阶段

  • 2018-02-01
  • 本文字数:2687 字

    阅读完需:约 9 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

JSR-371 规范 1.0(Model-View-Controller,MVC)开始进入公开评审阶段。这是在 2017 年 4 月份 Oracle 将其所有权移交给 Ivar Grimstad 之后发布的第一个主要版本。在移交之后不久,来自 Ingenit GmbH 的高级开发工程师与 Christian Kaltepoth 一起领导该规范的制定。后来,JSR-371 将许可协议改为 Apache License 2.0。2017 年 10 月,Grimstad 表示,在 MVC 1.0 最终版发布之后,他想要将它移交给 Eclipse 基金会。

Early Draft Review 2 以来的新特性包括:

  • 国际化——支持 I18N
  • 改进了数据绑定——可通过 @MvcBinding 注解和 BindingResult 类来定义数据绑定和数据验证规则。

规范文档列出了 MVC 1.0 的目标:

  • 基于现有的 Java EE 技术。
  • 集成 CDI( JSR-346 )和 Bean Validation( JSR-349 )。
  • 定义用于构建 MVC 应用程序的方法,但在第一版本中不需要支持所有特性。
  • 尝试在 JAX-RS 之上构建其他层,并重用已有的匹配和绑定层。
  • 提供内置的 JSP 和 Facelet 视图语言。

Eclipse 的 Ozark 项目完整地实现了 JSR-371,支持 RESTEasy Jersey Apache CXF 。Ozark 1.0 版本有望在 2018 年第二季度发布,与 JSR-371 的最终版接轨。

入门

下面的例子使用 @Controller 注解定义了一个 MVC 1.0 的控制器,该控制器会生成一个 JSP 页面。

复制代码
@Path("hello")
@Controller
public class HelloController {
@GET
public String view() {
return "hello.jsp";
}
}

这个方法可以返回各种各样 MVC 1.0 能够处理的类型,如:

  • void——必须与 @View 一起使用(请看下面的例子)。
  • String——返回视图的路径(请看下面的例子)。
  • JAX-RS Response——返回 HTTP 响应消息,包括头部信息(请看下面的例子)。

下面是一个典型的 MVC 1.0 控制器的例子(来自 Grimstad GitHub代码库里的 hello-cli 示例):

复制代码
@Path("hello")
@Controller
public class HelloController {
@Inject
private BindingResult br;
@Inject
private Messages messages;
@Inject
private HelloBean helloBean;
@GET
@View("form.jsp")
public void form() {
}
@POST
public Response formPost(@Valid @BeanParam HelloForm form) {
if (br.isFailed()) {
messages.setErrors(
br.getAllValidationErrors().stream()
.collect(toList()));
return Response.status(BAD_REQUEST).entity("form.jsp").build();
}
helloBean.setFirstName(form.getFirstName());
helloBean.setLastName(form.getLastName());
return Response.status(OK).entity("hello.jsp").build();
}
}

示例中使用 @Inject 将 BindingResult 的实例(用于进行验证)和 Model、Message 和 HelloBean 自动注入到控制器中。被 @View 注解的 form() 方法指定了要渲染的页面 form.jsp。formPost() 方法里会做一些验证,并返回 Response 类型。HelloForm 类定义了用户输入字符串的长度:

复制代码
public class HelloForm {
@MvcBinding
@NotNull
@Size(min = 1, max = 16)
@FormParam("firstName")
private String firstName;
@MvcBinding
@NotNull
@Size(min = 2, max = 24)
@FormParam("lastName")
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}

规范文档对绑定和验证的过程进行了描述:

可以通过给 @FormParam 和 @QueryParam 添加 @MvcBinding 注解来定义绑定规则。在进行 MVC 绑定时,出现验证错误并不会抛出 ConstraintViolationException 异常。相反,ConstraintViolation 会被保存到具有 Request 作用域的 BindingResult 实例中,该实例可以被注入到控制器当中。这样,控制器就可以处理错误,而不是使用全局的异常处理机制来处理错误,比如使用 ExceptionMapper。

运行 hello-cli 示例,form.jsp 经过渲染后就会呈现成下面的样子:

用户输入如下的信息,只要长度符合要求,就会渲染出hello.jsp 页面:

下面是出现验证错误的例子,输入框会被清空,并显示错误消息:

来自Cybercom Group 的首席顾问Grimstad 向InfoQ 透露了MVC 1.0 的最新进展情况。

InfoQ:为什么 Oracle 不想再为 MVC 1.0 提供支持?

Ivar Grimstad:这个问题应该让 Oracle 来回答。不过我认为,Oracle 之所以将 MVC 1.0 从 Java EE 8 中剥离出来,是因为他们认为 MVC 与他们的云应用不相干,因为他们的大部分应用是 headless 的。

InfoQ:你对将 MVC 1.0 集成到 EE4J 中做何期待?在这之前,需要做些什么吗?

Grimstad:我们已经创建了一个提案项目 Ozark,也就是 MVC 1.0 的一个参考实现。具体信息可参看: https://projects.eclipse.org/proposals/eclipse-ozark。

我们希望在 MVC 1.0 最终版发布之后,尽快将其剩余部分集成到 EE4J 中。我们计划在今年的第二个季度完成这项工作。我们之所以要这么做,是因为我们希望 MVC 能够在发布最终版之后再将其移交给 Eclipse 基金会。

InfoQ:Rest Client 1.0 和 JAX-RS 2.0 已经被集成到 MicroProfile 1.3 中,那么 MVC 1.0 API 也适合被集成进 MicroProfile 吗?

Grimstad:从技术方面来看,MVC 1.0 应用程序可以运行在 MicroProfile 上。不过,MicroProfile 的目标是为微服务优化企业版 Java,所以我不确定 MVC 被集成到 MicroProfile 中是否是一个明智之举。它只是一项额外的补充技术,因为是运行在相同的技术栈上,所以在这方面没有什么问题。不过,MVC 更适合被放在 EE4J 中。

InfoQ:MVC 1.0 接下来会有哪些动作?

Grimstad:MVC 1.0 的下一件大事就是它的公开评审,评审开放时间为 2 月 6 号至 2 月 12 号。在完成评审之后,我们会继续完成剩下的工作。目前计划在 2018 年第二季度发布最终版。

可以查看如下信息来了解我们的进度,或者加入到我们的工作中: https://github.com/mvc-spec https://www.mvc-spec.org/ https://twitter.com/mvc_spec

InfoQ:你的本职工作是什么?或者说,你日常都做些什么?

Grimstad:我的本职工作是瑞士 Cybercom Group 的首席顾问。我们每天都会写代码,并通过参与开源项目和参加技术大会保持技术上的与时俱进。我是 JCP 执行委员会成员,也是 EE4J 的项目管理委员会成员。

其他资源

查看英文原文 Public Review of Java MVC 1.0 Specification is Now Open

2018-02-01 18:005022
用户头像

发布了 322 篇内容, 共 150.3 次阅读, 收获喜欢 148 次。

关注

评论

发布
暂无评论
发现更多内容

轮询锁在使用时遇到的问题与解决方案!

王磊

8月日更

云小课|原来云备份不仅仅是能备份...

华为云开发者联盟

云备份 迁移数据 复制备份

接口测试,负载测试,并发测试,压力测试区别

与风逐梦

软件测试 接口测试

带你走进MySQL全新高可用解决方案-MGR

vivo互联网技术

数据库 分布式 MySQL 高可用

一起吐槽接口文档

FunTester

接口文档 接口测试 API Jira FunTester

图灵奖得主大全 深度学习经典论文翻译合集 John 易筋 ARTS 打卡 Week 62

John(易筋)

ARTS 打卡计划

LeetCode 每日一题「搜索插入位置」

陈皮的JavaLib

Java 面试 算法 LeetCode 8月日更

解析ThreadPoolExecutor类是如何保证线程池正确运行的

华为云开发者联盟

线程池 任务 注释 Worker类

突破四大要素  飞算SoFlu助力企业实现DevOps落地

飞算JavaAI开发助手

DevOps 自动化 软件工程

百度信誉认证中台架构解析

百度Geek说

后端 软件架构 中台架构

互动直播应用快速开发实践(基于声网)

大伟

Spring的七大模块你了解吗?

4ye

Java spring 架构 后端 8月日更

Hadoop MapReduce原理、序列化

Mike

数仓出现“wait in ccn queue”的时候,怎么迅速定位处理?

华为云开发者联盟

线程 hash 负载 数仓 GaussDB(DWS)

自主创新国产化科技:智能制造之 SMT 产线监控管理可视化

一只数据鲸鱼

数据可视化 工业4.0 制造业 智慧工厂

微信业务架构&学生管理系统架构选型

John

最近很火的低代码到底是什么?

禅道项目管理

大前端 测试开发 语言 & 开发

易华录 X ShardingSphere|葫芦 App 后台数据处理的逻辑捷径

SphereEx

数据库 开源

故事点数VS工时,研发工作量到底怎么算?

LigaAI

敏捷开发 故事点数 工时 研发工作量

国产接口工具ApiPost如何利用CryptoJS对请求参数进行MD5/AES加解密

Proud lion

大前端 后端 加密解密 Postman 接口文档

Rust从0到1-高级特性-函数和闭包进阶

rust 闭包 函数指针

【浪潮云说】直播间第七期今日准时开播!

云计算运维

阿里巴巴新产“Java架构核心宝典”,全是流行技术,限时开放

Java 架构 面试 后端 计算机

训练千亿参数模型的法宝,昇腾CANN异构计算架构来了~

华为云开发者联盟

盘古 CANN 千亿参数模型 异构计算 计算架构

开源demo| 视频应用类开源 Demo 大盘点

anyRTC开发者

音视频 视频直播 直播连麦 视频通话

🏆【Alibaba微服务技术系列】「Dubbo3.0技术专题」回顾Dubbo2.x的技术原理和功能实现及源码分析(温故而知新)

码界西柚

dubbo RPC 8月日更 Dubbo3

python实现两台不同主机之间进行通信(客户端和服务端)——Socket

Python研究者

8月日更

Vue进阶(八十六):iframe 结合 window.postMessage 实现跨域通信

No Silver Bullet

Vue 8月日更 iframe

适女化科技(二):让女性更安全的两条技术路径:软件硬件化与硬件软件化

脑极体

面试Go语言开发?让这本书帮你感动面试官!

博文视点Broadview

最近很火的低代码到底是什么?

禅道项目管理

低代码 可视化 低代码平台

Java MVC 1.0规范开始进入公开评审阶段_Java_Michael Redlich_InfoQ精选文章