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日

相关文章

  • Spring mvc Controller和RestFul原理解析

    下面是关于Spring MVC Controller和RestFul的原理解析,包含两个示例说明。 Spring MVC Controller和RestFul原理解析 Spring MVC是一个流行的Java Web框架,它可以帮助我们快速构建Web应用程序。在Spring MVC中,Controller是一个重要的组件,它用于处理请求并返回响应。在本文中,…

    Java 2023年5月17日
    00
  • SpringBoot使用freemarker导出word文件方法详解

    SpringBoot使用freemarker导出word文件方法详解 在SpringBoot框架中,使用freemarker库可以轻松地将数据和模板结合起来生成各种文件类型。其中,导出word文件是一个常见的需求,本文将详细介绍SpringBoot如何使用freemarker导出word文件。 步骤一:添加依赖 首先,在pom.xml文件中添加freemar…

    Java 2023年5月20日
    00
  • Java Arrays.sort()用法详解

    Java Arrays.sort()用法详解 Arrays.sort()是Java中的一个标准库函数,用于对数组进行排序,它可以对任何类型的数组进行排序(例如,整型、浮点数、字符串等等),本文将对该函数的用法进行详解。 语法 Arrays.sort(array, [fromIndex], [toIndex], [comparator]) array 参数是要…

    Java 2023年5月26日
    00
  • 四种引用类型在JAVA Springboot中的使用详解

    四种引用类型在JAVA Springboot中的使用详解 在Java Springboot中,有四种引用类型:强引用、软引用、弱引用和虚引用。这些引用类型的使用非常广泛,可以帮助我们更好地管理Java应用程序中的内存。下面我们将详细讲解这四种引用类型的使用。 强引用 强引用是我们使用最广泛的一种引用类型,它是默认的引用类型。当我们在代码中创建了一个对象并且将…

    Java 2023年5月19日
    00
  • JAVA如何定义构造函数过程解析

    Java中的构造函数用于创建新的对象实例,并对对象进行初始化。以下是JAVA如何定义构造函数的过程解析: 定义一个构造函数 要定义构造函数,请使用与类名称相同的名称,然后在名称后面添加括号。构造函数没有返回类型,因为它们总是返回正在创建的类的实例。 示例: public class Person { String name; // 构造函数 public P…

    Java 2023年5月26日
    00
  • 一篇文章带你复习java知识点

    一篇文章带你复习Java知识点 在本篇文章中,我们将为您提供一篇带你复习Java知识点的完整攻略。无论您是学习Java的初学者还是已有一定Java编程经验的人员,通过阅读本篇文章,您都可以全面系统的回顾Java的知识。 知识点1:Java基础语法 Java的基础语法是Java编程的基础,例如如何声明变量、如何定义方法、如何使用循环和条件语句等等。下面是一些J…

    Java 2023年5月30日
    00
  • java 反射机制详解及实例代码

    Java反射机制详解 Java反射机制是指在运行时使用Reflection API动态获取类信息、构造对象、调用方法、访问属性等。反射机制在框架开发、ORM映射、动态代理、JavaBean工具、JUnit单元测试等领域有着广泛的应用。 反射机制的特性 Java反射机制具有以下特性: 运行时类型信息:反射机制可以获取类的各种信息,例如类名、父类、接口、方法、属…

    Java 2023年5月23日
    00
  • Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)

    AngularJS提供了丰富的表单验证指令,可以轻松实现对用户输入的校验,以保证数据的准确性和完整性。 失去焦点验证 AngularJS通过ng-blur指令可以很方便地实现失去焦点时的表单验证。具体步骤如下: 在HTML表单元素上添加相应的验证指令,如ng-pattern、ng-minlength、ng-maxlength等; 添加一个提示信息的元素或指令…

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