寻找解释GET和Inject的手册?

时间:2014-12-14 08:02:42

标签: jsf java-ee dependency-injection annotations

要从XHTML facelet获取GET参数,我使用注入。我找到了一个完美的代码,但不幸的是我并不真正理解代码(如下所示)。

有人能指点我一本好的手册/文档来解释这个问题吗?由于我不太了解代码的确如何运作,因此我不知道该寻找什么。

ManagedPropertyInject.java:

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import javax.enterprise.util.Nonbinding;

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface ManagedPropertyInject {
    @Nonbinding String value() default "";
}

ManagedPropertyProducer.java:

import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.ValueExpression;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;

public class ManagedPropertyProducer {
    @Produces @ManagedPropertyInject @Dependent
    public String getStringManagedPropertyInject(InjectionPoint injectionPoint) {
        return (String) getObjectManagedPropertyInject(injectionPoint, String.class);
    }

    private Object getObjectManagedPropertyInject(InjectionPoint injectionPoint, Class expectedType) {
        String value = injectionPoint.getAnnotated().getAnnotation(ManagedPropertyInject.class).value();
        FacesContext context = FacesContext.getCurrentInstance();
        Application application = context.getApplication();
        ExpressionFactory ef = application.getExpressionFactory();
        ELContext elContext = context.getELContext();
        ValueExpression ve = ef.createValueExpression(elContext, value, expectedType);
        return ve.getValue(elContext);
    }
}

使用示例:

@Inject
@ManagedPropertyInject("#{param.language}")
private String language;

1 个答案:

答案 0 :(得分:1)

方法getStringManagedPropertyInject是使用限定符@ManagedPropertyInject注入的字符串的生产者。您的示例使用就是这种情况。因此,属性语言将接收方法getStringManagedPropertyInject返回的值。

对于后面的详细信息,我只使用了javadoc。

String value = injectionPoint.getAnnotated().getAnnotation(ManagedPropertyInject.class).value();

在注入点获取注释的值;这里#{param.language}

FacesContext context = FacesContext.getCurrentInstance();`
Application application = context.getApplication();
ExpressionFactory ef = application.getExpressionFactory();

获取用于计算EL表达式的表达式工厂。

ELContext elContext = context.getELContext();
ValueExpression ve = ef.createValueExpression(elContext, value, expectedType);

(来自javadoc :)将表达式解析为ValueExpression以供以后评估。将此方法用于引用值的表达式。 expectedtype是String,因为该值将是String。

return ve.getValue(elContext);

在上下文中返回#{param.language}的值。 param是表达式语言的预定义对象。它是HTTP请求参数的映射。所以你得到语言参数的值。

希望它会有所帮助。