2012-03-05 43 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