2012-03-05 13 views
7

Impostazione Mac OS X 10.6.8, Apache Tomcat 6.0.16, Java 1.6.6_29, Eclipse IDE Indigo.Invocazione di un metodo Java in JSP

ho fatto una domanda simile a questo prima al How to execute and include a Java API from a Web App project ma il set up da allora è cambiato che ora ho il codice Java nel WebAp

Sto cercando di richiamare un metodo Java da una pagina JSP e ritorno i risultati. Ho esaminato molti post, ma temo che la mia mancanza di esperienza con entrambe le lingue sia il problema principale.

Ho un WebSP JSP che cerca un database XML e restituisce il contenuto all'utente. Mi è stato chiesto di integrare un ulteriore codice java che cerca i siti Web predefiniti e restituisce il contenuto.

Ho giocato in giro con il codice simile al di sotto, ma penso che sto cercando qualcosa di diverso

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

Qualcuno mi può dare una migliore idea di quello che sto cercando?

Inoltre, sai se devo modificare qualcos'altro in WebAp per connettere i due file? I file di classe nella cartella WebINF?

Qualsiasi aiuto è molto apprezzato

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; 

    } 
} 

}

risposta

11

In primo luogo, il brutto modo (forse perché così simile a ?):

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

Si chiama ed è considred una cattiva pratica. In effetti questo è talmente sbagliato che mi vergogno persino di scriverlo. Che cosa è dovrebbe invece di avere un front controller (un servlet semplice farà il trucco), posizionare i risultati negli attributi della richiesta e inoltrare a un JSP, che a sua volta usa o per l'output. Molto più lavoro, ma meglio di un ordine di grandezza:

In Servlet:

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

In page.jsp:

${someData} 

Ci sono vari quadri che possono ridurre la quantità di testo standard ( è un semplice esempio).

+0

Hi Tomasz In primo luogo, grazie per la risposta. Dovrò andare con il modo brutto in quanto non sono ancora abbastanza avanzato per il metodo del front controller, ancora. Tuttavia non sono sicuro della sintassi esatta della vostra risposta <% = com.example.MyUtility.getSomething()%> Il mio file Java si chiama "slicer.java" E 'un unico pacchetto principale chiamata "sliceClient" voglio richiamare "sliceCreate" voglio restituire una stringa chiamata "sliceHit" il codice si trova nel WEB-INF/clases/src ho provato varianti di <% = session.sliceClient. getsliceHit()%> senza successo Come sempre, qualsiasi aiuto è apprezzato Deep fine – Deepend

+0

@Deepend Ho paura che tu debba mostrarci il contenuto di 'slicer.java', la tua denominazione e il tuo vocabolario sono un po 'confusi nel mondo Java. Non abbiamo bisogno di corpi metodo, solo firme (per favore aggiungilo alla domanda, non come commento).Da quanto hai detto qui, magari prova: '<% = sliceClient.sliceCreate()%>' ... –

+0

Ho aggiunto il codice alla domanda adesso. Dato che sono nuovo di StackOverFlow, non sapevo che modificare la domanda originale fosse accettabile. Grazie per il vostro aiuto in anticipo Deepend – Deepend

3

non so che ho capito la tua domanda, probabilmente.

Quello che vi serve è quello di importare classe Java, ed eseguire codice Java in JSP

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

importare la classe, e quindi

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

Tuttavia, codice Java eseguito in jsp non è una buona idea ...

1

Make any JAVA class nella cartella src e importa quella classe nella pagina JSP come questa.

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

Ora lascia supponiamo di avere una funzione in classe che restituisce String allora si scriverà questo in JSP come:

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

Ora è possibile utilizzare in qualsiasi parte stringFromJavaJSP. Puoi anche ottenere l'elenco nello stesso modo.

7

Bene, il modo più semplice è quello di importare la classe nel JSP e chiamare i suoi metodi tramite scriptlet.

Per includere la classe:

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

noti che TheClassName non contiene suffissi, come java o .class

Poi

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

Effettivamente qui si sta scrivendo semplice codice Java vecchio tra i tag <% e %>.

Questo non è tuttavia il modo migliore per passare dal punto di vista di come è organizzato il codice. Solo la logica di presentazione dovrebbe andare nella visualizzazione. Sporcarla con tali scriptlet è brutta.

Se hai bisogno di aiuto da una chiamata del metodo di istanza di una classe per diplay qualcosa nella tua vista, basta creare un Tag che faccia la chiamata al metodo (e qualsiasi altra logica non vista) e poi restituisca solo ciò che deve essere visualizzato. Ecco la documentazione ufficiale su quel

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

Problemi correlati