在页面加载jsp上运行方法

时间:2012-01-05 11:46:10

标签: java jsp jsf

我有一个名为“home.jsp”的JSP页面。 我有一个名为“getRunHomeDisplay”的方法。

最初我在home.jsp中有一个按钮,当我点击按钮时,它会显示房子里的所有物品。

这是按钮通话:

    try {
            log("Account selected: ");
            (new action.ItemShowAction()).execute(getgetRunHomeDisplay());
            }  catch (Exception e) {

            return "error";
            }
            return "success";

这是我的“home.jsp”来源:

        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
        <%-- jsf:pagecode language="java" location="/src/pagecode/Itemtest2.java" --%>                            <%-- /jsf:pagecode --%><%@page
language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://www.ibm.com/jsf/html_extended" prefix="hx"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
 <html>
 <head>
  <title>itemtest2</title>
   <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  <link rel="stylesheet" type="text/css" title="Style"
href="theme/stylesheet.css">
  <script type="text/javascript">
 </script></head>
<script type="text/javascript">

</script>
<f:view>
<body onload="#{pc_ItemClick.doButton1Action}">
<hx:scriptCollector id="scriptCollector1">
    <h:form styleClass="form" id="form1">
        <hx:commandExButton type="submit" value="Submit"
            styleClass="commandExButton" id="button1"
            action="#{pc_ItemClick.doButton1Action}"></hx:commandExButton>
        <hx:dataTableEx id="item1" value="#{itemtest.item}" var="varitem"
            styleClass="dataTableEx" headerClass="headerClass"
            footerClass="footerClass" rowClasses="rowClass1, rowClass2"
            columnClasses="columnClass1" border="0" cellpadding="2"
            cellspacing="0">
            <hx:columnEx id="item2column">
                <f:facet name="header">
                    <h:outputText styleClass="outputText" value="Item" id="item2text"></h:outputText>
                </f:facet>
                <h:outputText styleClass="outputText" id="item2" value="#{varitem}">
                </h:outputText>
            </hx:columnEx>
        </hx:dataTableEx>```1
    </h:form>
</hx:scriptCollector>
</body>
</f:view>
</html>

如何调用在页面加载时运行此方法而不是单击按钮?

2 个答案:

答案 0 :(得分:2)

您似乎正在将JSF 1.x与IBM Faces Client Framework一起使用。如果它是JSF 1.0或1.1,只需在bean的构造函数中完成工作。没有其他干净的方式。

public class ItemClick {

    public ItemClick() {
        // Do your job here.
    }

    // ...
}

或者,如果您在Java EE 5上使用JSF 1.2,那么您还可以使用@PostConstruct注释来注释随机方法。它将在bean构造之后直接调用,如果你根据托管属性或注入的EJB执行工作,这可能会更有用。

public class ItemClick {

    @PostConstruct
    public void init() {
        // Do your job here.
    }

    // ...
}

请注意,两种方式都要求bean是请求作用域,以便在每个页面请求上运行。会话范围bean不会在每个页面请求上重建,但在会话期间只在第一页请求上重建一次。

一种hacky方式是创建一个“隐形”表单并通过JavaScript提交。

<body onload="document.getElementById('formId:buttonId').click()">
    <h:form id="formId" style="display: none;">
        <h:commandButton id="buttonId" value="submit" action="#{pc_ItemClick.doAction}" />
    </h:form>
    ...
</body>

缺点是,如果您导航回同一页面,这将导致页面刷新,最终可能会以无限循环结束。您可能希望导航到其他页面或添加一些JS条件,该条件在已调用操作时跳过onload函数。类似的东西:

<body onload="<h:outputText value="document.getElementById('formId:buttonId').click()" rendered="#{!pc_ItemClick.didAction}" />">

答案 1 :(得分:0)

我相信你有一个ManagedBean绑定到该JSP页面。如果这是真的,我认为你可以利用@PostConstruct注释。它会是这样的:

@ManagedBean
@RequestScoped
public class MrBean{
   @PostConstruct
   public void prepareView() {
      // do what you need to do
   }
}

请求页面时,将始终调用此prepareView函数。