【问题标题】:Load file from server to Liferay portlet将文件从服务器加载到 Liferay portlet
【发布时间】:2012-08-15 07:46:10
【问题描述】:

我正在开发 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 中获取数据

-感谢您的帮助

【问题讨论】:

  • 您的应用服务器可以访问 /etc/config_files/settings.xml 吗?如果那是 /etc 在您的文件系统的根目录,那么我怀疑您无法访问它。

标签: jquery xml ajax parsing liferay


【解决方案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");
}

我收到这个 Eclipse 错误消息

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,或者,如果可能,从不同的服务器读取它

谢谢

【讨论】:

    【解决方案2】:

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

    settings.xml 放入$PORTLET-DIR/docroot/etc/config_files/settings.xml。现在 settings.xml 已存在于 portlet cotentx 中,您可以直接从 jsp 中获取它。例如。与 Liferay &lt;%=request.getServletContext()%&gt; jsp-tag:

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

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

    创建 Liferay MVC-Portlet。把serveResource(...)方法放到portlet中,比如:

    @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}",
    ...
    

    【讨论】:

    • 在您的第一个解决方案中不起作用:它不是当前的 servletContext,而是一些保证对于 此 portlet 唯一的东西。而是 可以完成这项工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多