You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Jersey接收用户上传XML文件并返回HTML视图?

使用Jersey实现XML上传并返回HTML视图的方案

没问题,我帮你梳理一下用Jersey实现这个需求的完整步骤,亲测可行~整体思路就是:接收用户上传的XML文件 → 解析XML内容为Java对象 → 把这些数据渲染成HTML返回给用户。

一、先搞定项目依赖

首先得确保你的项目里引入了Jersey的必要依赖,如果你用Maven的话,把下面这些依赖加到pom.xml里:

<dependencies>
    <!-- Jersey Core -->
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.35</version>
    </dependency>
    <!-- 处理文件上传的Multipart支持 -->
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.35</version>
    </dependency>
    <!-- JAXB用于解析XML -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.1</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

二、编写文件上传的REST接口

创建一个Jersey的Resource类,用来处理文件上传请求。这里要注意配置MultipartFeature,不然没法处理文件上传。

1. 配置MultipartFeature

在你的Jersey配置类(或者web.xml里)注册MultipartFeature:

import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;

public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        // 注册你的Resource类
        register(XmlToHtmlResource.class);
        // 注册MultipartFeature
        register(MultiPartFeature.class);
    }
}

2. 编写上传接口类

import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.io.InputStream;

@Path("/xml-to-html")
public class XmlToHtmlResource {

    @POST
    @Path("/upload")
    @Produces(MediaType.TEXT_HTML)
    public String uploadXml(
            @FormDataParam("xmlFile") InputStream inputStream,
            @FormDataParam("xmlFile") FormDataContentDisposition fileDisposition) {
        
        try {
            // 1. 解析XML为Java对象
            DocumentData documentData = XmlParser.parseXml(inputStream);
            
            // 2. 生成HTML内容
            return HtmlGenerator.generateHtml(documentData);
            
        } catch (Exception e) {
            return "<html><body><h2>处理失败:" + e.getMessage() + "</h2></body></html>";
        }
    }
}

三、解析XML的工具类(基于JAXB)

首先得根据你的XML结构创建对应的实体类,这样JAXB才能把XML转换成Java对象。

1. 实体类定义

import javax.xml.bind.annotation.*;
import java.util.List;

@XmlRootElement(name = "DocumentData")
@XmlAccessorType(XmlAccessType.FIELD)
public class DocumentData {
    @XmlElement(name = "GeneralInformation")
    private GeneralInformation generalInformation;
    
    @XmlElement(name = "row")
    private List<Row> rows;

    // getter和setter方法
    public GeneralInformation getGeneralInformation() { return generalInformation; }
    public void setGeneralInformation(GeneralInformation generalInformation) { this.generalInformation = generalInformation; }
    public List<Row> getRows() { return rows; }
    public void setRows(List<Row> rows) { this.rows = rows; }
}

@XmlAccessorType(XmlAccessType.FIELD)
public class GeneralInformation {
    @XmlAttribute(name = "ExcelNumber")
    private String excelNumber;
    
    @XmlAttribute(name = "ExcelName")
    private String excelName;
    
    @XmlAttribute(name = "UplodedByUser")
    private String uploadedByUser;
    
    @XmlAttribute(name = "UserId")
    private String userId;

    // getter和setter方法
    public String getExcelNumber() { return excelNumber; }
    public void setExcelNumber(String excelNumber) { this.excelNumber = excelNumber; }
    public String getExcelName() { return excelName; }
    public void setExcelName(String excelName) { this.excelName = excelName; }
    public String getUploadedByUser() { return uploadedByUser; }
    public void setUploadedByUser(String uploadedByUser) { this.uploadedByUser = uploadedByUser; }
    public String getUserId() { return userId; }
    public void setUserId(String userId) { this.userId = userId; }
}

@XmlAccessorType(XmlAccessType.FIELD)
public class Row {
    @XmlAttribute(name = "CarName")
    private String carName;
    
    @XmlAttribute(name = "CarCode")
    private String carCode;
    
    @XmlAttribute(name = "Engine")
    private String engine;

    // getter和setter方法
    public String getCarName() { return carName; }
    public void setCarName(String carName) { this.carName = carName; }
    public String getCarCode() { return carCode; }
    public void setCarCode(String carCode) { this.carCode = carCode; }
    public String getEngine() { return engine; }
    public void setEngine(String engine) { this.engine = engine; }
}

2. XML解析工具类

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.InputStream;

public class XmlParser {
    public static DocumentData parseXml(InputStream inputStream) throws Exception {
        JAXBContext context = JAXBContext.newInstance(DocumentData.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        return (DocumentData) unmarshaller.unmarshal(inputStream);
    }
}

四、生成HTML的工具类

这里我们用简单的字符串拼接来生成HTML,如果你需要更复杂的样式,可以加CSS或者用模板引擎(比如Thymeleaf)来优化。

public class HtmlGenerator {
    public static String generateHtml(DocumentData documentData) {
        StringBuilder htmlBuilder = new StringBuilder();
        
        // HTML头部
        htmlBuilder.append("<html><head><title>XML转HTML视图</title>");
        htmlBuilder.append("<style>table {border-collapse: collapse; width: 80%; margin: 20px auto;}");
        htmlBuilder.append("th, td {border: 1px solid #ddd; padding: 8px; text-align: left;}");
        htmlBuilder.append("th {background-color: #f2f2f2;}");
        htmlBuilder.append(".info {margin: 20px; padding: 15px; background-color: #f9f9f9; border-radius: 5px;}</style>");
        htmlBuilder.append("</head><body>");
        
        // 展示GeneralInformation
        GeneralInformation info = documentData.getGeneralInformation();
        htmlBuilder.append("<div class='info'>");
        htmlBuilder.append("<h3>文档基本信息</h3>");
        htmlBuilder.append("<p>Excel编号: ").append(info.getExcelNumber()).append("</p>");
        htmlBuilder.append("<p>Excel名称: ").append(info.getExcelName()).append("</p>");
        htmlBuilder.append("<p>上传用户: ").append(info.getUploadedByUser()).append("</p>");
        htmlBuilder.append("<p>用户ID: ").append(info.getUserId()).append("</p>");
        htmlBuilder.append("</div>");
        
        // 展示车辆信息表格
        htmlBuilder.append("<h3 style='text-align: center;'>车辆列表</h3>");
        htmlBuilder.append("<table>");
        htmlBuilder.append("<tr><th>车辆名称</th><th>车辆编码</th><th>引擎类型</th></tr>");
        
        for (Row row : documentData.getRows()) {
            htmlBuilder.append("<tr>");
            htmlBuilder.append("<td>").append(row.getCarName()).append("</td>");
            htmlBuilder.append("<td>").append(row.getCarCode()).append("</td>");
            htmlBuilder.append("<td>").append(row.getEngine()).append("</td>");
            htmlBuilder.append("</tr>");
        }
        
        htmlBuilder.append("</table></body></html>");
        
        return htmlBuilder.toString();
    }
}

五、测试接口

你可以用Postman或者curl来测试这个接口:

  • 请求方式:POST
  • 请求地址:http://localhost:8080/your-project-name/xml-to-html/upload
  • 请求类型:multipart/form-data
  • 表单参数名:xmlFile,选择你本地的XML文件上传

上传你提供的示例XML:

return (<DocumentData> 
<GeneralInformation ExcelNumber="107" ExcelName="Car107" UplodedByUser="Super@12" UserId="637" /> 
)

发送请求后,就能看到格式化好的HTML页面啦~

内容的提问来源于stack exchange,提问作者Pankaj Dagar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:55:17