2

我之前编写了一个从 bash 文件执行的 java 类,现在我需要允许使用 Javascript/HTML 按钮从 JSP 页面执行它,我想知道我该怎么做?

首先,我的班级是这样的:

 public class Sync
 {
   public static void main(String[] args)
   {
   //my content here
   }
 }

此 Sync 类已从 bash 脚本运行,如下所示:

cd /root/tomcat/webapps/project/WEB-INF/classes/
echo "Executing first part..."
/usr/local/java/bin/java classes/CLRSyncCLI 120.0.0.1 up false Y ${IPS[@]}
echo "Executing second part..."
/usr/local/java/bin/java classes/CLRSyncCLI 127.0.0.1 down false Y ${IPS[@]}

请注意:classes 是所有已编译的 java 类在 TomCat Web 服务器中的目录。

现在在jsp页面中我需要类似的东西:

<input type="button" value="Execute" name="to" action="run" onClick="path here">

如何通过单击一次按钮两次运行此同步类及其参数,并显示该类已通过消息执行。

4

3 回答 3

1

你的类必须扩展javax.servlet.http.HttpServlet和覆盖至少一个方法,如果你正在做一个表单,那么它将是一个方法doPost()

然后您需要在 WEB-INF/web.xml 中添加 a<servlet/>和 a<servlet-mapping/>以指向您的类(现在是一个 Servlet)。

从路径来看,您已经安装了 Tomcat。javax.servlet.* 可以在您的 tomcat/lib 中的名称 servlet-api.jar 下找到。您只需要它们进行编译。Tomcat 在运行时提供它们。

只有这样,您才能在 JSP 中创建这样的表单: <form method="POST" action="MyServlet">...<input.../>...</form> 假设 MyServlet 是您添加到 web.xml 的 Servlet 的名称(如果需要,请替换为您自己的名称)。

这是一个例子: http: //met.guc.edu.eg/OnlineTutorials/JSP%20-%20Servlets/A%20servlet%20example.aspx

至少阅读 JavaEE 指南的第 4 章总是有意义的:http: //docs.oracle.com/javaee/5/tutorial/doc/bnafd.html

于 2012-10-01T16:28:51.393 回答
0

简短的回答: onClick="path here"应该链接到运行类的第二个 JSP,而不是类本身。

长答案:

  1. 将您的课程复制到 tomcat lib 文件夹中

  2. 创建第二个 JSP 文件

  3. onClick="path here"在第一个 JSP 上应该链接到将运行该类的新 JSP,而不是类本身。

  4. 将类路径添加到 JSP 标头import="com.mypackage.*"

  5. 您将必须创建一个接收参数并运行逻辑的方法,您将无法像在命令行中那样运行 main 方法。

将调用代码添加到 JSP

<% 
   CLRSyncCLI o = new CLRSyncCLI();
   o.method();
%>
于 2012-10-01T17:32:17.610 回答
0

首先,我想说你的提议是一个坏主意。您真的应该Sync按照前面的答案中的描述进行重构。

但是,如果您不按Sync原样使用,这里有一些代码可能会有所帮助:

<% if( request.getParameter( "to" ) == null ) { %>
    <p>
        Click 'Execute' to begin processing.
    </p>
    <form>

        <input type="submit" value="Execute" name="to" />
    </form>
<% } else { %>
    <p>
        Processing...
    </p>
    <pre>
        <%
            PrintStream sysout = System.out;
            try {
                File syncFile = File.createTempFile( "Sync", ".tmp" );

                PrintStream syncOs= new PrintStream( syncFile );
                System.setOut( syncOs );
                String[] myArgs = ...; // set up your args
                Sync.main( myArgs );
                // ... do whatever else you need to do
                syncOs.close();
                syncFile.close();

                FileReader syncRdr = new FileReader( syncFile );
                String line = null;
                while( ( line = syncRdr.readLine() ) {
                    out.println( line );
                }
                syncRdr.close();
                syncFile.delete();
            } catch( Exception ex ) {
                out.print( ex );
            } finally {
                System.setOut( sysout );
            }
        %>
    </pre>
<% } %>

这里有一些潜在的陷阱,尤其是多线程。但也许你可以以此为起点?另外,我还没有调试它,所以你可能需要做更多的工作。

祝你好运,

直流

于 2012-10-01T19:01:59.720 回答