struts2自定义MVC框架

yizhihongxing

下面我将详细讲解如何自定义一个基于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日

相关文章

  • Java遍历集合方法分析(实现原理、算法性能、适用场合)

    Java遍历集合是每个Java开发者都必须学会的一个技能。它是处理集合数据的重要步骤。本文将详细讲解Java遍历集合方法的实现原理、算法性能和适用场合。 什么是Java集合 Java集合是Java语言提供的一组数据结构,用于存储数据的容器。它们是一种实用工具,可用于处理复杂的数据结构,例如列表、队列、栈、哈希表等。Java集合框架是一组接口和类的集合,用于处…

    Java 2023年5月19日
    00
  • 详解IDEA用maven创建springMVC项目和配置

    以下是关于“详解IDEA用Maven创建SpringMVC项目和配置”的完整攻略,其中包含两个示例。 详解IDEA用Maven创建SpringMVC项目和配置 在使用SpringMVC框架开发Web应用程序时,使用Maven构建项目是一个非常好的选择。本文将介绍如何使用Maven和IDEA创建SpringMVC项目,并配置相关依赖和插件。 创建Maven项目…

    Java 2023年5月16日
    00
  • Java中BigInteger用法小结

    下面我将详细讲解“Java中BigInteger用法小结”的完整攻略。 1. 什么是BigInteger BigInteger是Java中一个用于处理大整数运算的类。它可以处理任意大的整数,而不会受到计算机内存的限制,因此在处理大数时非常方便实用。 2. BigInteger类的常用方法 下面是BigInteger类的一些常用方法: 2.1 创建BigInt…

    Java 2023年5月26日
    00
  • Java Calendar日历类原理及使用方法

    Java Calendar日历类原理及使用方法 一、Calendar类概述 Java中Calendar类是一个抽象类,提供了实现万年历、农历等复杂功能的方法,是日期时间处理的重要类。Calendar类是Java中的日历系统,可以根据用户区域/语言环境使用各种日历系统,比如中国农历或世界其他国家的日历系统,也可以将实际日期与用户预期日期的偏差(时间偏移)合理地…

    Java 2023年5月20日
    00
  • SpringSecurity从数据库中获取用户信息进行验证的案例详解

    下面将为您详细讲解Spring Security从数据库中获取用户信息进行验证的攻略。 什么是Spring Security Spring Security是一个功能强大、可高度定制的认证和授权框架,可用于保护基于Spring的Java应用程序。它提供了基于角色、用户和访问级别的身份验证和授权,以及多种身份验证选项,包括基本身份验证、OAuth和JWT等。 …

    Java 2023年5月20日
    00
  • java基于servlet的文件异步上传

    Java基于Servlet的文件异步上传是一种常见的Web开发技术,本文将详细讲解其完整攻略,包括前台页面设计、后端代码编写及实现文件上传效果的示例代码。 1. 前台页面设计 在前台设计中,需要使用HTML、JavaScript和CSS完成文件上传页面。其中,HTML中主要包括file组件、上传按钮、进度条等,JavaScript控制上传进度和上传结果,CS…

    Java 2023年5月19日
    00
  • 通过idea创建Spring Boot项目并配置启动过程图解

    下面我来详细讲解如何通过idea创建SpringBoot项目并配置启动过程图解。 1. 创建SpringBoot项目 首先打开idea,点击菜单中的File -> New -> Project,在弹出的窗口中选择Spring Initializr,然后填写项目信息: Group:项目所在组织的groupId; Artifact:项目的名字,对应于…

    Java 2023年5月15日
    00
  • Mybatis中的常用OGNL表达式

    Mybatis是一个支持OGNL表达式的Java持久层框架,OGNL表达式在Mybatis中十分常用,可以对语句中的参数进行处理和转换,使得SQL语句的灵活性更高,同时也可以更好地利用数据库的性能。 1. OGNL表达式概览 OGNL表达式是一个对象图导航语言,用于访问Java对象的属性和方法。OGNL表达式可以用于动态SQL语句中的查询条件、属性映射、对象…

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