Існує кілька способів досягнення вимоги.
Якщо ваш сервлет-контейнер підтримує мінімум Servlet 3.0 / EL 2.2, тоді просто передайте його як аргумент дії / методу прослуховувача UICommand
компонента або AjaxBehavior
тегу. Напр
<h:commandLink action="#{bean.insert(item.id)}" value="insert" />
У поєднанні з:
public void insert(Long id) {
// ...
}
Це вимагає збереження лише моделі даних для запиту надіслати форму. Найкраще - поставити квасоля в поле зору @ViewScoped
.
Ви навіть можете передавати весь об’єкт:
<h:commandLink action="#{bean.insert(item)}" value="insert" />
з:
public void insert(Item item) {
// ...
}
На контейнерах Servlet 2.5 це також можливо, якщо ви поставите реалізацію EL, яка підтримує це, як, наприклад, JBoss EL. Детальну інформацію про конфігурацію див . У відповіді .
Використання <f:param>
в UICommand
компоненті. Він додає параметр запиту.
<h:commandLink action="#{bean.insert}" value="insert">
<f:param name="id" value="#{item.id}" />
</h:commandLink>
Якщо ваш боб буде проаналізований, дозвольте JSF встановити його @ManagedProperty
@ManagedProperty(value="#{param.id}")
private Long id; // +setter
Або якщо ваша квасоля має більш широку сферу застосування або ви хочете більш детально перевірити / перетворити зернистість, скористайтеся <f:viewParam>
на цільовому поданні, див. Також f: viewParam vs @ManagedProperty :
<f:viewParam name="id" value="#{bean.id}" required="true" />
У будь-якому випадку, це має перевагу в тому, що модель моделювання не обов'язково повинна зберігатися для надсилання форми (для випадку, коли ваш боб буде проаналізований).
Використання <f:setPropertyActionListener>
в UICommand
компоненті. Перевага полягає в тому, що це усуває необхідність доступу до карти параметрів запиту, коли боб має ширший обсяг, ніж область запиту.
<h:commandLink action="#{bean.insert}" value="insert">
<f:setPropertyActionListener target="#{bean.id}" value="#{item.id}" />
</h:commandLink>
У поєднанні з
private Long id; // +setter
Це буде просто доступне за властивістю id
в методі дії. Це вимагає збереження лише моделі даних для запиту надіслати форму. Найкраще - поставити квасоля в поле зору @ViewScoped
.
Прив’яжіть значення даних, DataModel<E>
замість чого, у свою чергу, загортає елементи.
<h:dataTable value="#{bean.model}" var="item">
з
private transient DataModel<Item> model;
public DataModel<Item> getModel() {
if (model == null) {
model = new ListDataModel<Item>(items);
}
return model;
}
(зробити це transient
і ліниво створити інстанцію в геттері є обов'язковим, коли ви використовуєте це на перегляді або наборі сеансів, оскільки DataModel
не застосовується Serializable
)
Тоді ви зможете отримати доступ до поточного рядка, DataModel#getRowData()
не пропускаючи нічого навколо (JSF визначає рядок на основі назви параметра запиту натиснутої командної посилання / кнопки).
public void insert() {
Item item = model.getRowData();
Long id = item.getId();
// ...
}
Це також вимагає збереження моделей даних для подання запиту форми. Найкраще - поставити квасоля в поле зору @ViewScoped
.
Використовуйте Application#evaluateExpressionGet()
для програмної оцінки струму #{item}
.
public void insert() {
FacesContext context = FacesContext.getCurrentInstance();
Item item = context.getApplication().evaluateExpressionGet(context, "#{item}", Item.class);
Long id = item.getId();
// ...
}
Який спосіб вибрати, залежить від функціональних вимог та того, чи пропонує той чи інший переваги для інших цілей. Я особисто хотів би вперед з №1 або, якщо ви хочете також підтримувати контейнери servlet 2.5, також з №2.