jspページのボタンをクリックして開始および停止する.exeファイルがあります。jsp ページのボタンをクリックすると、.exe ファイルが起動し、そのログが .txt ファイルに配置されます。たとえば、txt ファイルは C:\Debug\logfile.txt にあります。問題は、[開始] をクリックすると、.exe ファイルが開始され、そのデータが指定されたログ ファイルに表示されますが、出力が jsp ページに出力されないことです。.exe ファイルを停止すると、指定したログ ファイルと jsp ページの両方にログが表示されます。この問題の解決にご協力ください。以下は、.exe ファイルの停止と開始の両方のコード スニペットです。
exeファイルを開始するためのサーブレット:
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws
IOException {
try{
String browsefile = req.getParameter("browsefile");
if(browsefile == null || browsefile.equals("")){
throw new ServletException("File Name can't be
null or empty");
}
File file = new File("C:/lic/test.lic");
if(!file.exists()){
throw new ServletException("File doesn't exists
on server.");
}
res.setContentType("text/html;charset=UTF-8");
PrintWriter out = res.getWriter();
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("C:\\tools\\server\\grd.exe -l[+]
C:\\Debug\\logfile.txt" );
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(pr.getInputStream()));
BufferedReader input = new BufferedReader(stdInput);
String serverstarted="";
StringBuffer startOutput = new StringBuffer();
while((serverstarted = input.readLine()) !=
null){
startOutput.append
(serverstarted + "\n");
}
req.setAttribute("startOutput",
startOutput.toString());
req.getRequestDispatcher
("grdoptions.jsp").forward(req, res);
}catch (Throwable t)
{
t.printStackTrace();
}
finally {
} }
}
.exe ファイルを停止するためのサーブレット:
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws
IOException {
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter out = res.getWriter();
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("cmd /c taskkill /F /IM grd.exe");
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(pr.getInputStream()));
BufferedReader input = new BufferedReader(stdInput);
String stop="";
StringBuffer stopOutput = new StringBuffer();
while((stop = input.readLine()) != null){
//out.println(stop);
stopOutput.append(stop + "\n");
}
req.setAttribute("stopOutput",
stopOutput.toString());
req.getRequestDispatcher
("grdoptions.jsp").forward(req, res);
// out.println("Command has been stopped");
}catch (Throwable t)
{
t.printStackTrace();
}
finally {
} }
}
jsp コード:
<table cellspacing="5" cellpadding="1" border="0">
<tr>
<td>Start Server</td>
<td>
<div id="start">
<form action="start" METHOD="GET"
enctype="multipart/form-data">
<input type="file" name=browsefile size="150" />
<input type="submit" name="start"
value="StartServer" />
</form>
</div>
<div id="result">
<pre>
${requestScope.startOutput}
</pre>
</div>
</td>
</tr>
</table>
<BR>
<table cellspacing="5" cellpadding="1" border="0">
<tr>
<td>Stop Server</td>
<td>
<div id="stop">
<form action="stop" METHOD="GET">
<input type="submit" name="txtSubmit2"
id="txtSubmit" value="StopServer" />
</form>
</div>
<div id="result">
<pre>
${requestScope.stopOutput}
</pre>
</div>
</td>
</tr>
</table>
Web.XML:
<servlet>
<servlet-name>Start</servlet-name>
<servlet-class>com.abc.def.lic.Start</servlet-class>
</servlet>
<servlet>
<servlet-name>Stop</servlet-name>
<servlet-class>com.abc.def.lic.Stop</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Start</servlet-name>
<url-pattern>/start</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Stop</servlet-name>
<url-pattern>/stop</url-pattern>
</servlet-mapping>
私が考え出したのは、 Process pr = rt.exec("C:\tools\server\grd.exe -l[+]
C:\Debug\logfile.txt" );を使用していることです。exeファイルを開始し、logfile.txtのデータを出力します。これにより、出力がjspページに出力されなくなります。-l[+] C:\Debug\logfile.txt を削除すると、Web ページに出力が出力されます。しかし、Web ページと logfile.txt の両方に出力が必要です。