java代码如下
import java.util.HashMap;
import java.util.Map;
import javax.faces.webapp.FacesServlet;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.DefaultServlet;
import org.mortbay.jetty.servlet.ServletHolder;
import org.springframework.web.context.ContextLoaderListener;
import com.sun.faces.config.ConfigureListener;
public class JettyStart {
public static void main(String arg[]) {
Server server = new Server();
Connector connector = new SocketConnector();
connector.setPort(80);
server.addConnector(connector);
Map<String, String> initParams = new HashMap<String, String>();
initParams.put("contextConfigLocation", "/WEB-INF/web-application-config.xml");
initParams.put("javax.faces.DEFAULT_SUFFIX", ".xhtml");
initParams.put("facelets.DEVELOPMENT", "true");
initParams.put("facelets.REFRESH_PERIOD", "1");
initParams.put("com.sun.faces.expressionFactory", "org.jboss.el.ExpressionFactoryImpl");
ContextLoaderListener contextLoaderListener = new ContextLoaderListener();
ConfigureListener configureListener = new ConfigureListener();
Context context = new Context(server, "/jsf", Context.SESSIONS);
context.setInitParams(initParams);
context
.setResourceBase("E:/sources/spring/spring-webflow-2.0.5.RELEASE/projects/spring-webflow-samples/jsf-booking/src/main/webapp");
context.addEventListener(contextLoaderListener);
//没有这个监听的话 就会报错Application was not properly initialized at startu
context.addEventListener(configureListener);
ServletHolder holder = new ServletHolder(new FacesServlet());
context.addServlet(holder, "*.faces");
holder = new ServletHolder(new DefaultServlet());
context.addServlet(holder, "*.html");
try {
server.start();
server.join();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
以上ConfigureListener configureListener = new ConfigureListener();这个监听是必须的,ConfigureListener 是jboss和spring对jsf的一个实现,在myface中实现为StartupServletContextListener这个类。
如果不使用jetty手动加载的话,在web.xml中定义为
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>
在没有添加ConfigureListener 监听的时候就会报下面的错误:
2009-05-05 23:28:37.062:/jsf:WARN: unavailable
java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory
at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:725)
at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:239)
at javax.faces.webapp.FacesServlet.init(FacesServlet.java:164)
at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:431)
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:667)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:222)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at JettyStart.main(JettyStart.java:53)
2009-05-05 23:28:37.078::INFO: Started SocketConnector@0.0.0.0:80