我正在使用Eclise Juno,Tomcat 7和JSF开发。
当我在Server上运行项目时,似乎运行了Client.fct1()方法。这是在我的XHTML InputText中设置值。
启动时,我希望只看到我的Bean Constructor方法设置的值。
这是我的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>
我的豆子:
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;
}
}
所以我得到了“该死的......”而不是默认的“11.2051195 119.4056492 [把名字放在这里]”。
为什么调用fct1()方法? 我该如何预防?
感谢您的帮助!
答案 0 :(得分:1)
你好像在
中那样 function resetBean() {
alert("ResetBean!");
#{client.fct1()};
}
调用javascript函数#{client.fct1()};
时会调用resetBean()
。它不是。它在页面呈现时执行(因此没有onload),因为它不在任何jsf标记中。如果你想从javascript调用一个远程方法,最简单的方法就是OmniFaces commandScript(无论如何,在你的项目中使用omnifaces是一个好主意)
您的代码看起来像
function resetBean() {
alert("ResetBean!");
callFct1();
}
在你的xhtml中添加
<o:commandScript name="callFct1" action="#{client.fct1()}">