在JSP中调用Java方法

16

环境:Mac OSX 10.6.8,Apache Tomcat 6.0.16,Java1.6.0_29,Eclipse IDE Indigo。

我之前在如何执行和包含Web应用程序项目中的Java API这里问过类似的问题,但现在设置已经更改,我现在将Java代码放在WebAp中。

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

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

我玩过类似下面的代码,但我认为我正在寻找其他东西。

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

有没有人能更好地帮我理解我正在寻找的东西?

另外,您知道我是否需要编辑WebAp中的其他内容才能连接这两个文件吗?WebINF文件夹中的类文件?

非常感谢任何帮助

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;

    }
}

}

=>

}

4个回答

20

首先,有一种丑陋的方式(可能是因为与类似):

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

它被称为,被视为一种不良实践。事实上,这是如此错误,以至于我甚至感到羞愧写下这些内容。相反,你应该使用一个前端控制器(一个简单的servlet即可),将结果放置在请求属性中,并转发到JSP,然后使用 进行输出。虽然需要更多工作,但效果要好得多:
request.setAttribute("someData", MyUtility.getSomething())
RequestDispatcher dispatcher = request.getRequestDispatcher("page.jsp");
dispatcher.forward(request, response);  

page.jsp 中:
${someData}

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


我不熟悉 [tag:guice],但我相信这个链接可以帮到你:http://turbomanage.wordpress.com/2009/12/11/how-to-inject-guice-objects-in-a-jsp/。 - Tomasz Nurkiewicz
谢谢Tomasz。我的JSP正在调用Java方法。目前我遇到了类路径的问题,但希望很快能解决。 - Deepend
只是补充一下。如果有人选择使用丑陋的脚本方式通过Tomcat将Java方法导入JSP,他们还必须修改包含在WEB-INF文件夹中的“web.xml”文件。我不得不添加<url-pattern>/myprogram.java</url-pattern>才能使它正常工作。这里有更多信息http://www.coderanch.com/how-to/java/InvokerServlet祝你好运 - Deepend
1
我快要给这个答案点踩了,因为它的尖刻评论说这样做是错误的。虽然这可能是真的,但我们中的一些人(包括我和我确定其他人也是如此)不需要MVC的开销。我正在组合两个页面,与一个JAR接口。对于像这样的项目使用MVC就像在刀枪战中带着核弹——过度杀伤力。这个解决方案对我和任何为学术项目或简单接口构建“临时”解决方案的人都很好用。MVC很强大,但它并不是解决所有问题的万能药。 - lilott8
脚本小程序并不是一件坏事。MVC 纯粹主义者才是错误的。在视图中获取数据肯定是一种不好的做法,但是——天哪——为什么我们不能在那里进行一些特定于视图的格式化操作呢?就像我们应用 Django 过滤器一样。 - Pavel Vlasov
显示剩余3条评论

8

最简单的方法是在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


为什么在这里成功调用doSomething(),但属性文件数据却为空? - srinivas gowda

3

我不确定我是否正确理解了你的问题。

你需要导入Java类,并在JSP中运行Java代码。

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

导入该类,然后...
<%
 new ClassXXX().methodYYY();
%>

然而,在JSP中运行Java代码并不是一个好主意...

1
在你的src文件夹中创建任何JAVA类,并像这样在JSP页面中导入该类。
<%@ page import="com.MyClass"%>

假设您在类中有一个返回字符串的函数,那么您可以在 JSP 中这样编写:
<%
String stringFromJava = MyClass.getStringForJSPPage();
%>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接