当前位置: 首页 > 面试题库 >

java web设计模式有哪些?

仲浩歌
2023-03-14
问题内容

java web设计模式有哪些?


问题答案:

模型视图控制器模式

你要使用的核心(架构)设计模式是Model-View-Controller模式。该控制器是由一个Servlet其中(在)直接创造来表示/使用特定的模型和视图基于该请求。该模型将由Javabean类表示。在包含动作(行为)的业务模型和包含数据(信息)的数据模型中,这通常可以进一步划分。该视图是由具有对(直接访问JSP文件来表示数据)模型由EL(表达式语言)。

然后,根据操作和事件的处理方式而有所不同。最受欢迎的是:

  • 基于请求(动作)的MVC:这是最简单的实现。(业务)模型直接与HttpServletRequestHttpServletResponse对象一起使用。你必须自己(主要)收集,转换和验证请求参数。该视图可以用普通的HTML / CSS / JS表示,并且不会在请求中保持状态。这就是Spring MVC,Struts和Stripes的工作方式。
  • 基于组件的MVC:这很难实现。但是最终你得到了一个更简单的模型和视图,其中所有“原始” Servlet API都被完全抽象了。你不需要自己收集,转换和验证请求参数。所述控制器执行此任务,并设置在所收集的,转换后的和验证请求参数模型。你需要做的就是定义直接与模型属性一起使用的操作方法。该视图是通过“组件”在JSP标记库或依次产生HTML / CSS / JS的XML元素的风味表示。视图的状态在会话中维护后续请求。这对于服务器端转换,验证和值更改事件特别有用。这就是JSF,Wicket和Play的方式!作品。

附带说明一下,使用本地的MVC框架是一种非常不错的学习方法,只要你出于个人/私人目的保留它,我还是建议你这样做。但是一旦你成为专业人士,则强烈建议你选择一个现有的框架,而不要重塑自己的框架。学习现有的和完善的框架要比自己开发和维护一个健壮的框架花费更少的时间。

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

前控制器模式(调解器模式)

首先,Controller部分应实现Front Controller模式(这是一种专门的Mediator模式)。它应该仅包含一个servlet,该servlet提供所有请求的集中入口点。它应基于请求可用的信息来创建模型,例如pathinfo或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-patternweb.xml,例如/pages/**.do甚至*.html

在前缀模式,例如情况下,/pages/*你可以然后调用URL就像http://example.com/pages/registerhttp://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.dohttp://example.com/login.do,等你应该改变此答案中的代码示例(也包括ActionFactory)来提取register和login部分request.getServletPath()。

策略模式

本Action应遵循的策略模式。需要将其定义为抽象/接口类型,该类型应基于抽象方法的传入参数来完成工作(这与Command模式不同,其中命令 /抽象类型应基于在创建实现过程中传入的参数)。

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(该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)



 类似资料:
  • 能接触到的常见问法: 项目中有用到什么设计模式?(前端更多点) 重构使用了什么设计模式?(如果你项目强调了重构一般会问) 说说对 XX 模式的理解?(个人接触过的是单例和工厂,这两个比较多) 有接触到哪些?实际用到过哪些?(通用) 除了这些,还有一些不常见的进阶和基础问法,这些直接在下面整理 -- 设计模式这个主题还挺玄乎的,个人直观体验是,自己日常实习那段时间问得挺频繁的,可能是因为没啥好问的。

  • 本文向大家介绍熟悉哪些设计模式?相关面试题,主要包含被问及熟悉哪些设计模式?时的应答技巧和注意事项,需要的朋友参考一下 按照自己的实际情况回答,当然是越多越好。比如我自己也就熟悉个单例模式。

  • 本文向大家介绍请说说你了解的设计模式有哪些?相关面试题,主要包含被问及请说说你了解的设计模式有哪些?时的应答技巧和注意事项,需要的朋友参考一下 1、单例模式 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。保证一个类仅有一个实例,并提供一个该实例的全局访问点。 (1)经典模式--单线程 对于线程来说不安全;但在单线程中已满足要求。

  • 我是设计模式领域的新手,我正在尝试了解其中的诀窍。我曾多次听到人们使用的“工厂”或“工厂模式”,但当我开始学习设计模式(目前我正在读GoF的书)时,我了解到实际上并不存在“工厂设计模式”这样的东西。GoF这本书描述了两种与工厂相关的模式:“抽象工厂”和“工厂方法”。 所以我的问题是这样的--当人们只说“工厂”(没有添加任何其他东西)时,他们实际上指的是哪种设计模式? 我找到了两个关于这件事的消息来

  • 各大设计模式例子参考:CSDN专栏 . C++ 设计模式 系列博文 设计模式工程目录 单例模式 单例模式例子 抽象工厂模式 抽象工厂模式例子 适配器模式 适配器模式例子 桥接模式 桥接模式例子 观察者模式 观察者模式例子 设计模式的六大原则 单一职责原则(SRP,Single Responsibility Principle) 里氏替换原则(LSP,Liskov Substitution Prin

  • 一、概述 二、创建型 1. 单例(Singleton) 2. 简单工厂(Simple Factory) 3. 工厂方法(Factory Method) 4. 抽象工厂(Abstract Factory) 5. 生成器(Builder) 6. 原型模式(Prototype) 三、行为型 1. 责任链(Chain Of Responsibility) 2. 命令(Command) 3. 解释器(Int