在 JSP 中调用 Java 方法

2022-09-04 06:57:37

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

我之前在如何执行和包含来自Web App项目的Java API中问过类似的问题,但设置已经发生了变化,因为我现在在WebAp中拥有Java代码。

我正在尝试从JSP页面调用Java方法并返回结果。我看过很多帖子,但我担心我缺乏任何一种语言的经验是主要问题。

我有一个JSP WebAp,它搜索XML数据库并将内容返回给用户。我被要求集成额外的java代码来搜索预定义的网站并返回内容。

我已经尝试了与下面类似的代码,但我认为我正在寻找其他东西

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

任何人都可以让我更好地了解我正在寻找什么吗?

另外,您是否知道我是否必须在WebAp中编辑任何其他内容才能连接这两个文件?WebINF 文件夹中的类文件?

任何帮助都非常感谢

深化


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;

    }
}

}


答案 1

首先,丑陋的方式(也许是因为与如此相似?

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

它被称为 ,被认为是一种不好的做法。事实上,这是错误的,我甚至为写这篇文章感到羞耻。相反,你应该做的是有一个前端控制器(一个简单的servlet就可以了),将结果放在请求属性中并转发到JSP,而JSP反过来使用 进行输出。工作量要大得多,但要好一个数量级:

在 Servlet 中:

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

在:page.jsp

${someData}

有各种框架可以减少样板的数量(就是一个简单的例子)。


答案 2

好吧,最简单的方法是在 JSP 中导入你的类,并通过 scriptlet 调用它的方法。

要包含该类,请执行以下操作:

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

请注意,TheClassName 不包含任何后缀,如 .java 或 .class

然后

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

实际上,在这里,您正在和标记之间编写普通的旧Java代码。<%%>

然而,从代码的组织方式来看,这并不是最好的方法。只有表示逻辑应该进入视图。用这样的脚本乱扔垃圾是不好的。

如果您需要某个类的实例方法调用的帮助来淡化视图中的某些内容,则只需创建一个执行方法调用的 Tag(以及任何其他与视图无关的逻辑),然后仅返回需要显示的内容。这是关于它的官方文档

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