为什么 primefaces 自动完成不适用于包含引号 ' 的字符串?
Why primefaces auto complete doesnot working on String containing quotes '?
自动完成方法成功显示了用户名的字符串列表,但没有将其添加到所选用户。我尝试并搜索了很多,请帮助我。
xhtml 文件
...
...
<div class="ui-sm-12 ui-md-2 ui-lg-2">
<p:outputLabel value="Users" />
</div>
<div class="ui-sm-12 ui-md-4 ui-lg-4">
<h:inputHidden value="#{service.usersListSize}" id="iTUsers" />
<p:autoComplete id="usersid" widgetVar="userswVar" maxlength="60" minQueryLength="1"
maxResults="10" styleClass="actCont" style="width: 100%;height:50px;"
value="#{service.users}"
completeMethod="#{service.completeUserName}" var="u" unique="true"
itemLabel="#{u}" itemValue="#{u}" multiple="true" forceSelection="true" disabled="#{service.disableFields}">
<p:ajax event="itemSelect" listener="#{service.getListValues()}" update="jbForm:tabview:iTUsers"/>
</p:autoComplete>
</div>
...
...
Service.java 文件
....
....
private int usersListSize;
private List<String> users = new ArrayList<>();
public int getUsersListSize() {
return usersListSize;
}
public void setUsersListSize(int usersListSize) {
this.usersListSize = usersListSize;
}
public List<String> getUsers() {
return users;
}
public void setUsers(List<String> users) {
this.users = users;
}
public List<String> completeUerName(String query) {
if (!query.startsWith("@")) {
return new ArrayList<>();
}
String queryLowerCase = query.toLowerCase();
List<String> uName = getListOfUsersName();
return uName.stream().filter(t -> t.toLowerCase().contains(queryLowerCase)).collect(Collectors.toList());
}
public List<String> getListOfUsersName() {
List<String> usersNamesList;
usersNamesList.add("jhon");
usersNamesList.add("jhonny");
usersNamesList.add("Richard D'souza");
usersNamesList.add("sheri'f");
usersNamesList.add("ja'mes");
List<String> userNameList = new ArrayList<>();
for (String u : usersNamesList) {
userNameList.add("@" + u);
}
return userNameList.stream().filter(t -> t.toLowerCase().contains("@")).collect(Collectors.toList());
}
public void getListValues() {
setUsersListSize(this.users.size());
}
public void listUsers(Integer id) {
users = retrieveUsersLst(id);
}
public List<String> retrieveUsersLst(Integer id) {
List<String> ppList = new ArrayList<>();
List<Users> userList = usersList(id);
if (userList != null && !userList .isEmpty()) {
int listSize = userList .size();
String userName;
for (int i = 0; i < listSize; i++) {
userName = "@" + getUserName(userList .get(i).getId());
ppList.add(userName);
}
}
return ppList;
}
public List<Users> usersList(Integer id) {
String queryString = "from Users where id=" + id;
return dao.qryList(queryString, Dao.query.HQL);
}
public String getUserName(Integer uId) {
String queryString = "select userName from Users where id=" + uId;
return (String) dao.qryUniqueResult(queryString, Dao.query.HQL);
}
它工作正常,除非用户名包含任何引号 Like this ' 那么该值未被选择。我不知道为什么。
请帮我解决这个问题。提前致谢。
使用素面 6.2.
问题在于 PF 6.2 中如何管理自动完成的唯一属性。
如您所见,在任何浏览器开发人员工具中,单击包含 ' 字符的项目都会产生错误,如下所示:
Uncaught Error: Syntax error, unrecognized expression: li[data-token-value='@Richard D'souza']
components.js中的错误是:
PrimeFaces.widget.AutoComplete
...
h = PrimeFaces.escapeHTML(e.replace(/\"/g, '\''));
...
if (a.cfg.multiple) {
var j = false;
if (a.cfg.unique) {
j = a.multiItemContainer.children('li[data-token-value=\'' + h + '\']').length != 0
}
请注意,如果您键入整个字符串,则不会出现错误,并且会添加该项目。
这已在较新的 PF 版本中解决:
PrimeFaces.widget.AutoComplete
...
var i = f.attr("data-item-value");
...
if (a.cfg.multiple) {
var h = false;
if (a.cfg.unique) {
h = a.multiItemContainer.children("li[data-token-value='" + $.escapeSelector(i) + "']").length != 0
}
作为解决方案,您可以:
- 升级PF, >= 7.0
- 删除唯一属性,如果您的用例不需要它,或者在选择事件(服务器端)管理它
- 覆盖该函数,在 PF 6.2 中添加转义逻辑
自动完成方法成功显示了用户名的字符串列表,但没有将其添加到所选用户。我尝试并搜索了很多,请帮助我。
xhtml 文件
...
...
<div class="ui-sm-12 ui-md-2 ui-lg-2">
<p:outputLabel value="Users" />
</div>
<div class="ui-sm-12 ui-md-4 ui-lg-4">
<h:inputHidden value="#{service.usersListSize}" id="iTUsers" />
<p:autoComplete id="usersid" widgetVar="userswVar" maxlength="60" minQueryLength="1"
maxResults="10" styleClass="actCont" style="width: 100%;height:50px;"
value="#{service.users}"
completeMethod="#{service.completeUserName}" var="u" unique="true"
itemLabel="#{u}" itemValue="#{u}" multiple="true" forceSelection="true" disabled="#{service.disableFields}">
<p:ajax event="itemSelect" listener="#{service.getListValues()}" update="jbForm:tabview:iTUsers"/>
</p:autoComplete>
</div>
...
...
Service.java 文件
....
....
private int usersListSize;
private List<String> users = new ArrayList<>();
public int getUsersListSize() {
return usersListSize;
}
public void setUsersListSize(int usersListSize) {
this.usersListSize = usersListSize;
}
public List<String> getUsers() {
return users;
}
public void setUsers(List<String> users) {
this.users = users;
}
public List<String> completeUerName(String query) {
if (!query.startsWith("@")) {
return new ArrayList<>();
}
String queryLowerCase = query.toLowerCase();
List<String> uName = getListOfUsersName();
return uName.stream().filter(t -> t.toLowerCase().contains(queryLowerCase)).collect(Collectors.toList());
}
public List<String> getListOfUsersName() {
List<String> usersNamesList;
usersNamesList.add("jhon");
usersNamesList.add("jhonny");
usersNamesList.add("Richard D'souza");
usersNamesList.add("sheri'f");
usersNamesList.add("ja'mes");
List<String> userNameList = new ArrayList<>();
for (String u : usersNamesList) {
userNameList.add("@" + u);
}
return userNameList.stream().filter(t -> t.toLowerCase().contains("@")).collect(Collectors.toList());
}
public void getListValues() {
setUsersListSize(this.users.size());
}
public void listUsers(Integer id) {
users = retrieveUsersLst(id);
}
public List<String> retrieveUsersLst(Integer id) {
List<String> ppList = new ArrayList<>();
List<Users> userList = usersList(id);
if (userList != null && !userList .isEmpty()) {
int listSize = userList .size();
String userName;
for (int i = 0; i < listSize; i++) {
userName = "@" + getUserName(userList .get(i).getId());
ppList.add(userName);
}
}
return ppList;
}
public List<Users> usersList(Integer id) {
String queryString = "from Users where id=" + id;
return dao.qryList(queryString, Dao.query.HQL);
}
public String getUserName(Integer uId) {
String queryString = "select userName from Users where id=" + uId;
return (String) dao.qryUniqueResult(queryString, Dao.query.HQL);
}
它工作正常,除非用户名包含任何引号 Like this ' 那么该值未被选择。我不知道为什么。 请帮我解决这个问题。提前致谢。 使用素面 6.2.
问题在于 PF 6.2 中如何管理自动完成的唯一属性。 如您所见,在任何浏览器开发人员工具中,单击包含 ' 字符的项目都会产生错误,如下所示:
Uncaught Error: Syntax error, unrecognized expression: li[data-token-value='@Richard D'souza']
components.js中的错误是:
PrimeFaces.widget.AutoComplete
...
h = PrimeFaces.escapeHTML(e.replace(/\"/g, '\''));
...
if (a.cfg.multiple) {
var j = false;
if (a.cfg.unique) {
j = a.multiItemContainer.children('li[data-token-value=\'' + h + '\']').length != 0
}
请注意,如果您键入整个字符串,则不会出现错误,并且会添加该项目。 这已在较新的 PF 版本中解决:
PrimeFaces.widget.AutoComplete
...
var i = f.attr("data-item-value");
...
if (a.cfg.multiple) {
var h = false;
if (a.cfg.unique) {
h = a.multiItemContainer.children("li[data-token-value='" + $.escapeSelector(i) + "']").length != 0
}
作为解决方案,您可以:
- 升级PF, >= 7.0
- 删除唯一属性,如果您的用例不需要它,或者在选择事件(服务器端)管理它
- 覆盖该函数,在 PF 6.2 中添加转义逻辑