Eclipse RCP插件+embedded式Jetty + JSF
我使用embedded式Jetty制作了一个RCP插件,如下所示:
1)在plugin.xml – > Dependencies中,我添加了以下内容:
org.eclipse.equinox.http.jetty org.eclipse.equinox.http.registry org.mortbay.jetty.server javax.servlet
2)在plugin.xml – > Extensions中,我添加了一个Servlet扩展点( org.eclipse.equinox.http.registry.servlet )
class: TemperatureServlet alias:/temperature
TemperatureServlet看起来像这样:
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TemperatureServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet Called"); resp.sendRedirect("Convertor.jsp"); } }
Convertor.jsp文件如下所示:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <f:view> <h:form> <h:panelGrid columns="2"> <h:outputLabel value="Celsius"></h:outputLabel> <h:inputText value="#{temperatureConvertor.celsius}"></h:inputText> </h:panelGrid> <h:commandButton action="#{temperatureConvertor.celsiusToFahrenheit}" value="Calculate"></h:commandButton> <h:commandButton action="#{temperatureConvertor.reset}" value="Reset"></h:commandButton> <h:messages layout="table"></h:messages> </h:form> <h:panelGroup rendered="#{temperatureConvertor.initial!=true}"> <h3> Result </h3> <h:outputLabel value="Fahrenheit "></h:outputLabel> <h:outputLabel value="#{temperatureConvertor.fahrenheit}"></h:outputLabel> </h:panelGroup> </f:view> </body> </html>
文件faces-config.xml包含:
<?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0"> <managed-bean> <managed-bean-name>temperatureConvertor</managed-bean-name> <managed-bean-class>hellojsf.TemperatureConvertor</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config>
我的插件有以下层次结构:
plugin-name ---src ------class package ---------Activator.java ---------Application.java ---------ApplicationActionBarAdvisor.java ---------ApplicationWorkbenchWindowAdvisor.java ---------Perspective.java ---------TemperatureConvertor.java ---------TemperatureServlet.java ---META-INF ------MANIFEST.MF ---resources -------WebContent ----------WEB-INF -------------faces-config.xml -------------web.xml ----------Convertor.jsp ---plugin.xml
在Activator类中,方法start (),我已经启动了这样的Web服务器:
public void start(BundleContext context) throws Exception { super.start(context); plugin = this; Bundle bundle = Platform.getBundle("org.eclipse.equinox.http.registry"); if (bundle.getState() == Bundle.RESOLVED) { bundle.start(Bundle.START_TRANSIENT); } Dictionary settings = new Hashtable(); settings.put("http.enabled", Boolean.TRUE); settings.put("http.port", 8080); settings.put("http.host", "0.0.0.0"); settings.put("https.enabled", Boolean.FALSE); settings.put("context.path", "/"); settings.put("context.sessioninactiveinterval", 1800); try { JettyConfigurator.startServer(PLUGIN_ID + ".jetty", settings); } catch (Exception e) { e.printStackTrace(); } }
对于这个插件,我还添加了以下库:
- JSTL:javax.servlet.jsp.jstl-1.2.1-javadoc.jar; javax.servlet.jsp.jstl-API-1.2.1-javadoc.jar
- JSF 2.0(Apache MyFaces JSF Core-2.0 API 2.0.2)
我启动应用程序后,如果我input我的浏览器localhost:8080 /温度
它不知道在哪里可以findConvertor.jsp。 我的问题是:如何configuration这个插件来知道资源位置WebContent和最重要的,我怎样才能configuration插件知道如何处理JSF和了解faces-config.xml和web.xml。
我可以,例如,当我定义扩展org.eclipse.equinox.http.registry.servlets,做这样的事情? 类:javax.faces.webapp.FacesServlet alis:/*.jsp
(所有文件* .jsp由FacesServlet处理)?
非常感谢你,如果问题很傻,我很抱歉,但是我是RCP插件,Jetty和JSF的新成员。
看看在docker设置一个上下文 。 你可以在启动你的服务器之前定义它。
public class OneWebApp { public static void main(String[] args) throws Exception { String jetty_home = System.getProperty("jetty.home",".."); Server server = new Server(8080); WebAppContext webapp = new WebAppContext(); webapp.setContextPath("/"); webapp.setWar(jetty_home+"/webapps/test.war"); server.setHandler(webapp); server.start(); server.join(); } }
org.eclipse.equinox.jsp.jasper.registry中的JSP扩展工厂类提供JSP支持,以便与servlet扩展点一起使用。
JSPFactory可以与org.eclipse.equinox.http.registry和Servlet扩展点一起使用,以允许在扩展注册中声明使用JSP。
JSPFactory将接受与包中的基本path相对应的“path”参数来查找JSP资源。 此参数可以使用“:”分隔符方法或xml参数进行设置。
例如class =“org.eclipse.equinox.jsp.jasper.registry.JSPFactory:/ A / PATH”或