如何在不使用其他框架的情况下在JavaEE6/7中使用MVC?

如何在不使用其他框架的情况下在JavaEE6/7中使用MVC?,java,jakarta-ee,model-view-controller,Java,Jakarta Ee,Model View Controller,我已经使用Spring框架实现了MVC模式。 在Spring中,Controller类中有@Controller和@RequestMapping注释,该框架不使用任何HttpServlet 我希望在JavaEE中使用这种精确的结构(但不使用任何其他框架) 所以我的问题是:在不使用其他框架的情况下,如何在JavaEE中使用MVC? 注意:我不想使用HttpServletclass您可以使用JavaEE中可用的技术来实现 值得一提的是,JavaEE本身由许多规范/框架组成,其中有更多的实现。见此:

我已经使用Spring框架实现了
MVC
模式。 在Spring中,Controller类中有
@Controller
@RequestMapping
注释,该框架不使用任何
HttpServlet

我希望在JavaEE中使用这种精确的结构(但不使用任何其他框架)

所以我的问题是:在不使用其他框架的情况下,如何在JavaEE中使用MVC?
注意:我不想使用
HttpServlet
class

您可以使用JavaEE中可用的技术来实现

值得一提的是,JavaEE本身由许多规范/框架组成,其中有更多的实现。见此:

JSF示例
JSP示例
JAX-RS的另一个例子

JSF的功能比JSP丰富得多,而且已经有许多组件为其制作:Omnifaces、Primefaces等。JAX-RS是用于web服务的。

玩得开心

说SpringMVC没有
HttpServlet
是不正确的。来自Spring框架javadoc:
DispatcherServlet
(HttpServlet的子类)是Spring框架HTTP请求处理程序/控制器的中央调度器。因此,它隐藏在框架中,但存在

事实上,除了仅在JSP应用程序(不是真正的MVC…JSP被翻译成…servlet!)或JSF应用程序之外,在所有JavaEE应用程序中都有(子类)
HttpServlet
。由于JSF只是一个规范,您必须使用JSF的实现。有两个著名的实现,Oracle Mojarra或Apache MyFaces,但都是。。。框架


当然,您可以在JavaEE中进行MVC,而无需任何框架。正如在MVC中所解释的,MVC是一种独立于其任何实现的设计模式。通过简单地使用
EJB
进行业务逻辑,
CDI
进行bean管理,
JSF
进行查看,困难的部分将不再是
HttpServlet

您可以使用JAX-RS和CDI响应HTTP请求,使用诸如@Path和@RequestScope之类的注释。为了方便起见,您可能需要一些JAX-RS扩展或实用程序,以便更好地处理参数(例如RestEasy的@Form)和转发到视图(例如Jersey的Viewable)

(二)

您还可以编写一个HttpServlet(我希望这不是问题),作为前端控制器,为每个请求实例化控制器。使用CDI,您可以使用@Model(与@RequestScoped和@Named相同)注释控制器,并使用以下内容在前端控制器中实例化它们:

@Inject @Any
private Instance<ControllerBaseClass> controllerInstance;

(...)

ControllerBaseClass controller = controllerInstance.select(«something»).get();
controller.processRequest(); // or execute() or anything you want.
request.getRequestDispatcher(«page»).forward(request, response); // or a redirect if it's a destructive operation.
@Inject@Any
私有实例控制器;
(...)
ControllerBaseController=controllerInstance.select(«某物»).get();
controller.processRequest();//或execute()或任何您想要的。
request.getRequestDispatcher(«页面»)。转发(请求,响应);//如果是破坏性的操作,也可以重定向。
选择(«某物»)需要通过什么?根据请求参数,您可以使用注释文字(请参阅CDI文档)或类(Class.forName(…)在CDI中选择实例

使用CDI,您还可以将控制器设置为@ApplicationScope而不是@RequestScope


如您所见,您可能需要构建一些基础设施,并从那时起遵循一些模式,但这是完全可行的。我在一个个人项目中混合使用了这两种策略,效果很好。

你想要MVC,但不想要spring?是吗?是的,我不想使用任何框架。为什么?而
HttpServlet
是所有基于web的j2ee事物的核心……很明显,JSF实现了MVC模式,并且是javaee的一部分。JSF实现它的方式与SpringMVC不同。可以说,JSF更接近Smalltalk引入的原始MVC模型。ok@marcus我会尝试一下,如果可行的话,会将其标记为接受。。如果你有一些教程链接,请分享。ThanksI没有任何具体的教程,但我建议参考这些项目的文档:RestEasy(JAX-RS):;焊缝(CDI);DeltaSpike(小型CDI扩展,注意JavaEE7已经比JavaEE6有了一些CDI改进);您还可以阅读您最喜欢的开源框架的源代码,了解类型转换、线程局部变量、反射、CSRF标记、HTML和JavaScript转义、对话/flash范围等。