我注意到有不同的bean范围,如:
@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped
Run Code Online (Sandbox Code Playgroud)
每个人的目的是什么?如何为我的bean选择合适的范围?
我刚开始阅读Core JavaServer Faces,第3版.他们这样说(强调我的):
对于可以在JSF页面中使用的bean,有两种不同的机制,CDI bean和JSF托管bean,这是一个历史事故.我们建议您使用CDI bean,除非您的应用程序必须在像Tomcat这样的普通servlet运行器上运行.
为什么?他们没有提供任何理由.我一直在使用@ManagedBean在GlassFish 3上运行的原型应用程序中的所有bean,我还没有发现任何问题.我不介意迁移@ManagedBean到@Named,但我想知道为什么我应该打扰.
我正在尝试编写一个自定义servlet(用于AJAX/JSON),我想在其中引用我@ManagedBeans的名字.我希望能够映射:
http://host/app/myBean/myProperty
至:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
Run Code Online (Sandbox Code Playgroud)
是否可以从常规servlet中按名称加载bean?是否有我可以使用的JSF servlet或帮助程序?
我似乎被春天宠坏了,这一切都太明显了.
我正在尝试通过反射从JSF页面的后备bean访问某些字段的值。问题是,当我使用getter时,我会得到正确的值,但是当我使用必要字段的get(obj)方法时,我总是会返回空值。
获取beanObject:
ELContext elcontext = FacesContext.getCurrentInstance().getELContext();
Object beanObject = FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elcontext, null, beanName);
Run Code Online (Sandbox Code Playgroud)
要在不使用getter的情况下获取字段值,请执行以下操作:
List<Field> fields = new ArrayList<Field>();
ParamsBuilder.getAllFields(fields, beanClass);
for(Field field: fields) {
field.setAccessible(true);
System.out.println(field.getName() + ": " + field.get(beanObject)); //just to see if it works
}
Run Code Online (Sandbox Code Playgroud)
getAllFields方法具有以下实现:
public static List<Field> getAllFields(List<Field> fields, Class<?> type) {
for (Field field: type.getDeclaredFields()) {
fields.add(field);
}
if (type.getSuperclass() != null) {
fields = getAllFields(fields, type.getSuperclass());
}
return fields;
}
Run Code Online (Sandbox Code Playgroud)
要使用getter获取值,请执行以下操作:
private ClassX getValue(Object beanObject, Class<?> beanClass) throws Exception {
Method getter = …Run Code Online (Sandbox Code Playgroud)