首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将DeltaSpike @WindowScoped beans移植到JSF 2.2+?

DeltaSpike是一个开源的JavaEE扩展框架,它提供了一些有用的功能和工具,用于简化JavaEE应用程序的开发。其中之一是@WindowScoped注解,它允许我们在基于浏览器窗口的上下文中管理bean的生命周期。

要将DeltaSpike @WindowScoped beans移植到JSF 2.2+,可以按照以下步骤进行操作:

  1. 确保你的项目中已经引入了DeltaSpike和JSF的相关依赖。
  2. 创建一个自定义的@WindowScoped注解,用于替代DeltaSpike的注解。例如:
代码语言:txt
复制
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 {
}
  1. 创建一个实现javax.enterprise.context.spi.Context接口的自定义上下文,用于管理@WindowScoped beans的生命周期。例如:
代码语言:txt
复制
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;
    }
}
  1. 在faces-config.xml文件中注册自定义上下文。例如:
代码语言:txt
复制
<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>
  1. 现在,你可以在JSF的Managed Bean中使用@WindowScoped注解来标记需要在浏览器窗口上下文中管理的bean了。例如:
代码语言:txt
复制
@WindowScoped
public class MyWindowScopedBean implements Serializable {
    // Bean properties and methods
}

这样,你就成功地将DeltaSpike @WindowScoped beans移植到JSF 2.2+中了。

对于更多关于DeltaSpike和JSF的信息,你可以参考以下链接:

  • DeltaSpike官方网站:https://deltaspike.apache.org/
  • JSF官方网站:https://javaee.github.io/javaserverfaces-spec/
  • 腾讯云相关产品和产品介绍链接地址:(根据实际情况填写)
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • JSF预热功能在企业前台的实践与探索

    Tech 导读 企业前台包含了企业业务大部分的对外前台系统,其中京东VOP平台(开放平台)适合于自建内网采购商城平台的企业客户。京东为这类客户专门开发API接口,对接到客户内网的网上商城,将产品SKU直接推送到客户内网,客户内部采购人员可以直接在内网商城进行下单采购,订单信息通过API接口传递到京东后台,由京东安排物流配送服务。VOP模式下,客户内网的数据信息京东并不抓取,从而实现内部采购架构的独立搭建及数据的保密与安全。 随着业务的不断发展过程中,VOP截至目前已经服务于上千家企业SaaS商城,其API接口的高并发、高可用、高可靠也就越发的重要。尽管上线时尽可能的降低对接口的波动,整个上线流程中无损下线是没问题(NP层冷备机器直至无流量打进来,JSF层下线JSF服务),但是(自身&服务提供方)上线的瞬时波动或多或少会引起系统的一阵报警,每一次性能或者可用率的报警都可能带来客诉。 JSF1.7.6对于预热策略动态下发特性的升级公告吸引了作者,所以本文也将从JSF1.7.6预热的实践测试报告中,真实的讲述预热给前台带来的体验和帮助,希望对读者有参考作用。

    02
    领券