要从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;
答案 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请求参数的映射。所以你得到语言参数的值。
希望它会有所帮助。