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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql htmlspecialchars_htmlSpecialchars和MySQL_REARY_EXECH_String是否保证PHP代码

当涉及到数据库查询时&#xff0c;始终尝试并使用准备好的参数化查询。这个mysqli和PDO图书馆支持这一点。这比使用转义函数(如mysql_real_escape_string.是,mysql_real_escape_string实际上只是一个字符串转义函数。这不是一颗神奇的子弹。它所要做的就是转义危险字符&#xf…

前端跨域问题的几种解决方案

前端跨域问题 一&#xff1a;同源策略   1.whats this     所谓同源是指&#xff0c;域名&#xff0c;协议&#xff0c;端口相同。当浏览器运行一个JS脚本时会进行同源检测&#xff0c;如果不同源是不能执行的。   2.源继承     来自about:blank&#xff0c;javasc…

在OpenShift上部署Java EE微服务

我昨天用WildFly Swarm在博客上发布了有关简单JAX-RS微服务的博客。 您学习了如何使用Maven构建一个所谓的“胖子”&#xff0c;还使用Maven Docker插件对我们的微服务进行了Docker化并在Docker Machine上本地运行。 这是在本地测试事物的好方法。 到目前为止&#xff0c;缺少的…

rocketmq 订阅组_必须先理解的RocketMQ入门手册,才能再次深入解读

推荐阅读一下下2020年后想跳槽&#xff1f;MQ、ZK、Nginx、Kafk等分布式技术你都掌握了&#xff1f;阿里架构师推荐学习的《RabbitMQ实战指南》&#xff0c;渣渣的你都看过吗&#xff1f;RocketMQ入门手册RocketMQ是一个分布式、队列模型的开源消息中间件&#xff0c;前身是Met…

关于返回按钮的事情

在微信的项目涉及到多个不同的项目间跳转那么头部的返回按钮怎么办呢&#xff1f; 在项目之间跳转还有在微信菜单进入页面时我们用了一个中转页进行参数处理和页面跳转判断 目前要用到code&#xff0c;userId等从后端写好的带参数的url到前端获取然后去调用后端的一个校验code和…

.net数据源控件绑定mysql_理解asp.net中DropDownList编辑数据源,绑定数据库数据。...

一、理解asp.net绑定数据库终于学习到了连接数据库部分的内容&#xff0c;杨中科老师视频看起来挺轻松的&#xff0c;如果是高清版就更ok了。我发现我学习新的编程语言会有一个特点&#xff0c;都想要赶紧学习数据库&#xff0c;数据就是一切&#xff0c;有了数据才能操作一切的…

jetty代理jetty_如何在Jetty中使用SPDY

jetty代理jettySPDY是Google提出的一种新协议&#xff0c;是针对网络的新协议。 SPDY与HTTP兼容&#xff0c;但尝试通过压缩&#xff0c;多路复用和优先级降低网页负载。准确地说&#xff0c;快速的目标是&#xff1a;&#xff08; http://dev.chromium.org/spdy/spdy-whitepap…

五指棋,贪吃蛇,中国银行ATM源码链接

https://i.cnblogs.com/Files.aspx 转载于:https://www.cnblogs.com/weixiaoling/p/6083710.html

mysql select db error_select error:不能用DB-library(如isql)不能用DB-library(如isql

在我们php连接mssql出现select error:不能用DB-library(如isql)或odbc3.7或更早版本将ntext数据或仅使用Unicode排序规则的Unicode数据发送到客户端不能用DB-Library(如 ISQL)或 ODBC 3.7或更早版本将 ntext 数据Warning: mssql_query() [function.mssql- query]: message: 不能…

排序算法之二分治法

MERGE(A,p,q,r) n1 q-p1 n2 r-q let L[1..n_11] and R[1..n_21] be new arraysfor i 1 to n_1   L[i] A[pi-1]for j 1 to n_2   R[j] A[qj] L[n_11] \infty R[n_21] \infty i 1 j 1for k p to r   ifL[i] \leq R[j]     A[k] L[i]     i i1else A[k…

将Java EE与jOOQ结合使用的初学者指南

Java EE附带了自己的持久性API&#xff1a;JPA。 当您想要将RDBMS实体&#xff08;表/关系&#xff09;映射到Java实体&#xff08;类&#xff09;时&#xff0c;JPA最强大&#xff0c;主要遵循1&#xff1a;1映射策略。 其背后的想法是&#xff0c;业务逻辑通常并不像关系代数…

niva mysql_Nivacat for mysql是一种第三方提供的()_学小易找答案

【单选题】以下不包括在OSI环境中的是【单选题】以下不是直接推动新疆建省原因的选项是( ) (3.0分)【填空题】TOEFL stands for 1____________________________. More than four thousand American universities and other schools require students seeking 2________ to take…

清理SYSAUX表空间

1.查看SYSAUX表空间中数据分布情况 col SEGMENT_NAME for a30 set lines 999 select * from (select segment_name,PARTITION_NAME,segment_type,bytes/1024/1024 from dba_segments where tablespace_nameSYSAUX order by 4 desc) where rownum<10; 2.删除WRH$_LATCH_CHILD…

mysql备份需要停应用吗_对于含有innodb表的实例进行文件拷贝备份时必须停mysql实例吗...

展开全部在实际环境中&#xff0c;62616964757a686964616fe59b9ee7ad9431333361313261时不时需要备份恢复单个或多个表(注意&#xff1a;这里除非明确指定&#xff0c;所说的表一律指InnoDB表)&#xff0c;而对于innodb引擎恢复单个表需要整体的恢复&#xff0c;xtrabackup也可…

Apache Camel 2.16发布–十大亮点

Apache Camel 2.16于上周五发布。 这篇博客文章是我尝试在此新版本中进行前10名&#xff08;加1作为奖励&#xff09;的亮点。 1.动态到 来自骆驼用户的最常见的常见问题是如何将消息发送到端点&#xff0c;uri应该使用消息中的动态值&#xff08;例如标头&#xff09;。 在…

[原创软件]体验组批量加分工具

软件主要功能&#xff1a; 从excel批量导入用户QQ、昵称、年龄信息批量粘贴用户QQ或昵称进行筛选批量添加积分软件界面截图&#xff1a; 开发环境及语言&#xff1a; c#.NET Framework 4.0Visual Studio 2015更新日志&#xff1a; v1.2&#xff08;2016.9.30&#xff09; 增加格…

java8 filter return_java8新特性Java 8 Streams filter示例 - Java教程

在这篇教程中我将向你展示 filter(), collect(), findAny() 和 orElse() 的用法1. Streams filter() 和 collect()1.1 在 Java 8 以前, 像下面这样过滤一个 List:BeforeJava8.javapackage com.mkyong.java8;import java.util.ArrayList;import java.util.Arrays;import java.ut…

java 线性表的表示和实现_线性表中顺序表的的理解和实现(java)

线性表的顺序表示指的是用一组地址连续的存储单元以此存储线性表的数据元素&#xff0c;这种表示也称作线性表的顺序存储结构或顺序映像。通常&#xff0c;称这种存储结构的线性表为顺序表。特点是&#xff1a;逻辑上相邻的数据元素&#xff0c;其物理次序上也是相邻的。顺序表…

akka连接是什么_什么是Akka?

akka连接是什么在深入探讨什么是Akka之前&#xff0c;让我们退后一步来了解并发编程的概念在应用程序开发世界中是如何演变的。 应用程序已从大型的整体程序演变为面向对象的模型。 随着Java EE和Spring框架的出现&#xff0c;应用程序设计演变为更多的基于流程或任务的设计模型…

java socket 判断断网_java socket 判断对方在线或离线、断线

1 在客户端和服务器端做心跳检测(这个后来我放弃了)2 客户端中断连接&#xff0c;服务器会抛出异常&#xff0c;利用这点3这是我为什么不用心跳包的原因&#xff0c;因为不需要了。 有的时候&#xff0c;我们可能网络突然中断了。但是服务器依然会监听那个连接。而且很长都不抛…