我有一些属性文件/WEB-INF.我想在JSF托管bean中加载它.有没有办法做到这一点?
我使用Spring Java邮件和Velocity模板开发了一个电子邮件服务,如下所示.
Email.java
@Component
public class Email {
private JavaMailSender mailSender;
private VelocityEngine velocityEngine;
@Autowired
private ApplReviewService applReviewService;
@Autowired
private UserService userService;
public void setUserService(UserService userService ) {
this.userService=userService;
}
public UserService getuserService() {
return userService;
}
@Autowired
@Required
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public VelocityEngine getVelocityEngine() {
return velocityEngine;
}
@Autowired
@Required
public void setVelocityEngine(VelocityEngine velocityEngine) {
this.velocityEngine = velocityEngine;
}
Run Code Online (Sandbox Code Playgroud)
//发送电子邮件的方法 }
我的Spring.xml
<context:component-scan base-package="com.test.common"/>
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
</bean>
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties"> …Run Code Online (Sandbox Code Playgroud) 我需要从servlet访问会话范围的bean.我已经试过了
UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
Run Code Online (Sandbox Code Playgroud)
如在此描述的职位.但是我只得到null作为结果,尽管UserBean的实例是alreay instatiated.这些是我用于userBean的注释/导入:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class UserBean implements Serializable{
... }
Run Code Online (Sandbox Code Playgroud)
一些背景为什么我无法摆脱servlet:我的jsf页面中有一个文件上传小程序.这个小程序需要一个地址,它可以发送它的POST请求.(我无法编辑此帖子请求以添加更多字段或其他内容).然后我的servlet的post方法存储文件.托管bean无法完成此作业,因为必须使用@MultiPartConfig注释servlet,并且我无法将此批注添加到jsf托管bean.
我有一个会话作用域CDI托管bean:
@Named
@SessionScoped
public class SampleBean implements Serializable {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我需要在某个流程之后从会话中删除这个bean,我使用了以下代码,如下面的答案所示:
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.getSessionMap().remove("sampleBean");
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用,并且SampleBean在会话中仍然存在.
我错过了什么吗?
通过我在创建托管bean方面所做的所有研究,我没有注意到(或者我可能忽略的)是何时使用bean的显式命名,例如@Named(name = "someBean").
我想我很难理解为什么你想要将bean命名为除了你的类名之外的其他东西:
@Named(name = "someBean")
public class SomeBean implements Serializebale {
}
Run Code Online (Sandbox Code Playgroud)
在我看到的所有示例中,有些使用显式名称,有些只是@Named用来保留默认的类名.这些例子没有解释为什么他们使用显式命名.尝试使用除类名之外的任何东西来访问bean似乎更令人困惑.
所以我想问题是,是否有任何经验法则或约定何时你想要提供一个与你的班级名称不同的访问名称,或者如果他们有一个他们希望能够拥有的长类名,人们就会这样做打字少打字?
在我的页面中有一些commandButton打开对话框.表有300行,关闭HTML对话框后不会破坏并保留在HTML页面中.我想隐藏后在对话框中销毁数据.然后单击commandButton重复操作加载对话框并在对话框中加载数据.我发现了这种方法
<p:ajax event="close" update="growl" listener="#{dialogBean.handleClose}"/>
Run Code Online (Sandbox Code Playgroud)
但不知道如何从facescontext中销毁对话框.
我在下面的会话作用域CDI托管bean:
@Named
@SessionScoped
public class RegisterController implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private MitgliedAbc mitgliedAbc;
public MitgliedAbc getMitgliedABC() {
return mitgliedAbc;
}
public void setMitgliedAbc (MitgliedAbc mitgliedAbc) {
this.mitgliedAbc = mitgliedAbc;
}
}
Run Code Online (Sandbox Code Playgroud)
并以JSF形式输入以下内容:
<h:inputText value="#{registerController.mitgliedAbc.mgEmail}" />
Run Code Online (Sandbox Code Playgroud)
部署到GlassFish 4.1并在浏览器中打开页面时,会引发以下异常:
javax.el.PropertyNotFoundException:/register.xhtml @ 27,66 value ="#{registerController.mitgliedAbc.mgEmail}":类'com.example.RegisterController'没有可读属性'mitgliedAbc'.
这是怎么造成的,我该如何解决?
我正在使用<ui:include>加载数据表(我正在使用Primefaces).我想<ui:param>在listener标签中使用<p:ajax>.我测试了关闭的代码,但没有触发事件onRowEdit或onRowCancel.这是我的页面:
...
<ui:include src="../Componentes/tablaEditable.xhtml">
<ui:param name="columnas" value="#{tabla2FuentesHL7.dataTableColumns}" />
<ui:param name="bean" value="#{tabla2FuentesHL7.listTabla2FuenteDTO}" />
<ui:param name="aceptarEdicion" value="#{tabla2FuentesHL7.onRowEdit}" />
<ui:param name="cancelarEdicion" value="#{tabla2FuentesHL7.onRowCancel}" />
</ui:include>
...
Run Code Online (Sandbox Code Playgroud)
我的数据表:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:form >
<p:dataTable value="#{bean}" scrollable="true" scrollHeight="100" var="dato" editable="true">
<p:ajax event="rowEdit" listener="#{aceptarEdicion}" />
<p:ajax event="rowEditCancel" listener="#{cancelarEdicion}" />
<c:forEach items="#{columnas}" var="column" varStatus="loop">
<p:column headerText="#{column.header}" sortBy="#{dato[column.property]}">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{dato[column.property]}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{dato[column.property]}" style="width:100%" />
</f:facet>
</p:cellEditor> …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过反射从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) 所以我制作了一个复合组件FileAdder.xhtml
<composite:interface>
<composite:attribute name="type" value="#{editoriCompositeController.typeString}"/>
</composite:interface>
<composite:implementation>
<h:form>
<p:editor id="editor" widgetVar="editorWidget" value="some text" width="600" />
</h:form>
</composite:implementation>
Run Code Online (Sandbox Code Playgroud)
然后我有EditoriCompositeController ManagedBean:
@ViewScoped
@ManagedBean
public class EditoriCompositeController {
String typeString;
public void setTypeString(String typeStringParameter) {
this.typeString = typeStringParameter;
}
public String getTypeString() {
return typeString;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的fileattachmentsview.xhtml中我使用组件:
<owncomponents:fileadder type="MEMO" />
Run Code Online (Sandbox Code Playgroud)
但这并没有将支持bean中的typeString值设置为"MEMO".它保持为null我用一个打印值的按钮测试它.
如何使支持bean获得typeString我设置为复合组件的type-attribute 的值为"MEMO"?为什么null而不是"备忘录"?
attributes primefaces composite-component managed-bean jsf-2.2
managed-bean ×10
jsf ×7
cdi ×3
java ×2
jsf-2 ×2
primefaces ×2
applet ×1
attributes ×1
autowired ×1
destroy ×1
el ×1
facelets ×1
java-ee ×1
jsf-2.2 ×1
properties ×1
reflection ×1
servlets ×1
spring ×1
uiinclude ×1
web-inf ×1