\\\看新闻很累?看技术新闻更累?试试下载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。\\t
- 改进了数据绑定——可通过@MvcBinding注解和BindingResult类来定义数据绑定和数据验证规则。\
规范文档列出了MVC 1.0的目标:
\\- 基于现有的Java EE技术。\\t
- 集成CDI(JSR-346)和Bean Validation(JSR-349)。\\t
- 定义用于构建MVC应用程序的方法,但在第一版本中不需要支持所有特性。\\t
- 尝试在JAX-RS之上构建其他层,并重用已有的匹配和绑定层。\\t
- 提供内置的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一起使用(请看下面的例子)。\\t
- String——返回视图的路径(请看下面的例子)。\\t
- 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的项目管理委员会成员。
\
其他资源
\\- MVC 1.0 by Example by Ivar Grimstad (May 22, 2017)\\t
- mvc-samples GitHub repository by Ivar Grimstad\
查看英文原文:Public Review of Java MVC 1.0 Specification is Now Open