我之前写过一个从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">
如何通过单击按钮两次运行此同步类及其参数两次,并显示该类已使用消息执行。
答案 0 :(得分:1)
你的班级必须延长javax.servlet.http.HttpServlet
并覆盖至少一个方法,如果你正在做一个表格,那么它将是一个方法doPost()
然后,您需要向WEB-INF / web.xml添加<servlet/>
和<servlet-mapping/>
以指向您的类(现在是一个Servlet)。
根据路径判断,您已经安装了Tomcat。 javax.servlet。*可以在名为servlet-api.jar的tomcat / lib中找到。你只需要它们进行编译。 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
答案 1 :(得分:0)
简短回答: onClick="path here"
应链接到运行该类的第二个JSP,而不是类本身。
答案很长:
在tomcat lib文件夹中复制您的课程
创建第二个JSP文件
onClick="path here"
应该链接到将运行类的新JSP,而不是类本身。
将类路径添加到JSP标头import="com.mypackage.*"
您必须创建一个接收参数并运行逻辑的方法,您将无法像在命令行中那样运行main方法。
将调用代码添加到JSP
<%
CLRSyncCLI o = new CLRSyncCLI();
o.method();
%>
答案 2 :(得分: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>
<% } %>
这里存在一些潜在的陷阱,尤其是多线程。但也许你可以用它作为起点?另外,我还没有调试它,所以你可能需要做更多的工作。
祝你好运,DC