2014-09-07 5 views
0

Я использую NetBeans для веб-приложения в Java EE.Java Server Faces, эквивалентный Html.ActionLink

У меня есть один контроллер для класса сущности отсутствия (lackController) и один контроллер для класса сущности сотрудника (employeeController).

Я могу попасть на страницу создания сотрудника с помощью любой страницы, контролируемой absenceController:

<h:commandLink action="#{absenceController.prepareCreate}" 
    value="#{bundle.ListAbsenceCreateLink}"/> 

Я могу попасть на страницу создания отсутствие с помощью любой страницы, контролируемой employeeController:

<h:commandLink action="#{employeeController.prepareCreate}" 
    value="#{bundle.ViewEmployeeCreateLink}" /> 

Когда я хочу создать новый экземпляр отсутствия, мне нужно, чтобы сотрудник был установлен заранее, поэтому я пытаюсь добраться до страницы создания отсутствия с страницы просмотра сотрудника (так называемый Tasks.xhtml), отправив экземпляр сотрудника как параметр.

В MVC .NET я бы использовал Html.ActionLink немного как это:

Html.ActionLink("Report Absence for employee" 
, "Create" 
, "Absence" 
, new { employeeid = employee.Id } // <- I would only be able to send the id 
, null) 

В Java, это ближайший я получил:

<h:commandLink action="/absence/create" 
     value="#{bundle.TasksEmployeeCreateAbsenceLink}" > 
    <f:setPropertyActionListener target="#{absenceController.selected.employee}" 
      value="#{employeeController.selected}" /> 
</h:commandLink> 

Структура папок как показано ниже:

Web Tree Structure

Я знаю, что тег действия не правильно, но есть ли способ изменить его, чтобы получить желаемый результат, пожалуйста?

+0

Должно ли это быть GET или POST-запросом? Вы считали идемпотентность такого запроса? – BalusC

+0

Это было бы ПОЛУЧИТЬ. Прошу прощения, если я ошибаюсь в идемпотенции. Было бы нормально звонить несколько раз, потому что у сотрудника может быть много отсутствий. – Ali

ответ

0

Я использую JSF 2.2, поэтому все, что мне нужно было сделать, это использовать правильный футляр в Create:

<h:commandLink action="/absence/Create" 
    value="#{bundle.TasksEmployeeCreateAbsenceLink}" > 
     <f:setPropertyActionListener target="#{absenceController.selected.employee}" 
      value="#{employeeController.selected}" /> 
</h:commandLink> 
0

Одним из способов достижения того, что мне было нужно, было использование правил навигации. (Как и в комментариях, есть лучший способ достижения этой цели, так как JSF 2.x)

Я добавил следующие грани-config.xml (в пределах <application></application> секции):

<navigation-rule> 
     <from-view-id>/employee/Tasks.xhtml</from-view-id> 
      <navigation-case> 
        <from-action>absence/create</from-action> 
        <from-outcome>absence/create</from-outcome> 
        <to-view-id>/absence/Create.xhtml</to-view-id> 
      </navigation-case> 
    </navigation-rule> 
+0

Правила навигации - это sooo JSF 1.x. Вы уверены, что читаете свежие ресурсы во время обучения JSF? Точно так же в JSF 2.x можно было бы достичь просто «action =»/отсутствие/Create.xhtml «или даже« action = »/ отсутствие/Создать», если вы правильно сопоставили «FacesServlet» на '* .xhtml'. Но лучше, просто введите строковое имя файла XHTML, чтобы в конечном итоге вы могли использовать чистую все-нижнюю строку 'action ="/отсутствие/create ". – BalusC

+0

@BalusC Вчера я попробовал все эти вещи, но они не сработали ... Пожалуйста, не могли бы вы уточнить, правильно ли сопоставлены 'FacesServlet' на' * .xhtml'. Есть ли другой файл конфигурации, который я должен проверять? Спасибо за вашу помощь в этом, это очень ценится. – Ali

+0

Видимо, вы на самом деле используете JSF 1.x. Не беспокойся в таком случае. Я просто не ожидал, что в эти дни, конечно, не с тех пор, как XHTML используется, что обычно является значением по умолчанию для JSF 2.x. – BalusC

Смежные вопросы