解析EJB Web 工程中的 web.xml 文件,导出映射关系

  1. 读取 EJB Web 工程中的 web.xml 文件

  2. 解析其中的 <servlet><servlet-mapping> 对应关系

  3. 进一步解析 Controller 类与请求路径的对应关系

  4. 最终导出为 Excel 表格(.xlsx)

⚠️ 注意:

  • EJB Web 项目的 Controller 通常不是 Spring MVC 的 @Controller,而是 Java EE Servlet,因此解析基于 web.xml 的 servlet-name 对应 servlet-class。

  • 若你的 EJB 中使用 Spring MVC 或其他框架,请告诉我,我可调整解析逻辑。


最终实现包含以下模块

  • parseWebXml() —— 解析 web.xml

  • exportToExcel() —— 使用 Apache POI 导出 Excel

  • ControllerMapping —— 映射对象


Maven 依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.4</version>
</dependency>

映射对象

@Data
@AllArgsConstructor
public class ControllerMapping {
    private String servletName;
    private String servletClass;
    private String urlPattern;
}

解析 web.xml + 导出 Excel 的完整 Spring Service 示例

@Service
public class WebXmlService {

    /**
     * 解析 EJB 项目的 web.xml,返回 Controller 与 URL 映射列表
     */
    public List<ControllerMapping> parseWebXml(String webXmlPath) {
        List<ControllerMapping> mappings = new ArrayList<>();

        try {
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(new File(webXmlPath));
            doc.getDocumentElement().normalize();

            NodeList servletNodes = doc.getElementsByTagName("servlet");
            NodeList mappingNodes = doc.getElementsByTagName("servlet-mapping");

            Map<String, String> servletMap = new HashMap<>();        // servlet-name -> servlet-class
            Map<String, String> urlMap = new HashMap<>();            // servlet-name -> url-pattern

            // 解析 <servlet>
            for (int i = 0; i < servletNodes.getLength(); i++) {
                Element element = (Element) servletNodes.item(i);
                String name = element.getElementsByTagName("servlet-name").item(0).getTextContent();
                String clazz = element.getElementsByTagName("servlet-class").item(0).getTextContent();
                servletMap.put(name, clazz);
            }

            // 解析 <servlet-mapping>
            for (int i = 0; i < mappingNodes.getLength(); i++) {
                Element element = (Element) mappingNodes.item(i);
                String name = element.getElementsByTagName("servlet-name").item(0).getTextContent();
                String url = element.getElementsByTagName("url-pattern").item(0).getTextContent();
                urlMap.put(name, url);
            }

            // 整理映射
            for (String name : servletMap.keySet()) {
                mappings.add(new ControllerMapping(
                        name,
                        servletMap.get(name),
                        urlMap.getOrDefault(name, "N/A")
                ));
            }

        } catch (Exception e) {
            throw new RuntimeException("解析 web.xml 失败: " + e.getMessage(), e);
        }

        return mappings;
    }


    /**
     * 导出 Excel
     */
    public void exportToExcel(List<ControllerMapping> mappings, String outPath) {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("Controller Mapping");

        // Header
        Row header = sheet.createRow(0);
        header.createCell(0).setCellValue("Servlet Name");
        header.createCell(1).setCellValue("Servlet Class");
        header.createCell(2).setCellValue("URL Pattern");

        // Body
        int rowNum = 1;
        for (ControllerMapping m : mappings) {
            Row row = sheet.createRow(rowNum++);
            row.createCell(0).setCellValue(m.getServletName());
            row.createCell(1).setCellValue(m.getServletClass());
            row.createCell(2).setCellValue(m.getUrlPattern());
        }

        try (FileOutputStream out = new FileOutputStream(outPath)) {
            workbook.write(out);
        } catch (Exception e) {
            throw new RuntimeException("导出 Excel 失败: " + e.getMessage());
        }
    }
}

Spring Controller 示例(供前端调用)

@RestController
@RequestMapping("/webxml")
public class WebXmlController {

    @Autowired
    private WebXmlService webXmlService;

    @GetMapping("/export")
    public String export(@RequestParam String path) {
        List<ControllerMapping> list = webXmlService.parseWebXml(path);
        webXmlService.exportToExcel(list, "controller-mapping.xlsx");
        return "导出成功: controller-mapping.xlsx";
    }
}

✅ 输出 Excel 示例

Servlet NameServlet ClassURL Pattern
userCtrlcom.company.web.UserController/user/*
loginCtrlcom.company.web.LoginServlet/login

如你需要,我可以进一步帮助:

✅ 把解析功能扩展为扫描 Spring MVC 的 @Controller
✅ 自动读取 EJB WAR 包内部的 web.xml(无需手动路径)
✅ 输出 CSV、JSON 或直接插入数据库
✅ 生成可视化报表(HTML 页面)

需要吗?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值