【问题标题】:Invoking a Java Method in JSP在 JSP 中调用 Java 方法
【发布时间】:2012-03-22 21:51:39
【问题描述】:

设置 Mac OSX 10.6.8、Apache Tomcat 6.0.16、Java1.6.0_29、Eclipse IDE Indigo。

我之前在How to execute and include a Java API from a Web App project 上问过一个类似的问题,但设置已经改变,我现在在 WebAp 中有 Java 代码

我正在尝试从 JSP 页面调用 Java 方法并返回结果。我看过很多帖子,但恐怕我对这两种语言都缺乏经验是主要问题。

我有一个搜索 XML 数据库并将内容返回给用户的 JSP WebAp。我被要求集成额外的 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;

    }
}

}

【问题讨论】:

    标签: java jsp tomcat invoke-command


    【解决方案1】:

    首先,丑陋的方式(可能是因为和太相似了?):

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

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

    在 Servlet 中:

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

    page.jsp:

    ${someData}
    

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

    【讨论】:

    • 您好 Tomasz 首先,感谢您的回答。我将不得不采用丑陋的方式,因为我还不够先进,无法使用前端控制器方法。但是我不确定您的答案的确切语法 我的 Java 文件名为“slicer.java” 它有一个名为“sliceClient”的主包我想调用“sliceCreate " 我想返回一个名为 "sliceHit" 的字符串 代码位于 Web-INF/clases/src 我尝试了 的变体但没有成功 一如既往,任何帮助都是赞赏加深
    • @Deepend 恐怕你得给我们看看slicer.java 的内容,你的命名和词汇在Java 世界里有点混乱。我们不需要方法体,只需要签名(请将其添加到问题中,而不是作为评论)。根据您在这里所说的,也许可以尝试:&lt;%= sliceClient.sliceCreate() %&gt;...
    • 我现在已将代码添加到问题中。由于我是 StackOverFlow 的新手,我不知道编辑原始问题是可以接受的。提前感谢您的帮助 Deepend
    • 我不知道guice,但我相信this可以帮到你。
    • 我正处于对这个答案投反对票的边缘,因为关于这样做是多么错误的尖刻评论。虽然这可能是真的,但我们中的一些人(我和我相信其他读过这篇文章的人)不需要 MVC 的开销。我将两个与 JAR 接口的页面放在一起。将 MVC 用于这样的项目就像将核弹带入刀战——矫枉过正。这个解决方案对我和任何为学术项目或简单界面“拼凑”有用的解决方案的人都很好。 MVC 很强大,但它并不是解决所有问题的灵丹妙药。
    【解决方案2】:

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

    要包含类:

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

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

    然后

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

    实际上,您在 &lt;%%&gt; 标记之间编写普通的旧 Java 代码。

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

    如果您需要某个类的实例方法调用的帮助来在视图中显示某些内容,您只需创建一个执行方法调用(以及任何其他非视图相关逻辑)的标记,然后仅返回需要显示的内容.这是官方文档

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

    【讨论】:

    • 当我这样做时 doSomething() 在这里被成功调用,为什么属性文件数据为空
    【解决方案3】:

    我不知道我大概明白了你的问题。

    你需要的是导入java类,并在JSP中运行java代码

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

    导入类,然后

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

    但是,在 jsp 中运行 java 代码并不是一个好主意……

    【讨论】:

      【解决方案4】:

      在您的 src 文件夹中创建任何 JAVA 类,然后像这样在 JSP 页面中导入该类。

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

      现在假设您在类中有一个返回字符串的函数,那么您将在 JSP 中将其编写为:

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

      现在您可以在 JSP 的任何地方使用stringFromJava。同样的方法也可以获取List。

      【讨论】:

        猜你喜欢
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多