1. 概述
在本文中,我們將瞭解 VRaptor,一個簡單直接的 Java MVC Web 框架,它利用 Java Contexts 和依賴注入技術,易於上手。
就像 Spring 一樣——它嚴重依賴註解,並且與 Hibernate 配合良好。
它還包含一些有用的插件——例如國際化和單元測試插件。
因此,讓我們探索 VRaptor 的不同組件並創建一個示例項目。
2. 依賴和設置
快速上手的一種方法是下載 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 提供多種插件用於與數據庫交互,其中之一是 <em >vraptor-hibernate</em>,它與 Hibernate 4 配合使用。
該插件使得 Hibernate 的 <em >SessionFactory</em> Bean 在運行時通過 CDI 可用。
在安裝了該插件後,我們需要一個標準的 Hibernate 配置文件——示例可以在倉庫中找到。
VRaptor 使用一種稱為 Producers 的技術,以便使對象可供 DI 管理。 更多關於此技術的詳細信息請參考 這裏。
4. 在VRaptor中定義Web路由
在VRaptor中,路由定義位於控制器中,這些控制器僅僅是標註的Java對象——就像在Spring中一樣。
註解用於將請求路徑映射到特定的控制器,而和註解則用於指定HTTP請求類型。
路由映射配置與JAX-RS的方式相似,但並未實現官方標準。
此外,在定義路徑時,可以使用花括號指定路徑變量:
@Get("/posts/{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 通過注入方式注入到控制器中。
在我們的示例中,variable 變量由 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();
}
}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功能是如何實現的。文檔 提供了關於框架的更多詳細信息,以及可用的插件。