设置 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方法并返回结果。我看了很多帖子,但我担心我用这两种语言缺乏经验是主要问题。
我有一个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;
}
}
}
答案 0 :(得分:15)
首先,丑陋方式(也许是因为与php非常相似?):
<%= com.example.MyUtility.getSomething() %>
它被称为scriptlet并被认为是一种不好的做法。事实上,这是错误的,我甚至羞于写这个。你应该做的是拥有一个前端控制器(一个简单的servlet可以做到这一点),将结果放在请求属性中并转发给JSP,而JSP又使用jstl或者输出jsp el。更多的工作,但更好的是一个数量级:
在Servlet中:
request.setAttribute("someData", MyUtility.getSomething())
RequestDispatcher dispatcher = request.getRequestDispatcher("page.jsp");
dispatcher.forward(request, response);
在page.jsp
:
${someData}
有各种框架可以减少样板量(spring-mvc是一个简单的例子)。
答案 1 :(得分:8)
嗯,最简单的方法是在JSP中导入你的类,并通过scriptlet调用它的方法。
包含课程:
<%@page import="package.subPackage.TheClassName"%>
请注意,TheClassName不包含任何后缀,例如.java或.class
然后
<%
TheClassName theClassInstance = new TheClassName();
theClassInstance.doSomething();
%>
有效地,您可以在<%
和%>
标记之间编写普通的旧Java代码。
然而,从代码组织的角度来看,这不是最佳方式。只有表示逻辑才能进入视图。使用这样的scriptlet乱丢它是不好的。
如果你需要某个类的实例方法调用的帮助,在你的视图中调用diplay,你只需创建一个执行方法调用的Tag(和任何其他非视图相关的逻辑),然后只返回需要显示的内容。这是关于那个的官方文档
答案 2 :(得分:3)
我不知道我可能理解你的问题。
您需要的是导入java类,并在JSP中运行Java代码
<%@ page import="package1.myClass1,package2.myClass2,....,packageN.myClassN" %>
导入该类,然后
<%
new ClassXXX().methodYYY();
%>
但是,在jsp中运行java代码并不是一个好主意......
答案 3 :(得分:1)
在你的src文件夹中创建任何 JAVA 类,然后像这样在 JSP 页面中导入该类。
<%@ page import="com.MyClass"%>
现在让我们假设您在类中有一个返回String的函数,然后您将在JSP中将其写为:
<%
String stringFromJava = MyClass.getStringForJSPPage();
%>
现在,您可以在 JSP 中的任何位置使用stringFromJava
。你也可以用同样的方式获得List。