Invocation d'une méthode Java dans JSP
Configuration Mac OSX 10.6.8, Apache Tomcat 6.0.16, Java 1.6.0_29, Eclipse IDE Indigo.
J'ai déjà posé une question similaire à celle-ci auparavant à Comment exécuter et inclure une API Java à partir d'un projet Web App mais la configuration a depuis été modifiée en ce sens que j'ai maintenant le code Java dans WebAp
J'essaie d'appeler une méthode Java à partir d'une page JSP et de renvoyer les résultats. J’ai consulté de nombreux articles, mais j’ai bien peur que mon problème soit le manque d’expérience dans les deux langues.
J'ai un JAP WebAp qui recherche une base de données XML et renvoie le contenu à l'utilisateur. On m'a demandé d'intégrer du code Java supplémentaire qui effectue des recherches dans des sites Web prédéfinis et renvoie du contenu.
J'ai joué avec un code similaire à celui ci-dessous mais je pense que je cherche autre chose
<%@ include file="/Applications/Tomcat/Apache-Tomcat-6.0.16/webapps/myWebApp/program.Java" %>
Quelqu'un peut-il me donner une meilleure idée de ce que je recherche?
De plus, savez-vous si je dois éditer quoi que ce soit dans WebAp pour connecter les deux fichiers? Les fichiers de classe dans le dossier WebINF?
Toute aide est fortement appréciée
Limite
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;
}
}
}
Tout d’abord, la manière laide (peut-être parce qu’elle ressemble à php ?):
<%= com.example.MyUtility.getSomething() %>
Cela s'appelle un scriptlet et est considéré comme une mauvaise pratique. En fait, c’est tellement faux que j’ai même honte d’écrire cela. Ce que vous devriez plutôt faire est d’avoir un contrôleur frontal (un simple servlet fera l'affaire), de placer les résultats dans les attributs de la requête et de les transmettre à un JSP. , qui à son tour utilise jstl ou jspel pour la sortie. Beaucoup plus de travail, mais mieux par ordre de grandeur:
Dans Servlet:
request.setAttribute("someData", MyUtility.getSomething())
RequestDispatcher dispatcher = request.getRequestDispatcher("page.jsp");
dispatcher.forward(request, response);
Dans page.jsp
:
${someData}
Il existe différents cadres permettant de réduire la quantité de passe-partout ( spring-mvc en est un exemple simple).
Le moyen le plus simple consiste à importer votre classe dans le fichier JSP et à appeler ses méthodes via des scriptlets.
Pour inclure la classe:
<%@page import="package.subPackage.TheClassName"%>
Notez que TheClassName ne contient aucun suffixe tel que .Java ou .class
Ensuite
<%
TheClassName theClassInstance = new TheClassName();
theClassInstance.doSomething();
%>
En fait, ici, vous écrivez du vieux code Java ordinaire entre les balises <%
et %>
.
Ce n'est cependant pas la meilleure façon de procéder du point de vue de l'organisation de votre code. Seule la logique de présentation doit figurer dans la vue. Il est mauvais de le laisser avec de tels scriptlets.
Si vous avez besoin de l'aide de l'appel de méthode d'instance d'une classe pour afficher quelque chose dans votre vue, créez simplement une balise qui appelle la méthode (et toute autre logique non liée à la vue) et ne renvoie que ce qui doit être affiché. Voici la documentation officielle à ce sujet
Je ne sais pas si j'ai bien compris votre question.
Ce dont vous avez besoin est d'importer une classe Java et d'exécuter du code Java dans JSP
<%@ page import="package1.myClass1,package2.myClass2,....,packageN.myClassN" %>
importer la classe, puis
<%
new ClassXXX().methodYYY();
%>
Cependant, exécuter du code Java dans jsp n'est pas une bonne idée ...
Faites n'importe quelle classe Java dans votre dossier src et importez cette classe dansJSPpage comme ceci.
<%@ page import="com.MyClass"%>
Supposons maintenant que vous ayez une fonction dans la classe qui retourne String, puis vous l'écriverez dans JSP comme suit:
<%
String stringFromJava = MyClass.getStringForJSPPage();
%>
Maintenant, vous pouvez utiliser stringFromJava
n'importe où dansJSP. Vous pouvez également obtenir la liste de la même manière.