|
|
1
481
一个有点体面的Web应用程序由混合的设计模式组成。我只会提到最重要的那些。 Model View Controller pattern您要使用的核心(架构)设计模式是 Model-View-Controller pattern . 这个 控制器 由servlet表示,该servlet(in)直接创建/使用特定的 模型 和 视图 基于请求。这个 模型 将由JavaBean类表示。这通常在 商业模式 包含动作(行为)和 数据模型 其中包含数据(信息)。这个 视图 将由直接访问( 数据 ) 模型 通过el(表达语言)。 然后,根据操作和事件的处理方式,会有一些变化。最受欢迎的是:
另一点需要注意的是,使用国产的MVC框架是一个非常好的学习练习,我建议您只要将其用于个人/私人目的就可以使用。但是一旦你变得专业了,强烈建议你选择一个现有的框架,而不是重新设计你自己的框架。与自己开发和维护一个强大的框架相比,学习一个现有的、开发良好的框架需要的时间要短得多。 在下面的详细解释中,我将限制自己使用基于请求的MVC,因为这更容易实现。 Front Controller pattern ( Mediator pattern )
首先,
控制器
零件应执行
前控制器模式
(这是一种特殊的
中介模式
)它应该只包含一个servlet,它提供所有请求的集中入口点。它应该创建
模型
基于请求提供的信息,例如pathinfo或servletpath、方法和/或特定参数。这个
商业模式
被称为
执行操作应该返回一些标识符来定位视图。最简单的方法是将其用作JSP的文件名。将这个servlet映射到一个特定的
例如,在前缀模式的情况下
当你使用后缀模式时
Strategy pattern
这个
你可能想让
下面是一个例子
Factory method pattern
这个
这个
或者根据类路径中的属性/xml配置文件进行配置:(伪)
或者动态地基于类路径中实现特定接口和/或注释的类的扫描:(伪)
记住创建一个“什么都不做”
其他模式到目前为止,这些都是重要的模式。
为了更进一步,您可以使用
Facade pattern
创建一个
然后是
State pattern
对于这样的情况,您希望添加一个额外的抽象层来分割收集请求参数、转换它们、验证它们、更新模型值和执行操作的任务。在JSF术语中,这就是
然后是
Composite pattern
对于您希望创建一个基于组件的视图的情况,该视图可以附加到模型中,其行为取决于基于请求的生命周期的状态。在JSF术语中,这就是
通过这种方式,您可以逐步向基于组件的框架发展。 参见: |
|
|
2
12
在破旧的MVC模式中,servlet是“C”控制器。 它的主要工作是进行初始请求评估,然后根据初始评估将处理发送给特定的工人。工作人员的职责之一可能是设置一些表示层bean,并将请求转发到JSP页面以呈现HTML。因此,仅出于这个原因,您需要将请求对象传递到服务层。
不过,我不会开始写生字
|
|
|
3
5
imho,如果从责任分配的角度来看,Web应用程序的情况没有太大的区别。但是,保持层中的清晰度。在表示层中保留任何纯粹用于表示目的的内容,例如特定于Web控件的控件和代码。只需将实体保留在业务层中,并将所有功能(如添加、编辑、删除)等保留在业务层中。但是,将它们呈现到浏览器上,以便在表示层中处理。对于.NET,ASP.NET MVC模式在保持层分离方面非常好。研究MVC模式。 |
|
4
3
我已经用过了 struts 框架和发现它相当容易学习。使用Struts框架时,站点的每个页面都将包含以下项。 1)每次刷新HTML页面时都会调用所使用的操作。当第一次加载页面时,该操作应填充表单中的数据,并处理Web UI和业务层之间的交互。如果使用JSP页面修改可变Java对象,则Java对象的副本应该存储在表单中而不是原件中,这样原始数据不会被修改,除非用户保存页面。 2)用于在操作和JSP页面之间传输数据的表单。这个对象应该由一组getter和setter组成,用于JSP文件需要访问的属性。表单还具有一个方法,用于在数据持久化之前对其进行验证。 3)用于呈现页面最终HTML的JSP页面。JSP页面是HTML和用于访问和操作表单中数据的特殊struts标记的混合体。虽然Struts允许用户将Java代码插入到JSP文件中,但这样做会非常谨慎,因为这会使代码变得更难阅读。JSP文件内部的Java代码很难调试,不能进行单元测试。如果发现自己在JSP文件中编写了超过4-5行Java代码,则代码可能会被移动到操作中。 |
|
|
5
3
巴鲁斯 优秀的答案涵盖了Web应用程序的大多数模式。 某些应用程序可能需要 Chain-of-responsibility_pattern
使用案例使用此模式: 当处理请求(命令)的处理程序未知并且此请求可以发送到多个对象时。一般情况下你会 继承人 反对。如果当前对象无法处理请求或部分处理请求并将同一请求转发给 继承人 对象。 有用的SE问题/文章: Why would I ever use a Chain of Responsibility over a Decorator? Common usages for chain of responsibility? chain-of-responsibility-pattern 从OODE设计 chain_of_responsibility 源代码生成 |