отправка в jsf бин данных из js при загрузке
Есть ViewScoped бин. Он отображается на отдельной странице XHTML, имеет различные переменные для ввода и вывода информации и может редактироваться с этой страницы. После нажатия F5 бин сбрасывается к бину по умолчанию и все редактирование пропадает.
Я хочу с использованием js и sessionStorage "запоминать" состояние ViewScoped бина и возвращать его к нему после нажатия F5. (sessionScope не подойдет, хочу что бы один и тот же клиент мог в разных вкладках разные настройки применять).
Можно поместить в событие js onload некий скрипт, который будет восстанавливать состояние бина. Но к этому моменту бин уже загружен, а хотелось бы что бы от сразу загружался с нужными параметрами. Т.е. не так что бы сначала загружается бин с параметрами по умолчанию, а потом эти параметры меняются, а что бы сразу при загрузке получать со станицы нужные параметры.
Запихивать параметры в строку адреса (т.е. передавать в качестве Http атрибутов) не получиться, их очень много и не хочу так и т.д.
Возможно есть вариант передавать параметры в качестве http параметров. Т.е. так что бы можно было в бине из HttpServletRequest получить их т.е.
@Named
@ViewScoped
public class Bean implements Serializable
{
@Inject
private HttpServletRequest request;
@PostConstruct
public void firstInit() {
Map<String, String> param = request.getParameterMap();
//код
}
}
Но я не понимаю как сделать так, что бы при инициализации бина эти самые параметры были переданы. что писать в js? Или как еще это можно сделать?
Ответы (1 шт):
что бы сразу при загрузке получать со станицы нужные параметры
Запихивать параметры в строку адреса (т.е. передавать в качестве Http атрибутов) не получиться
Думаю, что соблюсти оба условия невозможно в случае обновления страницы по F5. F5 - это HTTP GET, в нём есть только URL и HTTP-заголовки. Если в них ничего не передать - получим полностью обновлённую страницу, без сохранения данных. Причём и на стороне сервера и на стороне клиента всё сбросится (если не применять технологии постоянных хранилищ в браузере).
Можно попробовать создать некий Map в компоненте SessionScoped, в котором ключом будет некий UID, а значением - состояние, которое надо восстановить. В ViewScoped бине создать метод с аннотацией @PostConstruct, который будет проверять наличие в URL некоего параметра (например, uid=). Если он есть, то находить в Map-е по этому ключу состояние в SessionScoped бине и восстанавливаться из него. Если параметра нет - значит это первое открытие страницы и ничего делать не надо. Плюс должно быть какое-то событие появления состояния, например, пользователь что-то ввёл и сделал сабмит формы. При обработке action-а кнопки можно создавать состояние на сервере, сохранять его в SessionScoped бине и по окончании обработки делать редирект, чтобы в URL-е появился параметр uid=. Могут возникнуть какие-то нюансы, до начала практической реализации их вряд ли получиться предусмотреть заранее.
Вообще, тут проблема скорее концептуальная и касается принципов HTTP в целом, а не специфики JSF в частности. Вероятно, стоит поискать решений, описанных без привязки к конкретной технологии, и адаптировать к JSF.