如何通过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
相关产品推荐
相关产品推荐

