요구 사항을 달성하는 방법에는 여러 가지가 있습니다.
servletcontainer가 최소 Servlet 3.0 / EL 2.2를 지원하는 경우 UICommand
컴포넌트 또는 AjaxBehavior
태그 의 action / listener 메소드의 인수로 전달하십시오 . 예
<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 컨테이너에서는 JBoss EL과 같이이를 지원하는 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 대 @ManagedProperty 도 참조하십시오 .
<f:viewParam name="id" value="#{bean.id}" required="true" />
어느 쪽이든, 이것은 양식 제출을 위해 데이터 모델을 반드시 보존 할 필요가 없다는 장점이 있습니다 (빈이 요청 범위 인 경우).
사용 <f:setPropertyActionListener>
의 UICommand
구성 요소입니다. 장점은 Bean이 요청 범위보다 더 넓은 범위를 가질 때 요청 매개 변수 맵에 액세스 할 필요가 없다는 것입니다.
<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
때문에 뷰 또는 세션 범위 빈에서 이것을 사용할 때 getter에서 그것을 만들고 느리게 인스턴스화하는 것은 필수입니다 )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 또는 서블릿 2.5 컨테이너도 지원하려면 # 2로 진행하겠습니다.