1. 概述
在本文中,我們將瞭解 VRaptor,一個簡單而直接的 Java MVC Web 框架,它利用 Java Contexts 和依賴注入技術,易於理解。就像 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>
罪魁禍首是 el-api,它包含在 weld-servlet-core 和 weld-core-impl 中,具有 compile 範圍;這導致了依賴衝突。
我們需要添加以下依賴項,因此我們在 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>
最新版本的 vraptor-freemarker, mysql-connector-java 和 freemarker 可以在 Maven Central 中找到。
現在我們準備好了,讓我們創建一個簡單的博客網站。
3. Hibernate 支持
VRaptor 提供多種插件用於與數據庫交互,其中之一是 vraptor-hibernate,它與 Hibernate 4 配合使用。
該插件使 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", "帖子已成功添加");
result.redirectTo(IndexController.class).index();
} else {
result.include(
"error", "創建帖子時出錯。請稍後再試");
result.redirectTo(this).addForm();
}
}
Post 對象在使用 Java Bean 驗證庫對其進行驗證,然後再使用 postDao.add() 將其持久化到數據庫。
Post 對象的字段自動從提交表單數據中填充,這些數據與視圖文件中的表單輸入字段相對應。
注意,輸入字段的名稱必須以對象名稱(小寫)進行前綴。
例如,負責添加新帖子的視圖具有以下輸入字段:post.title 和 post.post,分別對應title 和 post 字段,分別位於Post.java 中。
<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功能是如何實現的。
文檔 包含有關框架以及可用插件的更多詳細信息。