JSP / Liferay的Jquery进度条实现

时间:2011-08-16 00:44:39

标签: java jquery jsp liferay

我对JSP / Liferay portlet开发很新,我正在尝试使用jQuery添加进度条,我发现this question但是对于如何使用AJAX完成它并不是非常具体。 / p>

我想知道是否有人能指出我正确的方向来帮助我开始。

感谢。

编辑:

我使用了JSON simple,并设法进行了一些更改但是我收到了一个错误的请求(使用火灾时出现错误代码400)和我的JS上找不到404

下面是我的代码:

public void processAction(
        ActionRequest actionRequest, ActionResponse actionResponse)
    throws IOException, PortletException {

//some code here


    this.generateJSON(actionRequest, actionResponse);//manual call the method?

 public void generateJSON(ActionRequest actionRequest, ActionResponse actionResponse)
    throws IOException, PortletException {
        try{
                        //just want to see a progress bar so do static for now...
            JSONObject obj=new JSONObject();
            obj.put("percent",new Integer(30));
            StringWriter out = new StringWriter();
            obj.writeJSONString(out);
            String jsonText = out.toString();
        }catch(Exception ex){
            System.out.print(ex);
        }
        }
    }//end of class

JS在这里

    function checkStatus(){
    $.ajax({
          type: 'POST',
          //url: '<%=request.getContextPath()%>/checkStatusServlet',
          url: '<%=request.getContextPath()%>/generateJSON',
          dataType: 'json',
          success: function( data )
          {
            alert(data.statusPercent);  
            var statusPercent = data.percent;
            //Update your jQuery progress bar   
            $( "#progressbar" ).progressbar({value: statusPercent});

          }
    });
    //below works and alert is being called...
    /*for (i=0;i<=5;i++)
    {
         $( "#progressbar" ).progressbar({value: i+10});
    }
    alert('got here');
    */
}

HTML / JSP

<%@ page import="javax.portlet.PortletPreferences" %>
<portlet:defineObjects/>
<portlet:renderURL var="resourceUrl"></portlet:renderURL>
<!-- Javascript files -->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.js"></script>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="js/main.js"></script>
<!-- end of Java script files -->
<script type="text/javascript">
    setTimeout('checkStatus()',1000);
</script>
<div id="progressbar"></div>

2 个答案:

答案 0 :(得分:2)

您无法在processAction中生成JSON。此方法旨在更改portlet状态,但不生成输出。门户网站 - 实现您需要它使用serveResource方法/生命周期阶段的方式:您从门户网站获取此URL(&lt; portlet:resourceURL /&gt;)。具体来说,你不应该自己创建它们。

另一种方法(但不是门户方式)是使用servlet - 但是在这种情况下,你没有可能需要的portlet状态。

你可能想要使用&lt; portlet:namespace /&gt;消除全局名称的歧义 - 或者使用正确的命名空间 - 因为你永远不能说你的portlet放在页面上的次数。

(为jsp-tags添加空格,以免它们被标记吃掉)

简短:阅读有关portlet的资源服务,这很可能会解决您的基本问题:使用上面提供的代码,您将无法访问您的JSON - 无论您在JS方面做什么

答案 1 :(得分:1)

答案实际上取决于您的具体需求。您是否正在尝试显示某项任务实际剩余的时间,或者页面加载的时间或内容是多少?

您可以从客户端轮询并根据要处理的内容更新浏览器中的进度条。一个简单的jQuery ajax示例:

function checkStatus
{
    $.ajax({
          type: 'POST',
          url: '<%=request.getContextPath()%>/checkStatusServlet',
          dataType: 'json',
          success: function( data )
          {
            var statusPercent = data.statusPercent;

            //Update your jQuery progress bar   
            $( "#progressbar" ).progressbar({value: statusPercent });
          }
    });
}

然后您可以简单地轮询此功能直到完成

setTimeout('checkStatus()' 1000);

当然,您还需要构造一个servlet或struts操作或portlet来处理服务器上的处理,并返回该任务的相应状态。

编辑:

使用JSON library 从您的servlet或操作。 (以下代码来自struts2动作)

public String checkStatus()
{       
    try 
    {
        Integer percentDone = 50;  //Calculate how much time is left

        JSONObject statusResult = new JSONObject();

        statusResult.put("statusPercent", percentDone);

        //Obtain HttpServletResponse.. 
        //implementation depends on your framework. 
        //PortletResponse should work too.
        PrintWriter out = this.response.getWriter();
        out.write( statusResult.toString(4) );
        out.flush();
        out.close();
    }
    catch (IOException e) {} 
    catch (JSONException e) {}

    return null;
}