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-freemarker、mysql-connector-java和freemarker工件。
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功能。
该文档包含有关框架以及可用插件的更多详细信息。
Post Directory
