简体   繁体   English

在XHTML页面打开时调用ManagedBean方法

[英]ManagedBean method called on XHTML page opening

I'm developping with Eclise Juno, Tomcat 7 and JSF. 我正在使用Eclise Juno,Tomcat 7和JSF进行开发。

When I run my project on Server, it seems that Client.fct1() method is ran. 当我在服务器上运行项目时,似乎已经运行Client.fct1()方法。 This is setting values in my XHTML InputText. 这是在我的XHTML InputText中设置值。

Upon startup I expect to see only the values set from my Bean Constructor method. 启动后,我希望只能看到从Bean构造函数方法中设置的值。

Here is my XHTML: 这是我的XHTML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="./template.xhtml">
    <ui:param name="onLoadJS" value="initialize()" />
    <ui:define name="top">
        Frontend
        <script type="text/javascript"
                src="#{utils.GMapURL}">
        </script>
        <script type="text/javascript">
            var map;

            function initialize() {
                var x = 500;
                document.getElementById("bottom").style.height = x+'px'; 
                var mapOptions = {
                    center: new google.maps.LatLng(48.84325, 2.237803),
                    zoom: 14,
                    mapTypeId: google.maps.MapTypeId.HYBRID
                };
                map = new google.maps.Map(document.getElementById("bottom"),
                mapOptions);
                google.maps.event.addListener(map, 'click', function(event) {
                                                                addPlacemark(event.latLng.lat(),event.latLng.lng());
                                                            });
            }

            function add(vlat,vlon,vname) {
                ...
            }

            function addPlacemark(vlat,vlon) {
                ...
            }

            function lookAt(vlat,vlon) {
                ...
            }

            function resetBean() {
                alert("ResetBean!");
                #{client.fct1()};
            }

        </script>

        <A HREF="faces/map.xhtml">Placemark</A> <A HREF="faces/directions.xhtml">Directions</A> 
    </ui:define>

    <ui:define name="body">
        <h4>Latitude  : <h:inputText id="lat" value="#{client.lat}"/></h4>
        <h4>Longitude : <h:inputText id="lon" value="#{client.lon}"/></h4>
        <h4>Name      : <h:inputText id="name" value="#{client.name}"/></h4>
    <h:commandButton onclick="add(document.getElementById('lat').value,document.getElementById('lon').value,document.getElementById('name').value)" value="Add"/>
    <h:commandButton onclick="lookAt(document.getElementById('lat').value,document.getElementById('lon').value)" value="Look At"/>
    <h:commandButton onclick="displayAll()" value="Display All"/>
    <h:commandButton onclick="resetBean()" value="Reset Form (bean)"/>
    </ui:define>

    <ui:define name="bottom">
    </ui:define>
</ui:composition>
</html>

And my bean: 还有我的豆子:

package web;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

/**
 * Session Bean implementation class Client
 */
@ManagedBean
@SessionScoped
public class Client implements Serializable {

private static final long serialVersionUID = 1L;

private String lat;
private String lon;
private String name;

// Constructor
public Client() {
    this.lat = "11.2051195";
    this.lon = "119.4056492";
    this.name = "[Put name here]";
}

public void fct1(){
    this.lat = "Damn";
    this.lon = "It";
    this.name = "..";
}

public String getLat() {
    return lat;
}

public void setLat(String lat) {
    this.lat = lat;
}

public String getLon() {
    return lon;
}

public void setLon(String lon) {
    this.lon = lon;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

So I am getting "Damn It ..." instead of the default "11.2051195 119.4056492 [Put name here]". 因此,我得到的是“该死的……”,而不是默认的“ 11.2051195 119.4056492 [在此处输入名称]”。

How come the fct1() method is called? 如何调用fct1()方法? How can I prevent it? 我该如何预防?

Thanks for your help! 谢谢你的帮助!

You seem toassume that in 你似乎认为

        function resetBean() {
            alert("ResetBean!");
            #{client.fct1()};
        }

The #{client.fct1()}; #{client.fct1()}; is called when the javascript function resetBean() is called. 在调用javascript函数resetBean()调用。 It is not. 它不是。 It is executed when the page is rendered (so no onload) since it is not in any jsf tag. 由于页面不在任何jsf标记中,因此在呈现页面时执行(因此没有onload)。 If you want to call a remote method from javascript, the easiest thing to use is the OmniFaces commandScript (using omnifaces in your project is a good idea anyway) 如果要从javascript调用远程方法,最容易使用的是OmniFaces commandScript (无论如何,在项目中使用omnifaces都是个好主意)

Your code would then look like 您的代码将如下所示

        function resetBean() {
            alert("ResetBean!");
            callFct1();
        }

And in you xhtml add 然后在您的xhtml中添加

<o:commandScript name="callFct1" action="#{client.fct1()}">

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM