BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Michael Redlich 关注 10 他的粉丝 ,译者 薛命灯 关注 19 他的粉丝 发布于 2018年2月2日. 估计阅读时间: 12 分钟 | QCon北京2018全面起航:开启与Netflix、微软、ThoughtWorks等公司的技术创新之路!

亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的邮件和网页通知

看新闻很累?看技术新闻更累?试试下载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,支持RESTEasyJerseyApache 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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

吃饱了没事做,Java换了东家就只知道造轮子。 by ZM Michael

吃饱了没事做,Java换了东家就只知道造轮子。

Re: 吃饱了没事做,Java换了东家就只知道造轮子。 by zuo yanbin

同感,看了就觉得属于卵用没有的功能

现在只需要写SQL就能完成系统开发了 by Zeng Zenny

现在只需要写SQL就能完成系统开发了:Enhancer 云开发平台

现在只需要写SQL就能完成系统开发了 by Zeng Zenny

现在只需要写SQL就能完成系统开发了:Enhancer 云开发平台

闲的没事做把,Spring不是早就提供了这些功能? by 叶 风

闲的没事做把,Spring不是早就提供了这些功能?

不要spring了?学习asp.net mvc了? by Chen YuGuo

不要spring了?学习asp.net mvc了?

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

6 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT