2012-03-05 105 views
7

设置 Mac OSX 10.6.8,Apache Tomcat 6.0.16,Java1.6.0_29,Eclipse IDE Indigo。在JSP中调用Java方法

我问过类似的问题在此之前,在How to execute and include a Java API from a Web App project但成立以来在改变,我现在在WebAp Java代码

我试图从一个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; 

    } 
} 

}

回答

11

首先,丑陋方式(也许因为如此相似?):

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

它被称为并被认为是一种不好的做法。事实上,这是错误的,甚至写这个我感到羞愧。你应该反而是有一个前端控制器(一个简单的servlet会做的伎俩),地点导致请求属性和转发给JSP,这反过来使用输出。

在Servlet的:

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

page.jsp:由一个数量级更多的工作,但更好的

${someData} 

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

+0

托马斯嗨 首先,感谢您的回答。我将不得不采用丑陋的方式,因为我还没有接近前端控制器的方法。 但是我不确定你的答案的确切语法 <%= com.example.MyUtility.getSomething()%>的 我的Java文件称为“slicer.java” 它有一个主包称为“sliceClient” 我要援引“sliceCreate” 我想回到一个名为“sliceHit” 代码位于WEB-INF/clases/src目录 我已经试过 <%= session.sliceClient的变化串。 getsliceHit()%> 没有成功 与往常一样,任何帮助表示赞赏 深end – Deepend 2012-03-05 17:11:47

+0

@Deepend恐怕你不得不向我们展示'slicer.java'的内容,你的命名和词汇在Java世界里有点混乱。我们不需要方法体,只需要签名(请将其添加到问题中,而不是作为评论)。从你在这里说的,也许尝试:'<%= sliceClient.sliceCreate()%>'... – 2012-03-05 17:28:08

+0

我已经将代码添加到问题现在。由于我是StackOverFlow的新手,我不知道编辑原始问题是可以接受的。 感谢您的帮助提前 Deepend – Deepend 2012-03-05 17:46:00

3

我不知道我有明白你的问题可能。

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

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

导入类,并在JSP然后

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

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

1

任何JAVA类在你的src文件夹中并导入那个类JSP这样的页面。

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

现在让我们假设您在类中的函数返回的字符串,那么你将在JSP中写为:

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

现在你可以在JSP使用stringFromJava任何地方。你也可以用相同的方式得到List。

7

那么,最简​​单的方法就是在JSP中导入你的类,并通过scriptlets调用它的方法。

要包括的类:

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

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

然后

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

有效地在这里你写普通的旧Java代码,介于<%%>之间。

然而,从代码生成的角度来看,这不是最好的方法。只有呈现逻辑应该放在视图中。用这样的脚本乱丢它是不好的。

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

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