Question

Setup Mac OSX 10.6.8, Apache Tomcat 6.0.16, Java1.6.0_29, Eclipse IDE Indigo.

I asked a similar question to this before at How to execute and include a Java API from a Web App project but the set up has since changed in that i now have the Java code in the WebAp

I am trying to invoke a Java Method from a JSP page and return the results. I have looked at a lot of posts but I’m afraid my lack of experience with either language is the main problem.

I have a JSP WebAp that searches an XML database and returns content to the user. I have been asked to integrate additional java code that searches predefined Websites and returns content.

I’ve played around with similar code to the below but I think I’m looking for something else

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

Can anyone give me a better idea of what I’m looking for?

Also do you know if I have to edit anything else in the WebAp to connect the two files? The class files in the WebINF folder?

Any help is very much appreciated

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;

    }
}

}

Was it helpful?

Solution

First, the ugly way (maybe because so similar to ?):

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

It is called a and is considred a bad practice. In fact this is so wrong that I am ashamed of even writing this. What you should do instead is to have a front controller (a simple servlet will do the trick), place results in the request attributes and forward to a JSP, which in turns uses or for output. Much more work, but better by an order of magnitude:

In Servlet:

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

In page.jsp:

${someData}

There are various frameworks that can reduce the amount of boilerplate ( is a simple example).

OTHER TIPS

Well, the simplest way is to import your class in the JSP and call it's methods via scriptlets.

To include the class:

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

Note that TheClassName doesn't contain any suffixes such as .java or .class

Then

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

Effectively here you're writing plain old Java code between <% and %> tags.

This is however not the best way to go from the point of view of how your code is organisd. Only presentation logic should go in the view. Littering it with such scriptlets is bad.

If you need help from some class's instance method call to diplay something in your view, your just make a Tag that does the method call (and any other non-view-related logic) and then returns only what needs to be displayed. Here's the official docs on that

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

I don't know that I have understand your question probably.

What you need is to import java class, and run java code in JSP

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

import the class, and then

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

However, run java code in jsp is not a good idea...

Make any JAVA class in you src folder and import that class in JSP page like this.

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

Now lets suppose you have a function in class that returns String then you will write this in JSP as:

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

Now you can use stringFromJava anywhere in JSP. You can also get List in the same way.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top