java web设计模式应用,基于web的设计模式应用程序

一个有点像样的Web应用程序由多种设计模式组成。我只提最重要的几个。

您希望使用的核心(体系结构)设计模式是模型-视图-控制器模式。这个控制器是由一个servlet来表示,它直接创建/使用一个特定的模型和视点根据请求。这个模型将由Javabean类表示。这通常可以进一步划分为商业模式包含行动(行为)和数据模型其中包含数据(信息)。这个视点的JSP文件表示,这些JSP文件可以直接访问(数据) 模型由EL(表达语言)

然后,有基于操作和事件处理方式的变化。最受欢迎的是:基于MVC的请求(动作)这是最简单的实现。[医]商业) 模型直接与HttpServletRequest和HttpServletResponse物品。您必须自己收集、转换和验证请求参数(主要是)。这个视点可以用普通的HTML/CSS/JS来表示,并且它不能跨请求维护状态。其他人就是这样SpringMVC, 支柱和条纹起作用了。

基于组件的MVC*这很难实施。但是,您最终得到了一个更简单的模型和视图,其中所有的“原始”ServletAPI都被抽象了。您不应该需要自己收集、转换和验证请求参数。这个控制器执行此任务,并将收集、转换和验证的请求参数设置为模型。您所需要做的就是定义直接与模型属性一起工作的操作方法。这个视点用JSP标记库或XML元素的风格表示“组件”,这些元素反过来生成HTML/CSS/JS。的状态视点对于随后的请求,将在会议中进行维护。这对于服务器端的转换、验证和值更改事件尤其有用.其他人就是这样JSF, Wicket和玩,打,踢!起作用了。

顺便提一句,在自己开发的MVC框架中四处游玩是一个非常好的学习练习,只要您将它保存在个人/私人目的上,我就建议您这样做。但是一旦你变得专业了,我们强烈建议你选择一个现有的框架,而不是重新发明你自己的框架。学习一个现有的和发展良好的框架需要很长时间,而不是自己开发和维护一个健壮的框架。

在下面的详细说明中,我将限制自己以基于MVC的请求为基础,因为这更容易实现。

首先,控制器部分应该实现前控制器模式(这是一种特殊的中介模式)。它应该只包含一个servlet,它提供了所有请求的集中入口点。它应该创建模型基于请求提供的信息,如painfo或servletpath、方法和/或特定参数。这个商业模式被称为Action在下面HttpServlet举个例子。protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

try {

Action action = ActionFactory.getAction(request);

String view = action.execute(request, response);

if (view.equals(request.getPathInfo().substring(1)) {

request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);

}

else {

response.sendRedirect(view); // We'd like to fire redirect in case of a view change as result of the action (PRG pattern).

}

}

catch (Exception e) {

throw new ServletException("Executing action failed.", e);

}}

执行操作应该返回一些标识符来定位视图。最简单的方法是使用它作为JSP的文件名。将此servlet映射到特定的url-pattern在……里面web.xml,G./pages/*, *.do甚至只是*.html.

例如,在前缀模式的情况下/pages/*然后调用URL就像http://example.com/pages/register, http://example.com/pages/login等,并提供/WEB-INF/register.jsp, /WEB-INF/login.jsp使用适当的GET和POST操作。零件register, login,等可通过request.getPathInfo()就像上面的例子一样。

当您使用后缀-模式,如*.do, *.html,等等,然后您就可以调用URL了http://example.com/register.do, http://example.com/login.do,等等,您应该更改此答案中的代码示例(还应更改ActionFactory)提取register和login零件request.getServletPath()相反。

这个Action应该遵循战略模式。它需要定义为一个抽象/接口类型,它应该根据过关抽象方法的参数(这是与指挥模式,其中抽象/接口类型应该根据在创造的执行情况)。public interface Action {

public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception;}

你可能想让Exception使用自定义异常更具体,如ActionException。这只是一个基本的开球例子,其余的都取决于你。

下面是一个例子LoginAction它(顾名思义)登录到用户中。这个User本身就是数据模型。这个视点注意到User.public class LoginAction implements Action {

public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {

String username = request.getParameter("username");

String password = request.getParameter("password");

User user = userDAO.find(username, password);

if (user != null) {

request.getSession().setAttribute("user", user); // Login user.

return "home"; // Redirect to home page.

}

else {

request.setAttribute("error", "Unknown username/password. Please retry."); // Store error message in request scope.

return "login"; // Go back to redisplay login form with error.

}

}}

这个ActionFactory应该遵循工厂方法模式。基本上,它应该提供一个创建方法,返回抽象/接口类型的具体实现。在这种情况下,它应该返回Action接口基于请求提供的信息。例如,方法和帕辛弗(pathinfo是请求URL中上下文和servlet路径之后的部分,不包括查询字符串)。public static Action getAction(HttpServletRequest request) {

return actions.get(request.getMethod() + request.getPathInfo());}

这个actions反过来,应该是静态的/应用范围的。Map拥有所有已知的行动。该由你来填写这张地图了。硬编码:actions.put("POST/register", new RegisterAction());actions.put("POST/login", new LoginAction());actions.put("GET/logout", new LogoutAction());// ...

或基于类路径中的属性/xml配置文件进行配置:(伪)for (Entry entry : configuration) {

actions.put(entry.getKey(), Class.forName(entry.getValue()).newInstance());}

或基于类路径中实现特定接口和/或注释的类的动态扫描:(伪)for (ClassFile classFile : classpath) {

if (classFile.isInstanceOf(Action.class)) {

actions.put(classFile.getAnnotation("mapping"), classFile.newInstance());

}}

记住要创造一个“什么都不做”Action对于这种情况,没有映射。例如,让它直接返回request.getPathInfo().substring(1)然后。

其他模式

到目前为止,这些都是重要的模式。

要更进一步,可以使用立面图案若要创建一个Context类,该类依次包装请求和响应对象,并提供了几种方便的方法,委托给请求和响应对象,并将其作为参数传递到Action#execute()方法代替。这增加了一个额外的抽象层来隐藏原始ServletAPI。你最终应该零 import javax.servlet.*声明Action执行。在JSF术语中,这就是FacesContext和ExternalContext上课了。您可以在这个答案.

然后是状态模式对于这样的情况,您希望添加一个额外的抽象层来拆分收集请求参数、转换它们、验证它们、更新模型值和执行操作等任务。在JSF术语中,这就是LifeCycle正在做。

然后是复合图案对于这样的情况,您希望创建一个基于组件的视图,该视图可以与模型相关联,并且其行为取决于基于请求的生命周期的状态。在JSF术语中,这就是UIComponent代表。

通过这种方式,您可以一点地向基于组件的框架发展。

另见:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值