VRaptor介绍

2025/04/07

1.概述

在本文中,我们将了解VRaptor,这是一个简单直接的Java MVC Web框架,它利用Java上下文和依赖注入技术并且易于掌握。

就像Spring一样-它严重依赖注解并且与Hibernate配合得很好

它还附带一些有用的插件,例如用于内部化和单元测试的插件。

因此,让我们探索VRaptor的不同组件并创建一个示例项目。

2. Maven依赖和设置

启动并运行的一个快速方法是从官方仓库下载vraptor-blank-project-distribution。

空白项目只是一个框架,可以充实成为一个成熟的Web应用程序。

下载并解压项目后,我们将目录重命名为vraptor(或任何其他名称)。

该目录应包含:

  • src
  • pom.xml
  • README.md

该项目基于Maven,并附带tomcat7 Maven插件,该插件提供了用于运行应用程序的Servlet容器。

它还带有一个默认的IndexController,该控制器只有一个方法index()。

默认情况下,此方法要呈现的视图位于webapp/WEB-INF/jsp/index/index.jsp-这遵循约定WEB-INF/jsp/controller_name/method_name。

要启动服务器,我们将从项目根目录执行命令mvn tomcat7:run。

如果成功的话,我们访问http://localhost:8080,浏览器会显示“It works!! VRaptor!”。

如果我们遇到“java.lang.LinkageError: loader constraint violation”,那么我们必须修改pom.xml中的以下依赖

<dependency>
    <groupId>org.jboss.weld.servlet</groupId>
    <artifactId>weld-servlet-core</artifactId>
    <version>2.1.2.Final</version>
    <exclusions>
        <exclusion>
	    <groupId>org.jboss.spec.javax.el</groupId>
	    <artifactId>jboss-el-api_3.0_spec</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.jboss.weld</groupId>
    <artifactId>weld-core-impl</artifactId>
    <version>2.1.2.Final</version>
    <exclusions>
       <exclusion>
          <groupId>org.jboss.spec.javax.el</groupId>
  	  <artifactId>jboss-el-api_3.0_spec</artifactId>
       </exclusion>
    </exclusions>
</dependency>

罪魁祸首是weld-servlet-core和weld-core-impl中包含的具有compile范围的el-api,这导致了依赖冲突。

在此过程中将需要以下依赖,因此我们将它们包含在pom.xml中:

<dependency>
    <groupId>br.com.caelum.vraptor</groupId>
    <artifactId>vraptor-freemarker</artifactId>
    <version>4.1.0-RC3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.8-dmr</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.27-incubating</version>
</dependency>

可以在Maven Central中找到最新版本的vraptor-freemarkermysql-connector-javafreemarker工件。

3. Hibernate支持

VRaptor提供了各种与数据库交互的插件,其中之一是与Hibernate 4一起使用的vraptor-hibernate。

该插件使得Hibernate的SessionFactory Bean在运行时通过CDI可用

有了插件,我们需要一个标准的Hibernate配置文件-可以在仓库中找到一个示例。

VRaptor使用一种称为Producers的技术来使对象可用于DI管理,有关此内容的更多详细信息,请参见此处

4. 在VRaptor中定义Web路由

在VRaptor中,路由定义驻留在控制器中,控制器只是带有@Controller注解的Java对象-就像在Spring中一样。

@Path注解用于将请求路径映射到特定控制器,@Get、@Post、@Put、@Delete和@Patch注解用于指定HTTP请求类型。

路由映射配置看起来与JAX-RS的方式类似,但并未正式实现该标准

此外,在定义路径时,可以在花括号中指定路径变量:

@Get("/posts/{id}")

然后可以在控制器方法内部访问id的值:

@Get("/posts/{id}")
public void view(int id) {
    // ...
}

当表单提交到特定路由时,VRaptor可以自动使用提交的表单数据填充对象。

让我们在文章的下一部分中看看这一点的实际应用。

5. 视图和模板引擎

默认情况下,可以使用JSP实现视图。但是,也可以使用其他模板引擎-在本文中,我们将使用Freemarker。

让我们首先创建index.ftl并将其保存在默认视图目录(src/main/resources/templates)中:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>VRaptor Blank Project</title>
</head>
<body>
It works!! ${variable}
</body>
</html>

现在,我们可以使用FreemarkerView类来定义视图进行视图渲染:

@Path("/")
public void index() {
    result.include("variable", "VRaptor!");
    result.use(FreemarkerView.class).withTemplate("index");
}

Result对象保存模型状态-它具有重定向到另一个页面、URL或控制器方法的方法;它可以使用CDI注入到控制器中。

在我们的示例中,变量由Freemarker解析,因此index.ftl中的${variable}占位符被替换为“VRaptor!”。

更多高级用法记录于此处

6. 表单提交处理示例

让我们看看如何处理带有验证的表单提交:

@Post("/post/add")
public void add(Post post) {
    post.setAuthor(userInfo.getUser());
    validator.validate(post);
    if(validator.hasErrors()) {
        result.include("errors", validator.getErrors());
    }
    validator.onErrorRedirectTo(this).addForm();

    Object id = postDao.add(post);

    if(Objects.nonNull(id)) {
        result.include("status", "Post Added Successfully");
        result.redirectTo(IndexController.class).index();
    } else {
        result.include(
                "error", "There was an error creating the post. Try Again");
        result.redirectTo(this).addForm();
    }
}

首先使用Java Bean Validation来校验Post对象,然后使用postDao.add()将对象持久保存到数据库中。

Post对象的字段会自动从提交的表单数据的值中填充,这些值对应于视图文件中表单的输入字段。

请注意,输入字段的名称必须以小写的对象名称作为前缀

例如,负责添加新帖子的视图具有输入字段:post.title和post.post,它们分别对应于Post.java中的字段title和post:

<input type="text" class="form-control" placeholder="Title" id="title" name="post.title" required />

<textarea rows="10" class="form-control" placeholder="Post" id="post" name="post.post" required></textarea>

完整的add.ftl文件可以在源代码中找到。

如果表单提交时出现错误,则会包含错误消息,并将用户重定向到相同的add()方法:

if(validator.hasErrors()) {
    result.include("errors", validator.getErrors());
}
validator.onErrorRedirectTo(this).addForm();

7. 总结

总之,我们对VRaptor进行了大致的了解,并了解了如何实现基本的MVC功能。

文档包含有关框架以及可用插件的更多详细信息。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章