在JSP中调用Java方法

Dee*_*end 12 java jsp tomcat invoke-command

设置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" %>
Run Code Online (Sandbox Code Playgroud)

谁能让我更好地了解我在寻找什么?

另外你知道我是否必须在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;

    }
}
Run Code Online (Sandbox Code Playgroud)

}

Tom*_*icz 15

首先,丑陋的方式(也许是因为如此类似于?):

<%= com.example.MyUtility.getSomething() %>
Run Code Online (Sandbox Code Playgroud)

它被称为,被认为是一种不好的做法.事实上,这是错误的,我甚至羞于写这个.你应该做的是拥有一个前端控制器(一个简单的servlet将完成这个技巧),将结果放在请求属性中并转发到JSP,然后JSP使用 来输出.更多的工作,但更好的一个数量级:

在Servlet中:

request.setAttribute("someData", MyUtility.getSomething())
RequestDispatcher dispatcher = request.getRequestDispatcher("page.jsp");
dispatcher.forward(request, response);  
Run Code Online (Sandbox Code Playgroud)

page.jsp:

${someData}
Run Code Online (Sandbox Code Playgroud)

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


Shi*_*gon 8

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

包括班级:

<%@page import="package.subPackage.TheClassName"%>
Run Code Online (Sandbox Code Playgroud)

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

然后

<%
   TheClassName theClassInstance = new TheClassName();
   theClassInstance.doSomething();
%>
Run Code Online (Sandbox Code Playgroud)

有效这里你写之间的普通的旧Java代码<%%>标签.

然而,从代码组织的角度来看,这不是最好的方法.只有表示逻辑才能进入视图.用这样的scriptlet乱丢乱是很糟糕的.

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

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