0

我正在开发 Liferay portlet。portlet 应该从与 Liferay 相同的服务器加载 xml 文件,然后通过 ajax 解析此 xml 并将这些值传递给 jQuery。我从 html 文件开始仅测试功能。到目前为止一切正常,但是当我将 html 和 js 代码放入 portlet 时,jQuery 可以工作,但我无法加载文件。我想让 xml 文件位于 /etc/config_files/settings.xml

这是 jQuery 我的脚本的一部分

function getToolContent(tool){
     var layer = '.links_' + tool.toLowerCase();
     $(layer).text("");

     $.ajax({
        type:"GET",
        url: "/etc/config_files/settings.xml",
        dataType: "xml",
        success: function(xml){
               $(xml).find("tool").each(function() {              
                   if($(this).find('section').text() == tool){
                     var title = $(this).find('title').text();
                     var text = $(this).find('text').text();

                     $(this).find("link").each(function() {
                        var label = $(this).find('label').text();
                        var referer = $(this).find('referer').text();

                        $(layer).append('<a href="' + referer + '" class="formatted_link" alt="'+ tool + ' link">'+ label +'</a><br>'); 
                     });
                     $("#text").html('<h2>'+ title + '</h2>' +'\n'+ text);

                   }
               });
           }
     });
  }

这是xml文件的示例

<?xml version="1.0" encoding="UTF-8"?>
<descriptions>
   <tool>
      <section>TOOL NAME</section>
      <title>TOOL TITLE</title>
      <text>
         <![CDATA[ 
         <ul>
            <li>FEATURE 1</li>
            <li>FEATURE 2</li>
            <li>FEATURE 3</li>
         </ul>
         ]]>
      </text>
      <links>
         <link>
            <label>TOOL LINK LABEL 1</label>
            <referer>https://mytool1.com/</referer>
         </link>
         <link>
            <label>TOOL LINK LABEL 2</label>
            <referer>https://mytool2.com/</referer>
         </link>
      </links>
   </tool>
   <tool>
      ...
   </tool>
</descriptions>

只是我无法从 settings.xml 获取数据

-感谢帮助

4

2 回答 2

1

如果我在 portlet 中有 xml,那么这会有所帮助:

 $.ajax({
            type:"GET",
            url: "<%= request.getContextPath()%>/js/settings.xml",
            dataType: "xml",
 ...

settings.xml 在 $PORTLET-DIR/docroot/js/

我尝试从服务器的任何位置加载 xml 时的第二种情况

@Override
public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException {
    response.setContentType("application/xml;charset=UTF-8");
    response.getPortletOutputStream().write("http://mydomain.com/settings.xml");
}

我收到此日食错误消息

Multiple markers at this line
    - The method write(int) in the type OutputStream is not applicable for the arguments 
     (String)
    - url cannot be resolved to a variable

我希望能够从与 Liferay 相同的服务器读取 xml,或者,如果可能的话,从不同的服务器读取它

谢谢

于 2012-08-16T06:40:15.097 回答
0

解决方案 #1:从 portlet 上下文中获取资源

settings.xml$PORTLET-DIR/docroot/etc/config_files/settings.xml. 现在settings.xml 存在于portlet cotentx 中,您可以直接从jsp 中获取它。例如使用 Liferay <%=request.getServletContext()%>jsp-tag:

...
$.ajax({
       type:"GET",
       url: "<%=request.getServletContext()%>etc/config_files/settings.xml",
...

解决方案 #2:通过 portlet ResourceURL 从任何地方获取资源

创建 Liferay MVC-Portlet。放入 portletserveResource(...)方法,例如:

@Override
public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException {
    response.setContentType("application/xml;charset=UTF-8");
    response.getPortletOutputStream().write(... your settings.xml ...);
    ...
}

创建包含您的 javascript 和 resourceURL 的 jsp 文件,例如:

<%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
...
<liferay-portlet:resourceURL var="url" id="myid" />

...
$.ajax({
           type:"GET",
           url: "${url}",
...
于 2012-08-15T09:46:21.547 回答