基本上我正在尝试使用自动填充的primefaces搜索我的社交网络项目中的用户。我面临的问题是,每当新用户注册时,自动完成功能有时会在建议中显示新用户,有时无法显示。通常,在第一次用户注册自动完成时,在建议中显示用户的姓名,但是当另一个用户注册时,第二次,他的名字没有显示在建议中。我认为userDB没有得到更新。但每当我重新部署项目时,一切都运转良好。用户名显示在自动填充中。
1)的XHTML
<div class="det">
<h:form style="float:right;font-size:small;">
<h:outputText value="Search your friends here."
style="font-size:small;color:#CCCCCC;" />
<p:autoComplete id="auto" value="#{searchBean.selectedUser}"
completeMethod="#{searchBean.completeUser}" var="p"
itemLabel="#{p.userName}" itemValue="#{p}"
converter="userConverter" forceSelection="true"
style="width:300px;">
<p:column>
<img src="../images/profilePicture/thumb/#{p.image}"
style="height: 40px; width: 40px;" />
</p:column>
<p:column>
#{p.firstName} #{p.lastName}
</p:column>
</p:autoComplete>
<h:commandButton image="../Image/magnify.png"
action="#{searchBean.navigate}" style="height:20px;float:right;" />
<br />
</h:form>
</div>
2)用户转换器
package com.bean;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import com.entity.User;
public class UserConverter implements Converter {
public static List<User> userDB;
static EntityManagerFactory emf=Persistence.createEntityManagerFactory("FreeBird");
static EntityManager em =emf.createEntityManager();
static {
userDB = new ArrayList<User>();
Query query = em.createQuery("SELECT u FROM User u", User.class);
userDB =query.getResultList();
}
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
if (submittedValue.trim().equals("")) {
return null;
} else {
try {
for (User p : userDB) {
if (p.getUserName().equalsIgnoreCase(submittedValue)) {
return p;
}
}
} catch(Exception exception) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid user"));
}
}
return null;
}
public String getAsString(FacesContext facesContext, UIComponent component, Object value) {
if (value == null || value.equals("")) {
return "";
} else {
return String.valueOf(((User) value).getUserName());
}
}
}
3)搜索Bean
package com.bean;
import com.bean.UserConverter;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.http.HttpSession;
import com.entity.User;
public class SearchBean {
private EntityManager em;
private User selectedUser;
private List<User> users;
public SearchBean(){
users = UserConverter.userDB;
EntityManagerFactory emf=Persistence.createEntityManagerFactory("FreeBird");
em =emf.createEntityManager();
}
public User getSelectedUser() {
return selectedUser;
}
public void setSelectedUser(User selectedUser) {
this.selectedUser = selectedUser;
}
public List<User> completeUser(String query){
List<User> suggestions = new ArrayList<User>();
for(User u : users){
if(u.getUserName().startsWith(query))
suggestions.add(u);
}
return suggestions;
}
public String navigate(){
User friend=em.find(User.class,selectedUser.getEmail());
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
session.setAttribute("frienddet",friend);
return "searchsuccess";
}
}
4)注册Bean
package com.bean;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.servlet.http.HttpSession;
import org.primefaces.event.FlowEvent;
import com.entity.User;
public class RegistrationBean {
User user ;
private EntityManager em;
private boolean skip;
private static Logger logger = Logger.getLogger(RegistrationBean.class.getName());
public RegistrationBean(){
user=new User();
EntityManagerFactory emf=Persistence.createEntityManagerFactory("FreeBird");
em =emf.createEntityManager();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public boolean isSkip() {
return skip;
}
public void setSkip(boolean skip) {
this.skip = skip;
}
public String Save(){
System.out.println("registration save called");
em.getTransaction().begin();
em.persist(user);
em.getTransaction().commit();
FacesContext context = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
session.setAttribute("userdet",this.user);
return "success";
}
public String onFlowProcess(FlowEvent event) {
logger.info("Current wizard step:" + event.getOldStep());
logger.info("Next step:" + event.getNewStep());
if(skip) {
skip = false; //reset in case user goes back
return "confirm";
}
else {
return event.getNewStep();
}
}
}
5)注册xhtml
<p:growl id="growl" sticky="true" showDetail="true" />
<p:wizard widgetVar="wiz"
flowListener="#{registrationBean.onFlowProcess}"
style="text-size:small;">
<p:tab id="personal" title="Personal">
<p:panel header="Personal Details">
<h:panelGrid columns="3" columnClasses="label, value"
styleClass="grid">
<h:outputText value="Username*" />
<p:inputText id="usrname" required="true" label="Username"
value="#{registrationBean.user.userName}"
requiredMessage="Username required" />
<p:message for="usrname"></p:message>
<h:outputText value="Firstname: *" />
<p:inputText id="frstname" required="true" label="Firstname"
value="#{registrationBean.user.firstName}"
requiredMessage="Firstname required" />
<p:message for="frstname"></p:message>
<h:outputText value="Lastname: *" />
<p:inputText id="lstname" required="true" label="Lastname"
value="#{registrationBean.user.lastName}"
requiredMessage="Lastname required" />
<p:message for="lstname"></p:message>
<h:outputText value="Password: *" />
<p:password id="pwd1" value="#{registrationBean.user.password}"
feedback="true" match="pwd2" label="Password" required="true"
requiredMessage="Password required" />
<p:message for="pwd1"></p:message>
<h:outputText value="Confirm Password: *" />
<p:password id="pwd2" value="#{registrationBean.user.password}"
feedback="true" label="Confirm Password" required="true" />
<p:message for="pwd2"></p:message>
<h:outputText value="Date of Birth:" />
<p:calendar value="#{registrationBean.user.birthDate}"
pattern="dd/MM/yyyy" mode="popup" showOn="button"
navigator="true"></p:calendar>
<p:message for="frstname"></p:message>
<h:outputText value="Gender: " />
<p:inputText label="Gender"
value="#{registrationBean.user.gender}" />
<p:message for="frstname"></p:message>
<h:outputText value="Relationship Status: " />
<p:inputText label="Relationship Status"
value="#{registrationBean.user.relationship}" />
<p:message for="frstname"></p:message>
<h:outputText value="Skip to last: " />
<h:selectBooleanCheckbox value="#{registrationBean.skip}" />
</h:panelGrid>
</p:panel>
</p:tab>
<p:tab id="address" title="Address">
<p:panel header="Adress Details">
<h:messages errorClass="error" />
<h:panelGrid columns="2" columnClasses="label, value">
<h:outputText value="Street: " />
<p:inputText value="#{registrationBean.user.street}" />
<h:outputText value="City: " />
<p:inputText label="City" value="#{registrationBean.user.city}" />
<h:outputText value="Pincode: " />
<p:inputText value="#{registrationBean.user.pincode}" />
<h:outputText value="State: " />
<p:inputText label="State"
value="#{registrationBean.user.state}" />
<h:outputText value="Country: " />
<p:inputText label="Country"
value="#{registrationBean.user.country}" />
<h:outputText value="Skip to last: " />
<h:selectBooleanCheckbox value="#{registrationBean.skip}" />
</h:panelGrid>
</p:panel>
</p:tab>
<p:tab id="contact" title="Contact">
<p:panel header="Contact Information">
<h:messages errorClass="error" />
<h:panelGrid columns="2" columnClasses="label, value">
<h:outputText value="Email: *" />
<p:inputText label="Email"
value="#{registrationBean.user.email}" />
<h:outputText value="Contact Number: " />
<p:inputText value="#{registrationBean.user.contactNo}" />
</h:panelGrid>
</p:panel>
</p:tab>
<p:tab id="education" title="Education">
<p:panel header="Education Information">
<h:messages errorClass="error" />
<h:panelGrid columns="2" columnClasses="label, value">
<h:outputText value="Secondary School: " />
<p:inputText label="Secondary School"
value="#{registrationBean.user.secondarySchool}" />
<h:outputText value="High School: " />
<p:inputText label="High School"
value="#{registrationBean.user.highSchool}" />
<h:outputText value="College: " />
<p:inputText label="College"
value="#{registrationBean.user.college}" />
<h:outputText value="University: " />
<p:inputText label="University"
value="#{registrationBean.user.university}" />
<h:outputText value="Degree: " />
<p:inputText label="Degree"
value="#{registrationBean.user.degree}" />
</h:panelGrid>
</p:panel>
</p:tab>
<p:tab id="other" title="Other">
<p:panel header="Other Information">
<h:messages errorClass="error" />
<h:panelGrid columns="2" columnClasses="label, value">
<h:outputText value="Quote: *" />
<p:inputText value="#{registrationBean.user.quote}" />
<h:outputText value="About Me: " />
<p:inputText value="#{registrationBean.user.aboutMe}" />
<h:outputText value="Interest: " />
<p:inputText value="#{registrationBean.user.interest}" />
</h:panelGrid>
</p:panel>
</p:tab>
<p:tab id="confirm" title="Confirmation">
<p:panel header="Confirmation">
<h:panelGrid id="confirmation" columns="6">
<h:outputText value="Username: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.userName}" />
<h:outputText value="Firstname: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.firstName}" />
<h:outputText value="Lastname: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.lastName}" />
<h:outputText value="Password: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.password}" />
<h:outputText value="Date of Birth: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.birthDate}" />
<h:outputText value="Gender: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.gender}" />
<h:outputText value="Relationship: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.relationship}" />
<h:outputText value="EmailID: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.email}" />
<h:outputText value="Contact No.: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.contactNo}" />
<h:outputText value="Street: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.street}" />
<h:outputText value="City: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.city}" />
<h:outputText value="Pincode: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.pincode}" />
<h:outputText value="State: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.state}" />
<h:outputText value="Country: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.country}" />
<h:outputText value="Secondary School: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.secondarySchool}" />
<h:outputText value="High School: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.highSchool}" />
<h:outputText value="College: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.college}" />
<h:outputText value="University: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.university}" />
<h:outputText value="Degree: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.degree}" />
<h:outputText value="Quote: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.quote}" />
<h:outputText value="About Me: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.aboutMe}" />
<h:outputText value="Interest: " />
<h:outputText styleClass="outputLabel"
value="#{registrationBean.user.interest}" />
<h:outputText />
<h:outputText />
</h:panelGrid>
<p:commandButton value="Submit" update="growl"
action="#{registrationBean.Save}" />
</p:panel>
</p:tab>
</p:wizard>
答案 0 :(得分:1)
此
static {
userDB = new ArrayList<User>();
Query query = em.createQuery("SELECT u FROM User u", User.class);
userDB =query.getResultList();
}
初始化您的用户列表。首次加载UserConverter类时会发生这种情况(When is the static block of a class executed?)。生成自动填充建议时,请参阅此列表。
添加新用户时,永远不会重新生成此列表。这就是您没有看到新增用户的原因。
创可贴方法是将该代码移动到类方法中,并在每次添加新用户或需要生成建议列表时调用它:
public class UserConverter implements Converter {
public static void regenerateUserDB {
Query query = em.createQuery("SELECT u FROM User u", User.class);
userDB = query.getResultList();
}
}
public class SearchBean {
public List<User> completeUser(String query){
List<User> suggestions = new ArrayList<User>();
UserConverter.regenerateUserDB();
for(User u : UserConverter.userDB){
if(u.getUserName().startsWith(query))
suggestions.add(u);
}
return suggestions;
}
}
解决这个问题的正确方法是使用依赖注入框架,因此您不必在所使用的每个类中构建新的EMF - 这会浪费资源并导致问题。见http://en.wikipedia.org/wiki/Dependency_injection#Java。