Вызов метода Java в JSP - PullRequest
       33

Вызов метода Java в JSP

10 голосов
/ 05 марта 2012

Настройка Mac OSX 10.6.8, Apache Tomcat 6.0.16, Java1.6.0_29, Eclipse IDE Indigo.

Я задавал вопрос, похожий на этот, ранее на Как выполнить и включить API Java из проекта веб-приложения , но с тех пор настройки изменились, и теперь у меня есть Java-код в WebAp

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

У меня есть веб-приложение JSP, которое выполняет поиск в базе данных XML и возвращает содержимое пользователю. Меня попросили добавить дополнительный код Java, который выполняет поиск по заранее определенным веб-сайтам и возвращает контент.

Я поиграл с кодом, подобным приведенному ниже, но думаю, что я ищу что-то еще

<%@ include file="/Applications/Tomcat/apache-tomcat-6.0.16/webapps/myWebApp/program.java" %>

Может кто-нибудь дать мне лучшее представление о том, что я ищу?

Также вы знаете, нужно ли мне редактировать что-то еще в WebAp для соединения двух файлов? Файлы классов в папке WebINF?

Любая помощь очень ценится

Deepend


package sliceClient;

import java.util.List;


public class Run {

@Inject
private SliceSearcher sliceSearcher;

@Inject
private SliceCreator sliceCreator;

/**
 * @param args
 */
public static void main(String[] args) {
    Injector injector = Guice.createInjector(new GuiceInjector());
    Run r = injector.getInstance(Run.class);
    r.runSliceConsumer();
}

private void setSlicepediaProductionMode(boolean productionMode){
    sliceSearcher.setProductionMode(productionMode);
    sliceCreator.setProductionMode(productionMode);
}

public void runSliceConsumer() {
    System.out.println("Starting Slice Consumer");

    //Remove this line if the real slicepedia server is to be used
    setSlicepediaProductionMode(true);

    List<SliceHit> sliceHits = searchForSlices();
    if (sliceHits == null) {
        System.err.println("Timeout occurred while fetching slices");
        return;
    }
    if (!sliceHits.isEmpty()) {
        System.out.println("Found some slices Yuhuuuu ! :-) ");
        String sliceContent = createSlices(sliceHits);
        System.out.println("Slice content:");
        System.out.println(sliceContent);
    } else {
        System.out.println("No Slices were found for this query");
    }
    System.out.println("Slice Consumer stopped activity");
}

private String createSlices(List<SliceHit> sliceHits) {
    sliceCreator.setSliceHits(sliceHits);
    if (sliceCreator.run()) {
        SlicePackage slicePackage = sliceCreator.getNextSlicePackage();
        return slicePackage.getSliceContent();
    } else {
        return sliceCreator.getErrorMessage();
    }
}

private List<SliceHit> searchForSlices() {
    SlicepediaQuery sliceQuery = new SlicepediaQuery();


    sliceQuery.paramANNOTATION_READING_DIFFICULTY(new Double(30), "<");
    //Works
//      String dbConcept = "http://dbpedia.org/resource/human_rights";
//      sliceQuery.paramANNOTATION_CONCEPT_FEATURE_HAS_DBPEDIA(dbConcept,0.5, ">");
//      sliceQuery.paramHAS_NBR_OF_PARAGRAPHS(1,">");
//      sliceQuery.paramIsAnOpenSlice(true);
//      sliceQuery.paramHasNumberOfToken(80, ">");

    sliceSearcher.setSliceQuery(sliceQuery);
    if (sliceSearcher.run()) {
        return sliceSearcher.getSliceHits();

    } else {
        return null;

    }
}

}

Ответы [ 4 ]

15 голосов
/ 05 марта 2012

Во-первых, уродливый способ (может быть, потому что так похож на ?):

<%= com.example.MyUtility.getSomething() %>

Это называется и считается плохой практикой. На самом деле это так неправильно, что мне стыдно даже писать это. Вместо этого должен сделать это иметь фронт-контроллер (простой сервлет сделает свое дело), ​​поместить результаты в атрибуты запроса и переслать в JSP, который в свою очередь использует или для вывода. Гораздо больше работы, но лучше на порядок:

В сервлете:

request.setAttribute("someData", MyUtility.getSomething())
RequestDispatcher dispatcher = request.getRequestDispatcher("page.jsp");
dispatcher.forward(request, response);  

В page.jsp:

${someData}

Существуют различные рамки, которые могут уменьшить количество шаблонов (простой пример ).

8 голосов
/ 05 марта 2012

Ну, самый простой способ - импортировать ваш класс в JSP и вызывать его методы через скриптлеты.

Чтобы включить класс:

<%@page import="package.subPackage.TheClassName"%>

Обратите внимание, что TheClassName не содержит суффиксов, таких как .java или .class

Тогда

<%
   TheClassName theClassInstance = new TheClassName();
   theClassInstance.doSomething();
%>

Фактически, здесь вы пишете простой старый код Java между тегами <% и %>.

Это, однако, не лучший путь с точки зрения организации вашего кода. Только логика представления должна идти в представлении. Засорять это такими скриплетами плохо.

Если вам нужна помощь от вызова метода экземпляра какого-либо класса, чтобы воспроизвести что-то в вашем представлении, вы просто создаете тег, который выполняет вызов метода (и любую другую логику, не связанную с представлением), а затем возвращает только то, что нужно отобразить , Вот официальные документы по этому вопросу

http://docs.oracle.com/javaee/5/tutorial/doc/bnalj.html

3 голосов
/ 05 марта 2012

Не знаю, возможно, я понял ваш вопрос.

Вам нужно импортировать класс Java и запустить код Java в JSP

<%@ page import="package1.myClass1,package2.myClass2,....,packageN.myClassN" %>

импортируйте класс, а затем

<%
 new ClassXXX().methodYYY();
%>

Однако запускать Java-код в JSP не очень хорошая идея ...

1 голос
/ 05 марта 2012

Создайте любой класс JAVA в вашей папке src и импортируйте этот класс на страницу JSP следующим образом.

<%@ page import="com.MyClass"%>

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

<%
String stringFromJava = MyClass.getStringForJSPPage();
%>

Теперь вы можете использовать stringFromJava в любом месте JSP .Вы также можете получить список таким же образом.

...