Java EE 8 MVC:控制器的详细介绍
Java EE MVC是為Java EE 8規劃并在JSR-371中指定的基于動作的新MVC框架。 這是我的Java EE 8 MVC教程的第二篇文章。 第一篇文章介紹了基礎知識,并展示了如何開始使用 Java EE 8 MVC參考實現Ozark 。
在本文中,我們將更詳細地介紹MVC控制器。
MVC控制器
控制器負責處理傳入的請求。 它調用業務邏輯,更新模型并返回應呈現的視圖。 MVC控制器是用@Controller注釋的JAX-RS資源方法。 如果使用@Controller注釋類,則該類的所有資源方法都將被視為控制器。
以下示例顯示了一個簡單的Controller,該Controller呈現給定產品ID的產品詳細信息頁面:
@Path("product") @Controller public?class?ProductController?{@Injectprivate?Models?models;@Injectprivate?ProductService?productService;@GETpublic?String?getProductDetailPage(@QueryParam("id")?long?productId)?{Product?product?=?this.productService.getProduct(productId);models.put("product",?product);return?"/WEB-INF/jsp/productDetailPage.jsp";} }該控制器使用ProductService解析產品ID(作為ID請求參數傳遞給產品)。 將獲得的產品添加到模型中,并返回視圖的路徑。 然后使用存儲在模型中的信息渲染視圖。
像JAX-RS中一樣,@Path批注用于定義URL路徑。 可通過如下所示的URL訪問此控制器:
/<application-path>/product?id=42下面的示例顯示了一個混合類,具有一個MVC控制器方法和一個傳統的JAX-RS資源方法:
@Path("hybrid") public?class?HybridController?{@GET@Path("jaxrs")public?Response?jaxrs()?{return?Response.status(200).build();}@Path("mvc")@GET@Controllerpublic?String?mvc()?{return?"/WEB-INF/jsp/hello.jsp";} }控制器方法的工作方式與JAX-RS資源方法非常相似。 但是,有兩個小區別:
- Controller方法上String的返回類型被解釋為視圖路徑。 使用JAX-RS資源方法,返回的String被解釋為文本內容。
- Controller方法的默認響應媒體類型是text / html。 像在JAX-RS中一樣,可以使用@Produces批注來更改媒體類型。
MVC Controller類和具有MVC Controller方法的混合類需要是CDI管理的bean。 像JAX-RS資源類一樣,每個請求都實例化MVC控制器類。 對于每個請求,都會創建一個新的Controller類實例。
像在JAX-RS中一樣,受支持的HTTP動詞由注釋定義。 如果控制器方法應偵聽HTTP POST請求,則需要使用@POST而不是@Get進行注釋。
例如:
@Controller @Path("http") public?class?PostController?{@POST@Path("post")public?String?post()?{return?"/WEB-INF/jsp/hello.jsp";} }控制器返回類型
MVC控制器方法支持四種不同的返回類型:
- 字符串–返回的字符串值被解釋為視圖路徑。
- void –在這種情況下,需要使用@View批注定義視圖
- 可視的–一種抽象,包括有關視圖,模型和使用的視圖引擎的信息。
- 響應– JAX-RS響應。 響應的實體類型必須為String,void或Viewable。
下列類使用不同的返回類型定義了四種控制器方法。 所有方法都返回相同的響應:
@Controller @Path("return-types") public?class?ReturnTypesController?{@GET@View("/WEB-INF/jsp/hello.jsp")@Path("return-void")public?void?returnVoid()?{}@GET@Path("return-string")public?String?returnString()?{return?"/WEB-INF/jsp/hello.jsp";}@GET@Path("return-string")public?Viewable?returnViewable()?{return?new?Viewable("/WEB-INF/jsp/hello.jsp");}@GET@Path("return-response")public?Response?returnResponse()?{return?Response.status(Response.Status.OK).entity("/WEB-INF/jsp/hello.jsp").build();} }返回JAX-RS響應是最靈活的方法。 這樣,可以使用JAX-RS響應構建器來修改HTTP狀態代碼,響應標頭等。
如果將void用作返回類型,則需要使用@View批注定義視圖。 @View可以應用于方法(如前面的示例)和類。 如果使用@View注釋類,則該視圖將應用于該類中的所有控制器方法。 類級別的@View批注可以由方法級別上的更特定的視圖定義覆蓋,如以下示例所示:
@Controller @Path("views") @View("/WEB-INF/jsp/foo.jsp") public?class?ViewController?{@GET@Path("first")public?void?first()?{//?renders?foo.jsp}@GET@Path("second")@View("/WEB-INF/jsp/bar.jsp")public?void?second()?{//?renders?bar.jsp}@GET@Path("third")public?String?third()?{//?renders?baz.jspreturn?"/WEB-INF/jsp/baz.jsp";} }摘要
@Controller批注可用于方法和類。 當在類上使用時,該類的所有方法均被視為控制器。 控制器方法調用業務邏輯并確定應呈現的視圖。 具有Controller方法的類是CDI管理的Bean。 對于每個請求,將創建一個新的類實例。 傳統的JAX-RS資源方法可以與同一類中的MVC Controller方法結合使用。
在有關Java EE 8 MVC的下一篇文章中,我們將介紹參數綁定和驗證。
- 您可以在GitHub上找到示例源代碼。
翻譯自: https://www.javacodegeeks.com/2015/10/java-ee-8-mvc-a-detailed-look-at-controllers.html
總結
以上是生活随笔為你收集整理的Java EE 8 MVC:控制器的详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (安卓啪啪游)
- 下一篇: 在OpenShift上部署Java EE