Jsf ActionListener在h:commandButton中不工作
我的.xhtml文件是:Jsf ActionListener在h:commandButton中不工作,jsf,primefaces,Jsf,Primefaces,我的.xhtml文件是: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<script name="jquery/jquery.js" library="primefaces">
</script>
</h:head>
<h:form>
<h:outputScript library="js" name="calendar.js" />
<h:outputStylesheet library="css" name="accordion.css" />
<h:panelGrid id="panel" columns="2" cellpadding="5" border="1"
cellspacing="1" bgcolor="#3bbab5">
<f:facet name="header">
<h:outputText value="REQUEST" />
</f:facet>
<h:outputLabel for="title" value="TITLE" style="font-weight:bold" />
<p:inputText id="title" required="true" style="width: 97%"
value="#{requestBean.tRequest.title}" />
<h:outputLabel for="description" value="DESC"
style="font-weight:bold" />
<p:inputTextarea id="description" rows="5" cols="30" maxlength="4000"
style="width: 97%" autoResize="false" value="#{requestBean.tRequest.description}"/>
<b>EVENT TYPE</b>
<h:selectOneMenu value="#{editEventTypeBean.selectedEventType}"
required="true" panelStyle="width:150px" effect="fade" var="t"
style="width:97%" filter="true" filterMatchMode="startsWith">
<f:selectItem itemLabel="SELECT TYPE" itemValue="" />
<f:selectItems value="#{editEventTypeBean.eventTypeModel}"
var="eventType" itemLabel="#{eventType.eventTypeName}"
itemValue="#{eventType}" />
</h:selectOneMenu>
<h:outputText style="vertical-align: top; font-weight:bold;"
value="Детайли" />
<p:accordionPanel style="border:1px solid; width:500px">
<p:tab title="ADD FILTERS">
<p:selectManyCheckbox id="chkbox1"
value="#{filterTypeBean.selectedFilterTypes}"
layout="pageDirection">
<f:selectItems var="checkbox"
value="#{filterTypeBean.listBooleanFilterTypes()}"
itemLabel="#{checkbox.filterTypeName}" itemValue="#{checkbox.id}"
required="true" requiredMessage="check at least one checkbox" />
</p:selectManyCheckbox>
<h:message for="chkbox1" style="color:red" />
<h:panelGrid id="panel2" columns="2" cellpadding="5">
<c:forEach items="${filterTypeBean.listTextFilterTypes()}"
var="inputBoxes">
<h:outputText value="${inputBoxes.filterTypeName}"
style="width: 100px; white-space: normal; border: 3px" />
<h:inputText />
</c:forEach>
<h:outputText
value="${filterTypeBean.listDateFilterType().getFilterTypeName()}"
style="width: 100px; white-space: normal; border: 3px" />
<p:calendar id="cal" value="#{calendarBean.date}" mode="popup"
showOn="button" locale="bg" navigator="true" pattern="dd.mm.yyyy"
style="width: 1px" />
</h:panelGrid>
</p:tab>
</p:accordionPanel>
<f:facet name="footer">
<h:panelGroup style="display:block; text-align:center">
<h:commandButton value="SAVE" id="saveBtn"
actionListener="#{requestBean.addRequest()}"/>
</h:panelGroup>
</f:facet>
</h:panelGrid>
</h:form>
</html>
事件类型
我的bean中的addRequest()方法没有被调用
下面是bean的一部分:
@ManagedBean(name = "requestBean")
@SessionScoped
public class RequestBean implements Serializable {
...
public void addRequest() {
System.out.println("RequestBean " );
EntityManager em = HibernateUtil.getEntityManager();
em.getTransaction().begin();
System.out.println("request: " + tRequest.getTitle());
TRequest newRequest = new TRequest(tRequest);
System.out.println("newRequest: " + newRequest);
newRequest.setRequestDate(new Date());
Query q = em.createQuery("select u from TUser u");
List<TUser> usersList = q.getResultList();
for (TUser user : usersList) {
System.out.println("User: " + user);
}
TUser author1 = new TUser();
for (TUser tUser : usersList) {
if (tUser.getId() == (Long.valueOf(2)))
author1 = tUser;
}
System.out.println("Author: " + author1.getName());
newRequest.setAuthor(author1);
try {
em.persist(newRequest);
} catch (Exception e) {
System.out.println("Exception: " + e);
}
em.getTransaction().commit();
}
@ManagedBean(name=“requestBean”)
@会议范围
公共类RequestBean实现了可序列化{
...
public void addRequest(){
System.out.println(“RequestBean”);
EntityManager em=HibernateUtil.getEntityManager();
em.getTransaction().begin();
System.out.println(“请求:+tRequest.getTitle());
TRequest newRequest=新的TRequest(TRequest);
System.out.println(“newRequest:+newRequest”);
setRequestDate(newDate());
Query q=em.createQuery(“从TUser u中选择u”);
List usersList=q.getResultList();
for(TUser用户:usersList){
System.out.println(“用户:“+User”);
}
TUser author1=新TUser();
for(TUser-TUser:usersList){
if(tUser.getId()==(Long.valueOf(2)))
author1=tUser;
}
System.out.println(“作者:+author1.getName());
newRequest.setAuthor(author1);
试一试{
em.persist(newRequest);
}捕获(例外e){
System.out.println(“异常:+e”);
}
em.getTransaction().commit();
}
我创建了一个新的.xhtml文件,只是为了测试,它可以正常工作,但在第一个文件中找不到问题
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<script name="jquery/jquery.js" library="primefaces">
</script>
</h:head>
<h:form>
<h:outputLabel for="title" value="Заглавие " style="font-weight:bold" />
<p:inputText id="title" required="true" style="width: 97%"
value="#{requestBean.tRequest.title}" />
<h:outputLabel for="description" value="Описание"
style="font-weight:bold" />
<p:inputTextarea id="description" rows="5" cols="30" maxlength="4000"
style="width: 97%" autoResize="false"
value="#{requestBean.tRequest.description}" />
<h:commandButton value="Запази" id="saveBtn"
actionListener="#{requestBean.addRequest()}" />
</h:form>
</html>
感谢您的帮助!我添加了一个转换器:
<h:selectOneMenu value="#{requestBean.selectedEventType}" required="true"
panelStyle="width:150px" effect="fade" var="t" style="width:97%"
filter="true" filterMatchMode="startsWith">
<f:selectItem itemLabel="Избери тип" itemValue="#{null}" />
<f:selectItems value="#{eventTypeBean.selectItems}" var="eventType"
itemLabel="#{eventType.eventTypeName}" itemValue="#{eventType}" />
<f:converter converterId="tEventTypeConverter" />
</h:selectOneMenu>
请尝试添加一个
,并在单击按钮后进行更新。查看您是否有任何错误。我在前面输入了错误,它给了我以下错误:为“null Converter”设置值“TEventType[id=9,eventTypeName=Team Building,eventTypeDesc=null]”时发生了转换错误。现在,请相应地修复它:)您知道如何修复:{0}:发生转换错误。当未选择任何内容时?
@PostConstruct
public void init() {
System.out.println("PostConstructor!!!");
EntityManager em = HibernateUtil.getEntityManager();
Query q = em.createQuery("select u from TEventType u");
listTEventTypes = q.getResultList();
tEventTypeMap = new LinkedHashMap<Long, TEventType>();
for (TEventType eventType : listTEventTypes) {
tEventTypeMap.put(eventType.getId(), eventType);
}
selectItems = new ArrayList<SelectItem>();
for (TEventType tEventType : list()) {
selectItems.add(new SelectItem(tEventType, tEventType
.getEventTypeName()));
}
}
private static Map<Long, TEventType> tEventTypeMap;
public TEventType find(String key) {
Long keyToLong = Long.valueOf(key);
return tEventTypeMap.get(keyToLong);
}
public List<TEventType> list() {
return new ArrayList<TEventType>(tEventTypeMap.values());
}
public Map<Long, TEventType> map() {
return tEventTypeMap;
}
public TEventType getSelectedItem() {
return selectedItem;
}
public void setSelectedItem(TEventType selectedItem) {
this.selectedItem = selectedItem;
}
public List<SelectItem> getSelectItems() {
return selectItems;
}
public class TEventTypeConverter implements Converter {
private static EventTypeBean eventType = new EventTypeBean();
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
if (value == null || value.isEmpty()) {
return null;
}
if (!value.matches("\\d+")) {
throw new ConverterException("The value is not a valid ID number: "
+ value);
}
System.out.println ("Value id: " + value);
return eventType.find(value);
}
public String getAsString(FacesContext context, UIComponent component,
Object value) {
if (value == null) {
return null; // Or an empty string, can also.
}
if (!(value instanceof TEventType)) {
throw new ConverterException("The value is not a valid TEventType: "
+ value);
}
Long id = ((TEventType) value).getId();
return (id != null) ? String.valueOf(id) : null;
}
}