как переходить от одного представления к другому в EBJ JSF2 / JPA / без сохранения состояния (управляемые контроллеры jsf) и сохранять данные

У меня есть веб-приложение, использующее JSF2 с объектами JPA, сеансные bean-компоненты ejb без сохранения состояния в качестве объектов фасада / ejb и управляемые bean-компоненты (с ограничениями по запросу и представлению) в качестве контроллеров, предоставляющих бизнес-методы, управляемые контроллеры извлекают данные из введенных сеансовых компонентов без сохранения состояния.

но я не понимаю, как перемещаться и сохранять данные в представлениях в моих контроллерах в этой среде, например:

У меня есть страница просмотра jsf2 (DepartmentView.xhtml), которая отображает список объектов отдела, и каждая строка имеет элемент редактирования. Нажав кнопку «Редактировать», я хочу загрузить новую страницу и отобразить список сотрудников этого отдела на новой странице, поэтому я вызываю контроллер сотрудников, передавая ему выбранный отдел.

action="#{employeeController.getEmployeeListForADepartment(ithDepartment)}" 

вот фрагмент моего DepartmentView.xhtml

    <h:dataTable id="table" value="#{departmentController.departmentList}" 
            var="ithDepartment">
...
<h:column>              
<h:commandLink id="editId" value="Edit"
action="#{employeeController.getEmployeeListForADepartment(ithDepartment)}" />
</h:column>

и мой employeeController определяется как

ManagedBean(name = "employeeController")
@ViewScoped
public class EmployeeController implements Serializable {
   ...
private List<Employee> employeeList = new ArrayList<Employee>();
   ...      

@EJB
private com.ejb.session.EmployeeFacade ejbEmployeeFacade;    
   ...

public List<Employee> getEmployeeListForADepartment(Department dept) 
{
    if(employeeList==null || employeeList.isEmpty())
          employeeList = ejbEmployeeFacade.findEmployeesByDepartment(dept);  

// now i want to navigate to the employee view showing these employees for the
// selected department.
// but this navigation below triggers creating a new EmployeeController 
// and i lose my employeeList 
    return "employeeView";
}

Я действительно хочу избежать использования области сеанса jsf и считаю, что есть способ сделать это, просто не читая об этом ни в одной из моих книг по jsf / ejb.

думая, может быть, EmployeeController.getEmployeeListForADepartment(..) не выполняет поиск, просто создайте параметр из идентификатора отдела и передайте его через return "employeeView?departmentId=X";, и у него есть конструктор, а затем выполните поиск, если идентификатор присутствует?

может мне помочь с правильным способом реализовать это в среде EJB / JSF2

Благодарность


person user825402    schedule 07.12.2011    source источник


Ответы (1)


Используйте простой GET <h:link> в исходном представлении, чтобы передать идентификатор отдела и <f:viewParam> в целевом представлении, чтобы преобразовать и установить отдел.

E.g.

<h:link id="editId" value="Edit" outcome="employeeView">
    <f:param name="departmentId" value="#{ithDepartment.id}" />
</h:link>

с участием

<f:metadata>
    <f:viewParam name="id" value="#{editDepartmentBean.department}"
        converter="#{departmentConverter}" converterMessage="Bad request. Unknown department."
        required="true" requiredMessage="Bad request. Please use a link from within the system." />
</f:metadata>

и

@ManagedBean
@ViewScoped
public class EditDepartmentBean {

    private Department department;

    // ...
}

Смотрите также:

person BalusC    schedule 07.12.2011
comment
еще одно уточнение, я могу перейти к тому же представлению / странице списка сотрудников в 2 senerios, 1) у меня есть идентификатор отдела и, следовательно, отображаются только сотрудники для этого идентификатора отдела и 2) если у меня нет идентификатора отдела ( нет предыдущего выбора из представления отделов), поэтому я хотел бы отображать всех сотрудников из всех отделов. Я предполагаю, что могу просто удалить образец атрибута required="true" выше, а затем мой EmployeeController будет смотреть, установлен ли идентификатор отдела, и либо возвращать 1) список сотрудников для отдела или 2) всех сотрудников из всех отделов? - person user825402; 07.12.2011
comment
Да, вы можете это сделать. Удалите required="true" и добавьте <f:event type="preRenderView">, который соответственно обрабатывает загрузку списка сотрудников. - person BalusC; 07.12.2011
comment
3 комментария на случай, если это кому-то поможет 1) если я помещу исходный код для области EmployeeController в @RequestScoped вместо @ViewScoped, тогда я сохраню данные, которые при переходе от DepartmentView.xhtml к employeeView.xhtml, будут иметь смысл JSF. 2) Реализация этого способа вызывает выполнение POST, потому что реализовано с помощью <h:commandLink .. value="Edit" />. 3) Способ BalusC лучше, потому что он соответствует дизайну RESTful, не выполняет GET, а не POST - ›передается меньше данных, и его можно добавить в закладки, то есть http: // .. /employeeView.jsf?deptantmentId=1. BalusC, спасибо за то, что вы отличный участник сообщества. С Рождеством! - person user825402; 07.12.2011