struts2自定义MVC框架

下面我将详细讲解如何自定义一个基于Struts2的MVC框架。

1. 确定项目结构

首先,在项目中,我们需要有一个Controller类来处理请求,并调用对应的Service处理业务逻辑。同时,还要有一个View类负责页面的展示。在这里,我们可以采用MVC的经典分层结构,将不同的代码放在不同的包中:

com.example.framework.mvc
├─ controller
│   ├─ BaseAction.java
│   └─ UserController.java
│
├─ model
│   └─ User.java
│
├─ service
│   ├─ BaseService.java
│   └─ UserService.java
│
├─ view
│   ├─ BaseView.java
│   └─ UserView.java
│
├─ util
│   └─ AppUtil.java
│
└─ App.java

2. 定义MVC核心类

接下来,我们需要定义MVC的核心类,包括Action、View和Service。这里我们先定义一个BaseAction基类,包含常用的请求参数和方法,然后再定义一个UserController类,继承自BaseAction。

package com.example.framework.mvc.controller;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * MVC框架基类
 */
public class BaseAction extends ActionSupport {

    protected HttpServletRequest getRequest() {
        return ServletActionContext.getRequest();
    }

    protected HttpServletResponse getResponse() {
        return ServletActionContext.getResponse();
    }

    protected void write(String text) {
        PrintWriter out = null;
        try {
            out = getResponse().getWriter();
            out.write(text);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
        }
    }
}

然后我们再定义一个UserController类,负责处理关于用户的请求。在该类中,我们需要实现execute方法,并调用对应的Service处理业务逻辑。

package com.example.framework.mvc.controller;

import com.example.framework.mvc.model.User;
import com.example.framework.mvc.service.UserService;
import com.example.framework.mvc.view.UserView;

import java.util.List;

/**
 * 用户Controller类
 */
public class UserController extends BaseAction {

    private UserService userService;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    @Override
    public String execute() throws Exception {
        List<User> userList = this.userService.getUserList();
        UserView view = new UserView(userList);
        String output = view.render();
        write(output);
        return null;
    }
}

3. 定义Service层

接下来,我们需要定义Service层,负责处理业务逻辑。在这里,我们定义一个BaseService基类,并在其子类UserService中实现获取用户列表的方法。

package com.example.framework.mvc.service;

import java.util.List;

/**
 * MVC框架基础Service
 */
public class BaseService {

}

package com.example.framework.mvc.service;

import com.example.framework.mvc.model.User;

import java.util.ArrayList;
import java.util.List;

/**
 * 用户Service
 */
public class UserService extends BaseService {

    public List<User> getUserList() {
        List<User> userList = new ArrayList<>();
        userList.add(new User(1, "张三", 20));
        userList.add(new User(2, "李四", 22));
        userList.add(new User(3, "王五", 25));
        return userList;
    }
}

4. 定义View层

最后,我们需要定义View层,负责展示页面。在这里,我们定义一个BaseView基类,并在其子类UserView中实现模板渲染的方法。

package com.example.framework.mvc.view;

/**
 * MVC框架基础View
 */
public class BaseView {

    protected String template = "";

    public BaseView(String template) {
        this.template = template;
    }

    public String render() {
        // 解析模板
        String html = parse();

        // 渲染页面
        return html;
    }

    protected String parse() {
        // 解析模板
        return "";
    }
}
package com.example.framework.mvc.view;

import com.example.framework.mvc.model.User;

import java.util.List;

/**
 * 用户View
 */
public class UserView extends BaseView {

    private List<User> userList;

    public UserView(List<User> userList) {
        super("<html><body>{{for user in users}}<p>{{user.name}},{{user.age}}</p>{{endfor}}</body></html>");
        this.userList = userList;
    }

    @Override
    protected String parse() {
        // 替换模板中的变量
        String html = template.replace("{{for user in users}}", "");
        for (User user : userList) {
            html += template.replace("{{user.name}}", user.getName())
                    .replace("{{user.age}}", String.valueOf(user.getAge()));
        }
        html += template.replace("{{endfor}}", "");
        return html;
    }
}

5. 搭建框架并运行示例

最后,我们需要搭建整个框架,并运行一个示例。

在这里,我们可以采用Maven构建,配置好pom文件后就能快速构建整个工程。具体的步骤可以参考Apache Maven官网,这里不过多赘述。

在运行示例前,我们还需要在工程中加入Struts2的相关依赖,这里以Struts2 2.5.22版本为例。在pom.xml中加入以下相关依赖:

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.5.22</version>
</dependency>

然后编写配置文件struts.xml,配置请求路由规则:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="users" class="com.example.framework.mvc.controller.UserController">
            <result type="plainText"></result>
        </action>
    </package>
</struts>

最后,在main方法中初始化MVC框架,并启动服务:

package com.example.framework.mvc;

import com.example.framework.mvc.controller.UserController;
import com.example.framework.mvc.service.UserService;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.DispatcherListener;
import org.apache.struts2.dispatcher.ng.ServletContextHostConfig;

import java.util.ArrayList;
import java.util.List;

public class App {

    public static void main(String[] args) throws Exception {
        Dispatcher dispatcher = createDispatcher();
        dispatcher.init();
    }

    private static Dispatcher createDispatcher() {
        Dispatcher dispatcher = new Dispatcher(new ServletContextHostConfig());
        List<DispatcherListener> listeners = new ArrayList<>();
        listeners.add(new com.opensymphony.xwork2.util.log.LoggerFactory());
        dispatcher.setListeners(listeners);
        dispatcher.setActionConfigPath("/");
        return dispatcher;
    }
}

至此,我们已完成了自定义的Struts2 MVC框架的搭建。我们可以启动服务了,通过http://localhost:8080/users进行访问。

运行示例后页面将会展示以下内容:

张三,20
李四,22
王五,25

在这个示例中,我们通过自定义MVC框架,实现了获取用户列表并展示在页面上的功能。同时,我们还实现了视图层和业务逻辑层的分离,提高了代码的可维护性和可扩展性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2自定义MVC框架 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Struts1简介和入门_动力节点Java学院整理

    Struts1简介和入门攻略 什么是Struts1 Struts1是一个基于MVC设计模式的开源Web应用框架,可以快速构建基于Java EE的Web应用程序。它的主要组成部分包括Action、Form、Configuration、RequestProcessor等。 Struts1的优点 开源免费,社区支持活跃 遵循MVC设计模式,易于维护和扩展 可以快速…

    Java 2023年5月20日
    00
  • Mybatis和Mybatis-Plus时间范围查询方式

    Mybatis是Java中用于持久层操作的开源框架,而Mybatis-Plus是在Mybatis的基础上进行二次封装,提供了更方便快捷的操作方式。本文将详细讲解Mybatis和Mybatis-Plus时间范围查询的方式和实现方法。 Mybatis时间范围查询方式 在Mybatis中,时间范围查询可以通过两种方式实现: 方式一:通过${}占位符实现 在Myba…

    Java 2023年5月27日
    00
  • SpringMVC整合SSM实现异常处理器详解

    SpringMVC整合SSM实现异常处理器详解 在 Web 应用程序开发中,异常处理是一个非常重要的问题。如果我们不处理异常,那么当应用程序出现异常时,用户将会看到一个不友好的错误页面,这会影响用户体验。因此,我们需要在应用程序中实现异常处理器,以便更好地管理和维护应用程序。本文将详细讲解 SpringMVC 整合 SSM 实现异常处理器的完整攻略,包括异常…

    Java 2023年5月18日
    00
  • Java实现多文件压缩打包的方法

    当我们需要将一个大型项目的多个文件打包压缩成一个文件时,Java 提供了一些方法用于实现压缩和解压缩操作。为了实现多文件压缩打包,我们将会使用 Java 的 ZIP 压缩工具,用于将多个文件打包压缩成一个 ZIP 文件。 下面是实现多文件压缩打包的完整攻略: 1. 引入依赖 Java 自带了 ZIP 文件的压缩和解压缩类库,我们只需要引入 Java 标准类库…

    Java 2023年5月19日
    00
  • springboot maven 打包插件介绍及注意事项说明

    Spring Boot Maven打包插件介绍 Spring Boot使用了Maven作为构建工具,通过Maven进行项目的编译、依赖管理和打包部署等操作,其中Maven的打包插件在Spring Boot中有着非常重要的作用。 Maven的打包插件主要用于将项目打成可执行的JAR或WAR包,Spring Boot将其进一步封装为了一些特定的插件,以适应Spr…

    Java 2023年6月2日
    00
  • Java之如何关闭流

    关闭流是Java程序中常见的操作之一,它能够避免资源的浪费与泄漏。接下来,我将为您详细讲解关闭流的完整攻略。 为什么要关闭流 Java程序中使用流来读取和写入数据,如果我们没有正确关闭流,那么会出现以下两种问题: 资源浪费:流对象占用系统资源,如果没有关闭流,那么这些资源就一直被占用,导致资源浪费,可能会影响其它程序的执行。 资源泄漏:如果没有关闭流,那么流…

    Java 2023年5月26日
    00
  • Java Apache Commons报错“ZipException”的原因与解决方法

    “ZipException”是Java的Apache Commons类库中的一个异常,通常由以下原因之一引起: 压缩文件错误:如果压缩文件存在错误,则可能会出现此异常。例如,可能会使用错误的压缩文件格式或压缩文件已损坏。 文件路径错误:如果文件路径错误,则可能会出现此异常。例如,可能会使用错误的文件路径或文件不存在。 以下是两个实例: 例1 如果压缩文件存在…

    Java 2023年5月5日
    00
  • FCKeditor2.3 For PHP 详细整理的使用参考

    FCKeditor2.3 For PHP 详细整理的使用参考 FCKeditor是一款用于Web浏览器的HTML文本编辑器。FCKeditor2.3是FCKeditor的一个旧版本,针对PHP进行了整理和优化,可以方便地在PHP网站中使用。接下来,我们将详细介绍如何使用FCKeditor2.3。 安装FCKeditor2.3 你可以从FCKeditor官网下…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部