Web应用程序的JSP / Servlet设计模式建议

时间:2012-07-08 04:56:03

标签: java jsp design-patterns web-frameworks

我在基于原生脚本(JSP)的RESTful Web Framework中工作。框架有一个路由机制,自动设置一个Request属性,然后在JSP中可用(其中一个属性是所请求资源的“模型”;它基本上只是一个HashMap)。

问题是90%的时间,需要将一些逻辑添加到JSP中,无论是更复杂的域逻辑,检索其他资源数据(其他模型),还是擦除数据以进行输出。

我正在研究各种建立Web应用程序设计模式,以便从JSP中提取域逻辑,并尽可能保持JSP逻辑。

有几点需要注意:

  1. 在我工作的系统中,提供了Model(数据库中的数据),但是框架(前面提到的HashMap);我可以围绕这些数据创建自己的Model包装器,但这可能是不必要的。
  2. JSP / Scripts是请求的终点 - 如果我使用的模式使用Presenter / Controller类型的对象返回View bean(ViewModel?),其中包含视图将使用的所有数据,我将需要在JSP中有一行调用Presenter / Controller并实例化View bean。
  3. 目前我为每个模块(脚本)创建了一个Presenter POJO,它可以访问模型(同样,Framework将其设置为Request attr),并简单地在JSP的顶部实例化它,并使用它它或多或少像一个豆子。

    如果我理解正确的话,我相信我已经实现了演示模型设计模式。 [1]

    实施例

    JSP看起来像:

    <% DemoPresenter demo = new DemoPresenter(request) %>
    <%= demo.getTitle() %>
    - or add it to pageContext to use w JSTL/EL -
    <c:set var="demo" value="new DemoPresenter(request)"/>
    ${demo.title} 
    

    “演示者/控制者”看起来像:

    public class DemoPresenter extends BasePresenter { 
    
       private String title; 
    
       public DemoPresenter(HttpServletRequest request) { 
           FrameworkModel model = request.getAttribute("frameworkProvidedResourceModel");
           this.title = model.get("title").toUpperCase() + "!!!";
       } 
    
       public getTitle() { return this.title; } 
    }
    

    有关直接在JSP / Script中使用Presenter obj的想法,还是让它返回Presenter填充w / data的“逻辑无”ViewModel bean?这样做的好处是我可以让一个Presenter管理同一资源的各种“视图”(例如Show-view,Edit-view,Summary-view等) - 下面是我如何获得各种视图的示例模型。

    / blog / posts / 1 / show - &gt;执行JSP,得到它的ViewModel,如下所示:

    <% DemoDefaultViewModel default = new DemoPresenter(request).getViewModel(DemoDefaultViewModel.class); %>
    

    / blog / posts / 1 / edit - &gt;执行一个获取ViewModel的JSP,如下所示:

    <% DemoEditViewModel edit = new DemoPresenter(request).getViewModel(DemoEditViewModel.class); %>
    

    我想保留一个简单的解决方案,而不需要太多无关的部分。我也不能太过花哨,因为我在一个严格的预定义框架内工作 - 我只是想找到一个好方法将我的所有域逻辑从JSP转移到更可重用,可测试的Java类中。

    [1] http://martinfowler.com/eaaDev/PresentationModel.html

2 个答案:

答案 0 :(得分:0)

查看支柱 我必须承认只使用了旧版本,但“前端控制器”servlet的想法似乎就是你所追求的。它是运行公共代码和路由请求的特殊servlet 它还具有可以在Web容器外部进行测试的操作。

我从纯JSP转向struts的那一天是我网络开发生活中最好的日子之一!该项目开始感觉井井有条,更容易管理。

答案 1 :(得分:0)

有很多MVC框架。例如,Struts使用前端控制器servlet根据所使用的资源将请求分派给类(控制器)。该类处理请求并将结果发送到视图(通常是jsp)。该模型是代表您的数据的任何类。仅供参考,地图不是框架。仅将您的数据表示为MAP,将起作用,但难以维护且难以维护。

在不了解您的严格框架的情况下,通常认可的良好做法是保持您的业务逻辑集中并独立于任何框架。仅使用框架进行管道连接。让您的控制器在您的演示文稿和业务逻辑之间进行调解,同样这只是管道。将您的显示数据放在正确的范围内(几乎总是请求范围),因此您不必像示例中那样拥有scriptlet。