由Servlet获得FacesContext及ManagedBeans
项目中需要通过一链接直接进入JSF生命周期, 苦思冥想无法解决. Google之, 得解. 现帖出那位老外的代码, 很有用的工具类.
public abstract class AbstractFacesServlet extends HttpServlet {
/** Creates a new instance of AbstractFacesServlet */
public AbstractFacesServlet() {
super();
}
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
protected abstract void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException;
/**
* Handles the HTTP GET method.
*
* @param request
* servlet request
* @param response
* servlet response
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
protected void log(FacesContext facesContext, String message) {
facesContext.getExternalContext().log(message);
}
/**
* Handles the HTTP POST method.
*
* @param request
* servlet request
* @param response
* servlet response
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}||| protected FacesContext getFacesContext(HttpServletRequest request,
HttpServletResponse response) {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext == null) {
FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder
.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder
.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory
.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
facesContext = contextFactory.getFacesContext(request.getSession()
.getServletContext(), request, response, lifecycle);
// Set using our inner class
InnerFacesContext.setFacesContextAsCurrentInstance(facesContext);
// set a new viewRoot, otherwise context.getViewRoot returns null
UIViewRoot view = facesContext.getApplication().getViewHandler()
.createView(facesContext, "cms");
facesContext.setViewRoot(view);
}
return facesContext;
}
protected Object getBean(String beanName, FacesContext facesContext) {
return facesContext.getApplication().getVariableResolver().resolveVariable(facesContext, beanName);
}
// You need an inner class to be able to call
// FacesContext.setCurrentInstance
// since it's a protected method
private abstract static class InnerFacesContext extends FacesContext {
protected static void setFacesContextAsCurrentInstance(
FacesContext facesContext) {
FacesContext.setCurrentInstance(facesContext);
}
}
}
public abstract class AbstractFacesServlet extends HttpServlet {
/** Creates a new instance of AbstractFacesServlet */
public AbstractFacesServlet() {
super();
}
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
protected abstract void processRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException;
/**
* Handles the HTTP GET method.
*
* @param request
* servlet request
* @param response
* servlet response
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}||| protected void log(FacesContext facesContext, String message) {
facesContext.getExternalContext().log(message);
}
/**
* Handles the HTTP POST method.
*
* @param request
* servlet request
* @param response
* servlet response
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
protected FacesContext getFacesContext(HttpServletRequest request,
HttpServletResponse response) {
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext == null) {
FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder
.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder
.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
Lifecycle lifecycle = lifecycleFactory
.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
facesContext = contextFactory.getFacesContext(request.getSession()
.getServletContext(), request, response, lifecycle);
// Set using our inner class
InnerFacesContext.setFacesContextAsCurrentInstance(facesContext);
// set a new viewRoot, otherwise context.getViewRoot returns null
UIViewRoot view = facesContext.getApplication().getViewHandler()
.createView(facesContext, "cms");
facesContext.setViewRoot(view);
}
return facesContext;
}
protected Object getBean(String beanName, FacesContext facesContext) {
return facesContext.getApplication().getVariableResolver().resolveVariable(facesContext, beanName);
}
// You need an inner class to be able to call
// FacesContext.setCurrentInstance
// since it's a protected method
private abstract static class InnerFacesContext extends FacesContext {
protected static void setFacesContextAsCurrentInstance(
FacesContext facesContext) {
FacesContext.setCurrentInstance(facesContext);
}
}
}
后面就不用多说了吧,继承此类,然后实现processRequest方法.考试吧Oracle站编辑整理
编辑推荐:
温馨提示:因考试政策、内容不断变化与调整,长理培训网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准! (责任编辑:长理培训)
点击加载更多评论>>