DeltaSpike是一个开源的JavaEE扩展框架,它提供了一些有用的功能和工具,用于简化JavaEE应用程序的开发。其中之一是@WindowScoped注解,它允许我们在基于浏览器窗口的上下文中管理bean的生命周期。
要将DeltaSpike @WindowScoped beans移植到JSF 2.2+,可以按照以下步骤进行操作:
import javax.enterprise.context.NormalScope;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@NormalScope(passivating = true)
public @interface WindowScoped {
}
import javax.enterprise.context.spi.Context;
import javax.enterprise.context.spi.Contextual;
import javax.enterprise.context.spi.CreationalContext;
import javax.faces.context.FacesContext;
public class WindowScopedContext implements Context {
@Override
public Class<? extends Annotation> getScope() {
return WindowScoped.class;
}
@Override
public <T> T get(Contextual<T> contextual, CreationalContext<T> creationalContext) {
Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
T bean = (T) sessionMap.get(contextual);
if (bean == null) {
bean = contextual.create(creationalContext);
sessionMap.put(contextual, bean);
}
return bean;
}
@Override
public <T> T get(Contextual<T> contextual) {
Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
return (T) sessionMap.get(contextual);
}
@Override
public boolean isActive() {
return true;
}
}
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<application>
<el-resolver>org.apache.deltaspike.jsf.spi.scope.window.WindowClientWindowAwareElResolver</el-resolver>
<el-resolver>org.apache.deltaspike.jsf.spi.scope.window.ClientWindowAwareElResolver</el-resolver>
<el-resolver>org.apache.deltaspike.jsf.spi.scope.window.DefaultClientWindowAwareElResolver</el-resolver>
</application>
<factory>
<faces-context-factory>org.apache.deltaspike.jsf.impl.scope.window.WindowContextFactory</faces-context-factory>
</factory>
<lifecycle>
<phase-listener>org.apache.deltaspike.jsf.impl.scope.window.WindowScopePhaseListener</phase-listener>
</lifecycle>
<application>
<view-handler>org.apache.deltaspike.jsf.impl.view.ViewHandlerWrapper</view-handler>
</application>
<application>
<default-render-kit-id>PRIMEFACES_MOBILE</default-render-kit-id>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
<application>
<resource-handler>org.apache.deltaspike.jsf.impl.resource.DeltaSpikeResourceHandler</resource-handler>
</application>
</faces-config>
@WindowScoped
public class MyWindowScopedBean implements Serializable {
// Bean properties and methods
}
这样,你就成功地将DeltaSpike @WindowScoped beans移植到JSF 2.2+中了。
对于更多关于DeltaSpike和JSF的信息,你可以参考以下链接:
领取专属 10元无门槛券
手把手带您无忧上云