参数传递在JSF 2.0中



我找到了一些参考 JSF Parameter Passing

  • 带有请求范围的托管豆之间传递参数
  • JSF 2.x在两个XHTML页之间传递参数
  • 方法表达式中的JSF传递参数在ViewScoped Bean中失败

但是,对于我的要求是不对的。我会将object(Student)的一个备用豆传递到下面的另一个豆子。

studentTable.xhtml                              updateStudent.xhtml
                        pass student object
                        (not `StudentID` string)
                        ==================> 
StudentTableBean.java                           UpdateStudnetBean.java

bean bean均可为RequestScopeViewScope,而不是Session。当我在studentTable.xhtml上单击链接(一行数据)时,我想将学生对象传递到updateStudent.xhtml

有可能吗?您可以提供一些参考或提供吗?

http和html不了解复杂的java对象。从爪哇的角度来看,他们只能理解字符串。您最好将复杂的Java对象转换为字符串风味的唯一标识符,通常是其技术ID(例如,自动化数据库PK),然后又将该标识符用作HTML链接中的HTTP请求参数。

给定一个List<Student>,该 CC_8表示为带有链接的表,如下,

<h:dataTable value="#{studentTable.students}" var="student">
    <h:column>
        <h:link value="Edit" outcome="updateStudent.xhtml">
            <f:param name="id" value="#{student.id}" />
        </h:link>
    </h:column>
</h:dataTable>

您可以在目标视图中使用updateStudent.xhtml使用<f:viewParam>将传递的学生ID转换回Student如下,

<f:metadata>
    <f:viewParam name="id" value="#{updateStudent.student}" converter="#{studentConverter}" />
</f:metadata>

private Student student;

@ManagedBean
@ApplicationScoped
public class StudentConverter implements Converter {
    @EJB
    private StudentService studentService;
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null || value.isEmpty()) {
            return null;
        }
        if (!value.matches("[0-9]+")) {
            throw new ConverterException("The value is not a valid Student ID: " + value);
        }
        long id = Long.valueOf(value);
        return studentService.getById(id);
    }
    @Override    
    public String getAsString(FacesContext context, UIComponent component, Object value) {        
        if (value == null) {
            return "";
        }
        if (!(value instanceof Student)) {
            throw new ConverterException("The value is not a valid Student instance: " + value);
        }
        Long id = ((Student)value).getId();
        return (id != null) ? String.valueOf(id) : null;
   }
}

您将如何认为这是可能的?当您离开页面时,ViewScope结束了,该范围中的所有豆被破坏了 - 它们所持有的对象也是如此。

updateStudent.xhtml创建了一个新视图,并获得了自己的一组ViewScoped Bean。如果要在页面之间保持对象,请启动新的,长期运行的对话,或将对象推入会话范围。

有关使用对话范围,请参阅本教程。

您可以通过将学生的对象放在请求的当前实例的会话图中来做到这一点:您将相关学生的ID从studentTable.xhtml传递到Backing-Bean UpdateStudnetBean.java,然后,您可以从资源(列表,数据库等)中搜索对象实例,然后将其放在上面的会话映射对象中。这样你可以通过隐式对象sessionScope

最新更新