javascript在启动时调用托管bean的方法,而不是在命令按钮单击时调用它们
Posted
技术标签:
【中文标题】javascript在启动时调用托管bean的方法,而不是在命令按钮单击时调用它们【英文标题】:javascript call methods of managed bean on start-up and doesn't call them on command button click 【发布时间】:2015-05-10 17:58:40 【问题描述】:我正在开发一个使用 JSF、Maven、Spring-Data 框架和 Neo4J 图形数据库的 Web 应用程序项目。
这是我工作中的一个示例 JSF 页面
// JSF Sample Page
…
<h:commandButton value="button" onclick="fun(#bean.doWork())" />
…
以及我工作中的一个示例 javascript 页面
// JavaScript Sample Page
…
function fun (var_value)
…
…
以及我工作中的示例托管 Bean 类
// Managed Bean Sample Class
…
public int doWork()
…
…
问题是: JavaScript在启动时调用托管bean的方法(我不知道为什么)。
最大的问题是: JavaScript 不会在命令按钮单击时调用托管 bean 的方法。
注意: 单击命令按钮时,它会调用 JavaScript 函数,但不会调用托管 bean 的方法,而是使用在启动时通过调用托管 bean 的方法加载的数据
另一个注意事项: 在命令按钮上调用托管bean的方法时直接单击而不使用JavaScript函数它工作正常并且不会在启动时调用托管bean的方法(似乎这是我问题的解决方案,但我必须使用JavaScript)
【问题讨论】:
这个 JavaScript 函数function fun (var) ...
中的 var
是什么?它是一个保留关键字,不能用作变量名。观察浏览器控制台是否有任何 JavaScript 错误。这个Java方法不是语法(syntactic)Public int doWork() ...
。它不会编译。注意这里开头Public
的大写(P
)。
@Tiny 对不起,我已经更新了我的问题,写得不好不是语法错误
【参考方案1】:
当您的页面加载时,bean 函数将被调用,它会用返回值填充您的 JavaScript。如果您查看页面的来源,您可以检查。之后,当页面加载时,如果点击按钮,它将使用旧值,不会再次调用 bean 方法。您需要先更新/渲染该部分脚本以更新值,然后调用 JS 方法。 我希望我不会太困惑......
示例:
//JSF page
<p:commandButton value="button" action="#bean.doWork" update="script" oncomplete="fun()" />
<h:panelGroup id="script">
<script>
function fun ()
var var_value = #bean.workResult;
…
</script>
</h:panelGroup>
//Bean
private int workResult = 0; //so it doesn't report error at the beggining
public int getWorkResult() return workResult;
public void doWork()
…
workResult = valueYouWouldReturn;
【讨论】:
我知道,但我不想在启动时加载这些方法,这会使 Web 应用程序太慢。另外,如何在命令按钮单击时更新/呈现 JavaScript? 我编辑了我的答案,你可以试试类似的。 有效,请参考问题中的第二个注释,我必须使用javascript 如果您通过“我必须使用 javascript”表示您不想刷新页面,那么您可以将 h:commandButton 更改为 a4j、primefaces 或 richfaces 按钮(如果您使用的东西)。您不能只从 JavaScript 代码中调用 bean 函数。 JS在你的客户端,bean在服务器,所以你需要发送一些请求来获取值。 很遗憾,我需要刷新页面,我需要至少每5分钟刷新一次以上是关于javascript在启动时调用托管bean的方法,而不是在命令按钮单击时调用它们的主要内容,如果未能解决你的问题,请参考以下文章
Spring 安全性和 JSF:在登录时调用支持 bean 的方法?