2010-03-09 2 views
2

Мой вопрос сам пояснительный. Я хочу запустить оболочку, которая вызывает процедуру, из JSP с помощью кнопки.Как запустить оболочку из JSP?

Процедура

CREATE OR REPLACE PROCEDURE DEMO_PRC (dist IN variable,mrno IN variable, 
yr IN variable,flags OUT number) 
IS 
begin 
flags:=0; 
// CODE THAT GENERATES A UTIL..... 
flags:=1; 
end; 
/

И оболочка:

sqlplus demo_user/[email protected] 
var a NUMBER(4); 
exec DEMO_PRC($1,$2,,$3,:a); 
print a; 

назвал его dist.sh и это запустить в командной строке:

dist.sh 3 1937 10 

Но я хочу, чтобы запустить его от JSP, когда я нажимаю кнопку. Но я не знаю, синтаксис для запуска оболочки (.sh) из JSP.

ответ

7

Вы можете выполнить произвольные процессы с помощью Runtime class:

Runtime.getRuntime().exec("...a string here specifying the command to run..."); 

Есть несколько перегруженных в зависимости от того, сколько управления вам нужно, и т.д. Вы должны быть уверены в том, что учетной записи пользователя ваши JSPs использовать доступ на все необходимое для команды, которую вы используете.

1

Существует неправильное представление здесь. JSP - это технология просмотра, которая предоставляет шаблон для записи HTML/CSS/JS внутри и обеспечивает возможность взаимодействия с внутренним кодом Java в аромате taglib и EL во время генерации ответа. Однако это можно сделать с помощью обычного Java-кода. Вы можете написать это в JSP-файле, но это считается плохой практикой. Java-код принадлежит реальным Java-классам. Ваша проблема состоит в том, чтобы разделить на две части.

Прежде всего вопрос о том, как выполнить нужную задачу с помощью Java-кода. Как ответил несколько раз, прежде чем вам понадобится Runtime#exec(). Однако, убедитесь, что вы прочитали и поняли все 4 страницы this article! Вот пример стартового:

public class YourShellClass { 
    public Result execute() { 
     Runtime runtime = Runtime.getRuntime(); 
     // ... implement 
     return result; 
    } 
} 

Теперь оставил вопрос, как запустить его с помощью формы HTML, который подается на странице JSP. Предположим, что форма HTML выглядит следующим образом:

<form action="run" method="post"> 
    <input type="submit" value="run"> 
</form> 

Эта форма будет посылать запрос POST в http://example.com/somecontext/run. Для exectue Java код всякий раз, когда этот запрос поступает на сервер, просто создать класс, который extends HttpServlet который прослушивает на url-pattern из /run и имеет doPost() примерно реализован следующим образом:

protected void doPost(HttpServletRequest request, HttpServletResposne response) throws ServletException, IOException { 
    YourShellClass yourShellClass = new YourShellClass(); 
    Result result = yourShellClass.execute(); 
    // ... do something with it? 

    // Then display some result page? 
    request.getRequestDispatcher("result.jsp").forward(request, response); 
} 
+0

Кроме того, вместо использования сценария оболочки, я думаю, что он мог бы выполнять операции SQL, которые он хочет непосредственно с Java. –

+0

Не все драйверы JDBC поддерживают все виды операторов DDL. – BalusC

2

Решена problem.Took мне какое-то время, 6 часов. если быть точным, но получил нужный результат .

Вот как:

  1. Для того, чтобы вызвать процедуру, которая генерирует Util, я сначала вызвать JSP (с использованием window.open с параметрами, предназначаться lower_frame). Существует использование Callable Заявление и вызов proc. с отправленными параметрами.Синтаксис:

    Callable Statement cs = null; 
    cs = mk.con.prepareCall("{call DPD_PRINT_LETTER(?,?,?,?)}"); 
    cs.setString......//4 params. 
    cs.execute(); 
    

    Затем с помощью BufferedReader, я называю Util и производить его на lower_frame. Синтаксис:

    % 
    BufferedReader bfreader = new BufferedReader(new 
    FileReader("/ltora/oracle64/j2ee/LtTest/LtTest/reports/MNOS_LETT_"+mrno+"."+IPaddr)); 
    String data = new String(""); 
    while((data = (String)bfreader.readLine())!=null 
    { 
          String temp=data.replaceAll(" ","&nbsp"); 
    % 
    tr 
        td style="font-family: Courier New; font-size: 12pt; font-weight: 
    bold" 
          %= temp % 
        /td 
        /tr 
    % } % 
    
  2. Теперь вызвать оболочку, которая собирается напечатать отчет, я называю java(again.with params) с помощью ActiveXObject(say x) и функции:

    x.open('GET',url,true); 
    

    Здесь URL содержит Java. В Java, я сделал:

    Process child = null; 
    Runtime anyRuntime = Runtime.getRuntime(); 
    child = anyRuntime.exec(strShellLine); 
    

    Здесь «strShellLine» содержит URL оболочки ...... и это все есть на него.

Смежные вопросы