将大量数据从javascript传递到java函数

时间:2014-07-25 13:39:13

标签: java javascript jtextpane htmleditorkit

我在java中开发了一个htmleditor。现在我已经在我的网站上安装了这个applet来格式化来自数据库的数据。我的问题是我从javascript调用java函数,当我传递少量文本时到我的java函数callPanelToSetText(String data)它正确设置了jtextpane。但是当我传递大量文本时,applet挂起并且不显示jtextpane中的文本。

  <head>
    <title>Test page for launching the applet via JNLP</title>
</head>
<body>
    <h3>Test page for launching the applet via JNLP</h3>
    <script src="http://java.com/js/deployJava.js"></script>
    <script>
        var attributes = {

             code:       "researchtexteditor.EditorApplet",
            archive:    "ResearchHTMLEditor.jar, lib/jortho.jar",
            width:      600,
            height:     600,
              id:  'EditorValue'

        };
        var parameters = {jnlp_href:"launch.jnlp"}; <!-- Applet Parameters -->
        var version = "1.7"; <!-- Required Java Version -->
        deployJava.runApplet(attributes, parameters, version);
    </script>
    <!-- Or use the following applet element to launch the applet using jnlp_href -->
    <!--
    <applet width="300" height="300">
        <param name="jnlp_href" value="launch.jnlp"/>
    </applet>
    -->
</body>
  <p><a href="javascript:enterNums();">Launch Example</a></p>
<p><a href="javascript:enterNums_get();">Launch Example1</a></p>
</html>
<script language="javascript">
function enterNums(){
  var content='<?php echo $row['rep_contents'];?>';
   alert(content);
//document.write('Value from Jtextpane 11 '+content);
   EditorValue.callPanelToSetText(content);

 }
    function enterNums_get(){
   var TextVal=EditorValue.getTextData();

   document.write('Value from Jtextpane '+TextVal);
  } 

 <!-- ... -->

\

   Function callPanelToSetText(String value) from java is as below

    public static void callPanelToSetText(String value)
    {
           try {

                 SimpleAttributeSet attr=new SimpleAttributeSet();
                  StyleConstants.setFontFamily(attr,"Arial");
                        StyleConstants.setFontSize(attr,13);
                          StyleConstants.setForeground(attr,Color.BLACK);
                         StyleConstants.setBold(attr,false); 
                            StyleConstants.setItalic(attr,false); 
   editorPanel1.htmlDoc.insertString(editorPanel1.htmlDoc.getLength(),value,attr);
           } catch (BadLocationException ex) {
               Logger.getLogger(EditorApplet.class.getName()).log(Level.SEVERE, null, ex);
           }

    }

 The text that i wish to set on jtextpane is 

   String val="CHAPTER 1    INTRODUCTION    13\n" +
      "1.1  Report Description  13\n" +
      "1.2  Reason for doing the study  14\n" +
      "1.3  Key Benefits    14\n" +
      "1.4  Key Market Segments 15\n" +
      "1.5  Key Audiences   15\n" +
      "1.6  Research Methodology    15\n" +
      "1.6.1    Secondary research  16\n" +
      "1.6.2    Primary research    16\n" +
      "1.6.3    Analyst tools and models    18\n" +
      "CHAPTER 2    EXECUTIVE SUMMARY   19\n" +
      "2.1  Market beyond: what to expect by 2025   22\n" +
      "2.1.1    Moderate growth scenario    22\n" +
      "2.1.2    Rapid growth scenario   24\n" +
      "2.1.3    Diminishing growth scenario 26\n" +
      "CHAPTER 3    MARKET OVERVIEW 29\n" +
      "3.1  Market Definition and Scope 29\n" +
      "3.2  Key findings    30\n" +
      "3.2.1    Top Factors Impacting transparent conductive films market   30\n" +
      "3.2.1.1  Rising adoption of touch UI devices 30\n" +
      "3.2.1.2  Declining cost of smartphones   30\n" +
      "3.2.1.3  Low power consumption   30\n" +
      "3.2.1.4  Minimal reflection  30\n" +
      "3.2.1.5  Thinness    31\n" +
      "3.2.1.6  Flexibility/robustness  31\n" +
      "3.2.1.7  Lack of one-size-fits-all solution  31\n" +
      "3.2.1.8  The multiplicity of options is giving rise to market uncertainty and confusion  32\n" +
      "3.2.2    Top Investment Pockets  34\n" +
      "3.2.3    Top winning strategies  34\n" +
      "3.3  Porter’s five force analysis    35\n" +
      "3.3.1    Large number of suppliers leads to lower bargaining power of suppliers  36\n" +
      "3.3.2    Lower switching cost leads to high Buyer power  37\n" +
      "3.3.3    Unavailability of substitute lowers the may raise the threat of complete substitution   37\n" +
      "3.3.4    Economies of scale leads to low threat of new entrants  37\n" +
      "3.3.5    Numerous competitors lead to high rivalry   38\n" +
      "3.4  Value chain analysis    38\n" +
      "";

任何人都可以告诉我我哪里出错了。谢谢并提前问候。

2 个答案:

答案 0 :(得分:0)

首先,Java Applet已经过时了。除此之外,您可以使用带有HTML5 + Jquery + Ajax的 MVC(模型视图控制器)作为视图,使用 Java 作为控制器和模型。对我来说这是最好的选择。使用这种方法,使用HTML5 + Jquery + Ajax,您可以使用ajax从数据库中检索数据。性能得到改善,您将没有Applet的限制。

答案 1 :(得分:0)

仅根据这些代码片段提供答案很困难,但我怀疑它不是触发此数据的数据量(而是将数据从javascript传递到java(以及其他方式)通过LiveConnect有严重的限制,大约是兆字节,而不是你所展示的。)

我建议这些测试步骤:

1)请创建一个测试方法,让我们称之为testCallPanelToSetText,并使用相同的签名(参数)。

更改javascript以将文本传递给此方法。在这种方法的首次实施中,你什么都不做。看看小程序是否挂起。 如果它没有挂起,你可以消除这个假设(问题的原因是数据量)。

2)在第二个实现中,您将测试是否存在线程问题。

LiveConnect(JS&lt; - &gt; Java桥接器)有一些关于多线程应如何交互的规范,并且swing具有更严格的要求。请阅读:Swing and multiple threads并确保您不会从LiveConnect线程调用任何受摇摆影响的功能,它可能与swing线程不同。让所有从javascript调用的方法调度swing调用,以便稍后在swing线程上运行,而不是立即运行(阅读文章,它值得)。

它在几个字节上适用于你的事实与大多数多线程错误的概率行为有关,你应该知道这一点。

实现之后,它应该可以工作,如果没有,你必须记住这是必需的设计,只要你有多个线程有问题。

编辑: 尝试将callPanelToSetText重命名为doCallPanelToSetText并使callPanelToSetText成为包装器:

public static void callPanelToSetText(final String value) {
  SwingUtilities.invokeLater(new Runnable() {

  @Override
    public void run() {
      doCallPanelToSetText(value);
    }
  });
}

然后像以前一样调用JS调用callPanelToSetText。看看是否能解决问题。