gpt4 book ai didi

java - 与 Symfony2 应用程序相比,spring MVC 表示层应该如何构建?

转载 作者:可可西里 更新时间:2023-10-31 23:05:04 26 4
gpt4 key购买 nike

为了更好地理解我在这里想要实现的目标,是一个典型的图像 Symfony2只有一个包和一个 spring MVC 应用程序并排的应用程序:
enter image description here enter image description here
我知道 Symfony2 之间存在概念上的差异它可用于构建整个应用程序,而 Spring MVC 也可用于构建整个应用程序,但在我的情况下,我希望它充当我的 仅表示层 .
使用 Spring MVC 有点像使用原始裸机。我更喜欢固执己见的方法。我想要类似于 Symfony2 中的包的东西每个包都包含它的 Controller 、 View 、表单、模板、配置、js 和 css。我希望按 Controller 名称对 View 进行分组。
我想要一些东西来容纳整个应用程序的配置,比如数据库或电子邮件服务器,以及我可以为所有“包”添加布局的地方。我想要缓存和日志文件夹。
我知道我可以手动创建所有这些,但我觉得应该有类似 spring MVC 应用程序的标准文件夹结构的东西。
我几乎听起来像是在寻找建立在 Spring MVC 之上的框架(也许这毕竟是解决方案),但也许我对整个事情采取了错误的方法。
注意:我的业务逻辑位于单独的有界上下文中。表示层是应用程序的一部分,它将与所有这些上下文进行通信。

最佳答案

首先,我想说我用 Symfony(不是 Symfony 2)构建了很多 php 应用程序,所以我所说的可能有些不一致,但无论如何我可以分享我的观点。

首先,Symfony 是用 php 编写的,它是一个完整的框架。它具有文件夹(包)结构的愿景,不仅因为它使您的代码井井有条……而且还由于 php 的技术限制。 Php 主要基于通过使用以下指令来包含其他 php 源:

include ('/lib/somelib.lib.php');

这是 php 加载资源的唯一方式。这会导致在 php 中编写框架的一些后果。例如在 Symfony 中,当您将浏览器指向 http://localhost/some_module/some_url 时symfony 会假设“按照约定”你想加载一个名为: some_module 的 Controller 。并且你想执行方法 some_url在这个 Controller 中。乍一看,这听起来不错,但其中有一个“问题”。 Symfony 需要它,因为这是 Symfony 可以推断您要加载哪个 Controller 和哪个方法的唯一方式(这可能与 Symfony2 类似)。否则,您将需要创建额外的配置文件。

另一方面,Java 为您提供了许多实现此目的的方法,而无需强制您输入 Controller 的名称和方法。 Spring MVC 只是利用了 java 给你的东西。在 Spring 中,您可以为 Controller 指定任何名称,也可以为您的方法指定任何名称。例如,您可以通过在 Controller 类和方法上使用注释来实现这一点:
@Controller
public class MyController {

@RequestMapping(value = "/some_module/some_url", method = RequestMethod.GET)
public ModelAndView searchForSomeData(@PathVariable("currentPage") String currentPageUrlString, @RequestParam("userId") Integer userId) {
(...)


}

您可以将 Controller 放在任何文件夹(包)中,spring 将通过“组件扫描功能”发现它。您不需要依赖 php 中使用的“约定优于配置”(因为它的局限性)。您可以创建一些“标准”文件夹结构,但不是必须的。

另一件事是 Symfony(也由于 php 应用程序构建方式的一些限制)迫使您使用它自己的模板引擎作为 View 技术。这就是为什么有所谓的“按 View 名称分组 Controller ”(您可以使用其他引擎进行 View 处理,如 Smarty,但这会带来痛苦)。另一方面,在 Spring 中,您不受任何 View 技术的约束。您可以使用 Apache Tiles ,jsp 页面和任何你想要的。您只需配置并使用它。更重要的是,您可以在一个应用程序中使用两种或多种 View 技术 - 您只需要告诉 spring 何时使用一种 View 技术以及何时使用另一种(例如基于 url 前缀)。配置出奇的简单。只需使用注释,例如像这样:
@Configuration
public class WebConfig {
@Autowired
@Qualifier("tilesViewResolver")
private ViewResolver tilesViewResolver;

@Autowired
@Qualifier("jstlViewResolver")
private ViewResolver jstlViewResolver;

@Bean
@DependsOn({ "tilesViewResolver", "jstlViewResolver" })
public ViewResolver viewResolver() {
Map<String, ViewResolver> resolvers = new HashMap<>();
resolvers.put("internal", jstlViewResolver);
resolvers.put("tilesView", tilesViewResolver);

ViewResolver globalViewResolver = new PrefixViewResolver(resolvers, jstlViewResolver);
return globalViewResolver;
}


@Bean(name = "tilesViewResolver")
public ViewResolver tilesViewResolver() {
UrlBasedViewResolver url = new UrlBasedViewResolver();
url.setViewClass(TilesView.class);
return url;
}


@Bean(name = "jstlViewResolver")
public ViewResolver jstlViewResolver() {
UrlBasedViewResolver resolver = new UrlBasedViewResolver();
resolver.setPrefix("/WEB-INF/internal/");
resolver.setViewClass(JstlView.class);
resolver.setSuffix(".jsp");
return resolver;
}
}

所以再次在这里,Spring 不会强制您使用任何东西,因为它不会在有一些限制的环境中运行,例如 php 中的 Symfony。

日志文件夹和其他文件夹也是如此。你没有得到日志文件夹,因为你需要声明你想使用哪种技术来登录 Spring/java(无论是 log4jlogbackcommons loggingslf4j 等)。在 symfony 中,由于两个原因,您定义了日志文件夹。首先,您被迫(有些人会说“鼓励”,但我更喜欢将其命名为“强制”)使用 Symfony 的日志系统,该系统默认配置为在您的应用程序目录中使用“logs”目录。其次,php 的限制/特征再次出现 - 当您部署 php 应用程序时,您通常将日志保存在应用程序文件夹中,因为您无权写入文件系统上的任何其他文件夹。当您在 Tomcat 上部署 Java 应用程序时,您通常将日志保存在 Tomcat 目录或文件系统上的其他目录中。

所以底线是自由。这就是为什么您在 Spring MVC 中在这方面没有任何“标准”的原因。您可以创建适合您应用的标准。

关于java - 与 Symfony2 应用程序相比,spring MVC 表示层应该如何构建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26103642/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com