Struts2 从Struts操作类中删除XML元素的硬编码

Struts2 从Struts操作类中删除XML元素的硬编码,struts2,velocity,Struts2,Velocity,在我的应用程序中,我使用的是struts 2。我们正在使用jQuery发送一个AJAX调用。我正在Struts2Action类中格式化XML数据,并将其作为对AJAX请求的XML响应发送。我在struts中格式化XML数据的操作与此类似: <person> <age> </age> <city> </city> </person> 我想要的是将这些XML数据移动到一个单独的XML文件中。有人告诉我

在我的应用程序中,我使用的是struts 2。我们正在使用jQuery发送一个AJAX调用。我正在Struts2Action类中格式化XML数据,并将其作为对AJAX请求的XML响应发送。我在struts中格式化XML数据的操作与此类似:

<person>
  <age>

  </age>

  <city>

  </city>
</person>


我想要的是将这些XML数据移动到一个单独的XML文件中。有人告诉我,我们可以使用Velocity动态创建XML。有人能帮我吗?一个示例代码将不胜感激。谢谢

您有很多选择。首先,可以使用JSP输出XML。为此,只需按如下方式启动JSP:

<?xml version="1.0" encoding="UTF-8"?>
<%@ page contentType="text/xml;charset=UTF-8" language="java" %>

此外,还可以使用模板语言,如Velocity或Freemarker

最后,对于一种不同的方法,您可以使用XML流API(
javax.XML.stream
package),它允许您以编程方式构建XML


如果您已经在视图层中使用JSP,那么将JSP用于XML输出可能是最简单的方法。否则,我建议您查看流式API。Velocity和Freemarker都是很好的模板语言,但我个人不会仅在生成XML时使用它们,特别是当您使用其他工具生成HTML时。

以下是如何使用工具初始化和使用Velocity的快速快照:

//init velocity
VelocityEngine velocity = new VelocityEngine();
velocity.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, "/path/to/templates/dir/");
velocity.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_CACHE, true);
velocity.init();

//init tools
ToolManager velocityToolManager = new ToolManager();
velocityToolManager.configure("velocity-tools.xml");

//get template
Template template = velocity.getTemplate("demo.vm"); //contains ${msg}

//create context
VelocityContext context = new VelocityContext(velocityToolManager.createContext());

//pass data do context
context.put("msg", "Hello from Velocity");

//process template
StringWriter sw = new StringWriter();
template.merge(context, sw);

//parsed template as a string
String parsedTemplate = sw.toString();

我添加了velocity标记,因为您特别提到了这项技术,但是您可以使用很多选项。我已经在ajax回调函数中读回了xml数据,因此如果我不想将硬编码的xml数据放在action类中,我还能把它放在哪里,然后如何在ajax回调函数中读取它?请建议。