AGENT SKILL

struts-to-spring

Migration guideline for transforming Apache Struts 2 applications to Spring Boot 3.x and Spring MVC.

License 许可
MIT
最近更新
2026-09-24
Stars
★ 55
Forks
15

01 前言 Front Matter

name
struts-to-spring
description
Migration guideline for transforming Apache Struts 2 applications to Spring Boot 3.x and Spring MVC.

02 资源文件 6

03 SKILL.md 正文

Struts 2 to Spring Boot 3.x Migration Guideline

Metadata

  • Source Technology: Apache Struts 2 (struts2-core)
  • Target Technology: Spring Boot 3.x with Spring MVC
  • Trigger Keywords: struts, struts2, ActionSupport, struts.xml, xwork2, opensymphony, struts-tags
  • Version: 1.0.0
  • Last Updated: 2025-01-22

Overview

This guideline provides comprehensive skills for migrating Apache Struts 2 applications to Spring Boot 3.x. Each skill addresses a specific migration concern with concrete transformation rules, examples, and validation criteria.

Skill Files

File Skills Description
SKILL-config.md migrate-maven-dependencies, create-spring-boot-application, create-application-properties Project setup and configuration
SKILL-action.md convert-action-to-controller, convert-action-properties Action to Controller conversion
SKILL-view.md convert-jsp-tags, convert-ognl-to-el, convert-result-types View layer migration
SKILL-interceptor.md convert-interceptor, convert-validation Interceptors and validation
SKILL-xml.md migrate-struts-xml, migrate-web-xml XML configuration migration
SKILL-test.md convert-test-classes, create-exception-handler Testing and exception handling

Migration Checklist

Execute skills in this order:

Phase 1: Project Setup

  1. [ ] migrate-maven-dependencies - Update pom.xml (SKILL-config.md)
  2. [ ] create-spring-boot-application - Create main class (SKILL-config.md)
  3. [ ] create-application-properties - Create configuration (SKILL-config.md)

Phase 2: Configuration Migration

  1. [ ] migrate-struts-xml - Plan controller structure (SKILL-xml.md)
  2. [ ] migrate-web-xml - Remove Struts filter (SKILL-xml.md)

Phase 3: Action Conversion

  1. [ ] convert-action-to-controller - Convert each Action class (SKILL-action.md)
  2. [ ] convert-action-properties - Handle Action properties (SKILL-action.md)

Phase 4: Cross-cutting Concerns

  1. [ ] convert-validation - Migrate validation logic (SKILL-interceptor.md)
  2. [ ] convert-interceptor - Convert interceptors (SKILL-interceptor.md)

Phase 5: View Layer

  1. [ ] convert-result-types - Handle result mappings (SKILL-view.md)
  2. [ ] convert-jsp-tags - Update JSP files (SKILL-view.md)
  3. [ ] convert-ognl-to-el - Fix expressions (SKILL-view.md)

Phase 6: Testing & Polish

  1. [ ] convert-test-classes - Update tests (SKILL-test.md)
  2. [ ] create-exception-handler - Global exception handling (SKILL-test.md)

Complete Transformation Example

Before (Struts)

HelloAction.java:

package com.example.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {
    private String name;
    private String message;
    
    public String execute() {
        if (name == null || name.isEmpty()) {
            return INPUT;
        }
        message = "Hello, " + name + "!";
        return SUCCESS;
    }
    
    public void validate() {
        if (name != null && name.length() > 50) {
            addFieldError("name", "Name too long");
        }
    }
    
    // getters and setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getMessage() { return message; }
}

struts.xml:

<action name="hello" class="com.example.action.HelloAction">
    <result name="success">/WEB-INF/jsp/hello.jsp</result>
    <result name="input">/WEB-INF/jsp/hello-form.jsp</result>
</action>

hello.jsp:

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
    <s:property value="message"/>
</body>
</html>

After (Spring Boot)

HelloForm.java:

package com.example.form;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

public class HelloForm {
    @NotBlank(message = "Name is required")
    @Size(max = 50, message = "Name too long")
    private String name;
    
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

HelloController.java:

package com.example.controller;

import com.example.form.HelloForm;
import jakarta.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class HelloController {
    
    @GetMapping("/hello")
    public String showForm(Model model) {
        model.addAttribute("helloForm", new HelloForm());
        return "hello-form";
    }
    
    @PostMapping("/hello")
    public String execute(@Valid @ModelAttribute HelloForm form,
                         BindingResult result,
                         Model model) {
        if (result.hasErrors()) {
            return "hello-form";
        }
        String message = "Hello, " + form.getName() + "!";
        model.addAttribute("message", message);
        return "hello";
    }
}

hello.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
    ${message}
</body>
</html>

Application.java:

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

application.properties:

server.port=8080
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

04 同仓库更多 Skills

microsoft
microsoft/github-copilot-modernization

verify-test-baseline

Generate and run post-migration tests from the frozen baseline specification.

测试与质量
★ 55
microsoft
microsoft/github-copilot-modernization

team-request

How team members request infrastructure connection info and handle secrets in team mode

★ 55
microsoft
microsoft/github-copilot-modernization

team-charters

Provides role charters (mission, ownership, core principles, quality bar) for a multi-agent coding team. Each charter defines the role's mission, ownership scope, core principle (boundary constraints), and quality bar. Most roles also include communication rules. Consumed by the coordinator during task decomposition to assign work to the correct role. Triggers: "look up role charter", "what does the architect own", "check role boundaries", "find team roles", "which role handles X", "list agent charters", "role responsibilities". NOT for: task decomposition (use breaking-down-tasks), implementation (use implementing-code), architecture analysis (use analyzing-architecture).

★ 55
microsoft
microsoft/github-copilot-modernization

spring-boot-scaffolding

Reference guide for creating a new Spring Boot project during rewrite migration.

★ 55
microsoft
microsoft/github-copilot-modernization

sharing-learnings

How to record project learnings so that later-phase workers and future agent runs can consume them.

★ 55
microsoft
microsoft/github-copilot-modernization

setting-up-constitution

Creates or updates the project constitution that defines migration principles, constraints, and conventions. Triggers: "set up constitution", "define migration principles", "create project rules", "establish conventions", "establish migration constitution". NOT for: implementation, implementation planning, task generation.

★ 55