У меня возникла трудность с JSF. Суть в следующем: Имеется такой код
@Named
@SessionScoped
public class WordBean implements Serializable {
private String [] tags = new String[10];
public String [] getTags() { return tags; }
public void setTags(String [] tags) { this.tags = tags; }
public void add() {
System.out.println(tags);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!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://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
</h:head>
<h:body>
<h:form>
<h:selectManyMenu value="#{wordBean.tags}" styleClass="tags" immediate="true" />
<h:commandButton action="#{wordBean.add}" value="Add" />
</h:form>
<script type="text/javascript">
$('.tags').select2({tags: true});
</script>
</h:body>
</html>
Select2 отрабатывает корректно, созаёт поле, для ввода новых тегов, но после отправки данных на сервер возникает ошибка "Validation Error: Value is not valid" Я так понимаю, JSF пытается валидировать запрос и искать имеющиеся значения в select, разумеется не находит и выкидывает исключение. Мне же нужно не валидировать это поле "tags", а принимать его, как новые параметры. Подскажите пожалуйста, как мне это сделать. Заранее спасибо за ответы.
Снова хочу поблагодарить за ответы, они натолкнули меня на решение это задачи. Суть в следующем:
Создаём бин@Named
@FacesConfig(version = JSF_2_3)
@SessionScoped
public class WordBean implements Serializable {
private List<String> tags;
private Map<String, String> options = new HashMap<>();
public void setTags(List<String> tags) { this.tags = tags; }
public void setOptions(Map<String, String> options) { this.options = options; }
public List<String> getTags() { return tags; }
public Map<String, String> getOptions() { return options; }
public void add() {
//Some login here
}
}
Создаём страницу
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Add tags</title>
</h:head>
<h:body>
<h:form>
<h:selectManyListbox value="#{wordBean.tags}" styleClass="tags" converter="wordConverter">
<f:selectItems value="#{wordBean.options}" />
</h:selectManyListbox>
<h:commandButton action="#{wordBean.add}" value="Add" />
</h:form>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<script type="text/javascript">
$('.tags').select2({tags: true});
</script>
</h:body>
</html>
Далее, так как у нас поле options пустое, и валидатор разумеется станет ругаться, потому, что не с чем сравнивать полученные теги созаём конвертор
@FacesConverter("wordConverter")
public class WordConverter implements Converter {
@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {
FacesContext context = FacesContext.getCurrentInstance();
WordBean bean = context.getApplication().evaluateExpressionGet(context, "#{wordBean}", WordBean.class);
bean.getOptions().put(s, s);
return s;
}
@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
return o.toString();
}
}
В этом случае конвертор вызывается до валидации бина, потому мы можем его немного модифицировать ;) путём обновления поля options бина
Конечно решение далеко от идеала возможно, я только начиная изучать jsf, но по крайней мере это решение выглядит более изящно, чем то, что было написано мной ранее ;)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Имеется несколько кнопокНа каждой кнопке должен быть текст в формате HH:mm, где HH - количество часов в данный момент времени + некоторое количество...
Недавно я с программирования приложений на java для android перешёл на игрыИ тут же возникла очень большая проблема: при первом заходе в игру всё...