Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java EE (J2EE) и Spring > навигация на странице jsf |
Автор: NikitOS9 13.10.2008, 14:55 |
с jsf знаком не давно, и не очень понимаю как лучше сделать.. есть страница, на которой в левой части находится меню навигации, сделал его из множества commandLink ов. при нажатии на какой либо commandLink, средняя часть страницы должна менятся. одна из мыслей, это написать фсе в одном файле jsf, и взависимости какой action нажат, на серваке обьекты заполняются, а в этой jsf описано то что должно быть видно или нет, через panelGroup, например <h:panelGroup id="noneContract" binding=""controller.statePanel1> ... а тут что должно быть показано в этой панели.. ... <h:panelGroup id="noneContract" binding=""controller.statePanel2> ... а тут что должно быть показано в этой панели.. ... в бине controller, взависимости от action выполняется statePanelX.setRenderer(true) или false. таким образом на jsf нет никой логики, но минус в том что если на jsf есть много сменных панелей(различного контента) она получается довольно длинной еще как вариант можно через rich faces a4j сделать смену средней части, хотя кажется что можно и без это библиотеки обойтись интересно услышать как лучше еще вопрос про валидаторы, можно ли переопределить валидатор у стандартной компоненты, например у h:inputSecret, или валидаторы только у своих компонент можно делать свои ? и про facelets вопросик, если кратко то в чем отличие от jsf ? больше готовых компонент ? спасибо |
Автор: NikitOS9 14.10.2008, 01:26 |
про facelets вроде стало яснее, - вставки в xhtml значений с сервера а как делать страницы например с постоянной левой частью и меняющейся центральной не ясно. как я понимаю в jsf описано все предсталение, и с помощью binding, value, action и тд.. происходит обмен с серверным кодом. но когда нужно вывести например в одну и туже область страницы разный контент, например при нажатии на один action там будет таблица, а на другой совсем не таблица. я пока увидел только способ выставлять .setRenderer(false) у не нужных panelGroup на данный action, через бин, который связан binding`ом, в итоге надо в каждой панели описать все что в ней может быть, это конечно логично, но долго и длинная jsf может получиться. нет ли еще способа ? спасибо |
Автор: FlashXL 14.10.2008, 10:03 | ||||
Используйте ui:component и ui:include из фэйслетов. Допустим у вас есть такой компонент в файле /pages/include/someComponent.xhtml:
И соответственно на страничке допустим /pages/somePage.xhtml, там где вам надо вставить компонент, вы пишете:
|
Автор: NikitOS9 14.10.2008, 11:25 |
ага, а не придется ли делать на странице проверки в таком случае, типа <c:if... <ui:include src="/pages/include/someComponent.xhtml" /> <c:if.. <ui:include src="/pages/include/someComponent2.xhtml" /> видимо придется.. а как этого избежать бы ) |
Автор: necromancer 14.10.2008, 13:21 |
>а как делать страницы например с постоянной левой частью и меняющейся центральной не ясно. использовать iframe =) как вариант |
Автор: NikitOS9 14.10.2008, 13:26 |
>использовать iframe =) как вариант про постоянную левую часть я просто привел пример ) я более глобально хотел спросить - как менять нужные области страницы без логики на клиенте |
Автор: necromancer 14.10.2008, 13:47 |
вот ожин из вариантов: http://www.netbeans.org/kb/60/web/pagefragments.html не скрою лично от NB и Woodstock не в восторге (хотя некоторые компонеты заслуживают внимания) выставление renderer мне кажется чуть ли единственным вариантом, особенно если внутри не просто текст, а другие вложенные теги. |
Автор: NikitOS9 14.10.2008, 13:59 |
>выставление renderer мне кажется чуть ли единственным вариантом, особенно если внутри не просто текст, а другие вложенные теги. а ну это тот вариант который я выше описал, т.е выставление renderer через биндинг у panelGroup ? еще вопросик, была у меня рабочая jsf страница для регистрации юзеров, превратил ее в xhtml(facelets), теперь при случае когда я ввел имя которое уже в базе есть, вылетает nullpointer(раньше в jsf отрабатывало и писалось что имя занято), а когда новое имя то фсе ок.. не ясно что сломалось как я понял при facelets нужно обрамлять <ui:composition> это замена <f:view>? , нужно ли в этом случае использовать тег <f:view> ? |
Автор: necromancer 14.10.2008, 14:14 |
через биндинг у panelGroup не обязательно через биндинг (если конечно ты не строишь все дерево представления динамически) а так в разметке renderer="#{bean.render}" или же позаковырестее renderer="#{bean.render['comp_name']}" facelets это шаблоны+jstl+еще кое что т.е. ты создаешь сначала шаблон, затем страницу, которая использует этот шаблон включая в него свой вывод. очень хорошая статья: http://www.ibm.com/developerworks/java/library/j-facelets/ ошибку нужно обрамлять в try catch в компоненте, тогда и проблем будет меньше: try { ...insertuser... } catch(SQLException e) { if (e instanceof Unique....) { ... add some message to JSF output see FacesMessage and FacesContext.getInstance().addMessage } } |
Автор: NikitOS9 14.10.2008, 14:19 |
не обязательно через биндинг (если конечно ты не строишь все дерево представления динамически) а так в разметке renderer="#{bean.render}" или же позаковырестее renderer="#{bean.render['comp_name']}" хм, а разве в итоге получается не одно и тоже? через биндинг получается что я из сервера выставил значение, а тут jsf читает свойство бина.. разве это не одно тоже в итоге ? ) или я не понимаю |
Автор: FlashXL 14.10.2008, 14:29 | ||||||
f:view не нужен, просто следите чтобы ваши инпуты всегда были в форме. А чтобы выставлять rendered совершенно не обязательно биндить компонент на объект. Можно сделать так:
Только учитывайте, что если будете перерисовывать панельки аджаксом, то делать надо примерно так:
и ререндерить верхнюю панель, которая всегда видна. |
Автор: necromancer 14.10.2008, 14:30 |
по сути одно и тоже, только лично я против биндинга - это лишняя привязка логики к представлению |
Автор: NikitOS9 14.10.2008, 15:14 |
разобрался с ошибками все ок, но имеет место не понятная весчь ) когда страница как xhtml - facelets, то ответ приходит урезанный т.е страница начинается с места <form id="j_id0" name="j_id0" method="post" action="/faces/content/login.xhtml" enctype="application/x-www-form-urlencoded"> <input type="hidden" name="j_id0" value="j_id0" /> ... а начала где в исходнике есть это <!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:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <head><title>Login</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link href="/styles/login.css" rel="stylesheet" type="text/css" /> </head> <body> .... <ui:composition> <h:form> <div class="area"> в ответе нет.. |
Автор: necromancer 14.10.2008, 15:51 |
все что до <ui:composition> отрезается фацелетом. все остальное берется из шаблона. у тебя при ошибке видимо не обрабатывается шаблон? посмотри что такое <ui:composition> и с чем его едят(используется для...) |
Автор: FlashXL 14.10.2008, 17:03 | ||||
<ui:composition> используется для вставки в шаблон. Есть допустим шаблон common.xhtml
|
Автор: necromancer 14.10.2008, 17:05 |
ну вот видишь для вставки, а что бы получилось если бы туда каждый композит вставлял html & body =) |
Автор: NikitOS9 14.10.2008, 18:08 | ||||||
аа зачем в теге <ui:composition вот это фсе xmlns:h="http://java.sun.com/jsf/html", xmlns:ui="http://java.sun.com/jsf/facelets" и ..... разве это не должно быть в шаблоне common.xhtml ? логически вроде понимаю фсе, а сделал следующее и получаю опять не то что жду ) мой шаблон для всех станиц
одна из страниц
..... на выходе вижу вот что
.... где фсе остальное не ясно |
Автор: necromancer 14.10.2008, 23:14 | ||||
в шаблон вставляется все что внутри копозита. то что снаружи используется для подключения неймспейсов ну и правильного xhtml что бы вставить в шапку то что ты хочешь нужно:
а в шаблоне:
но подключение сприптов лучше ИМХО выносить в шаблон |
Автор: NikitOS9 15.10.2008, 00:26 | ||||
да я уже разобрался, как то так получилось шаблон
а в странице
|
Автор: NikitOS9 15.10.2008, 18:13 | ||||||
таким методом вылетает ошибка javax.servlet.ServletException: Error Parsing /contract.xhtml: Error Traced[line: 59] The entity "nbsp" was referenced, but not declared. то есть у меня в странице куда надо вставлять различный контент есть это (а в панели, для того чтобы либо выводить либо нет, таких панелей соответственно нескольно, смотря что показывать) <h:panelGroup rendered="bean.state" id="contract"> <ui:include src="contract.xhtml"/> </h:panelGroup> а в contract.xhtml <ui:component xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets"> <h:panelGroup> ... какой то html .... </h:panelGroup> </ui:component> |