是什么区别action和actionListener,什么时候应该使用action与actionListener?
任何人都可以澄清我们如何在一般情况下使用,或者在现实世界中使用这个代码片段?
<f:metadata>
<f:viewParam id="id" value="#{bean.id}" />
<f:viewAction action="#{bean.init}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud) 我在JSF 2应用程序中使用Primefaces.我有一个<p:dataTable>,而不是选择行,我希望用户能够直接对各行执行各种操作.为此,我<p:commandLink>在最后一栏中有几个.
我的问题:如何将行ID传递给命令链接启动的操作,以便我知道要对哪一行进行操作?我尝试使用<f:attribute>:
<p:dataTable value="#{bean.items}" var="item">
...
<p:column>
<p:commandLink actionListener="#{bean.insert}" value="insert">
<f:attribute name="id" value="#{item.id}" />
</p:commandLink>
</p:column>
</p:dataTable>
Run Code Online (Sandbox Code Playgroud)
但它总是产生0 - 显然在f呈现属性时行变量不可用(当我使用固定值时它可以工作).
有人有替代解决方案吗?
我正在学习JSF,当我意识到每当我们使用时<h:form>,JSF的标准行为总是向我显示浏览器中上一页的URL ,而不是当前页面的URL,我感到非常惊讶和困惑.
我知道这与JSF总是将表单发布到同一页面的方式有关,然后只是呈现控制器将其返回给浏览器的任何页面,而浏览器不知道页面位置已更改.
似乎JSF已经存在了足够长的时间,必须有一个干净,可靠的方法来处理这个问题.如果是这样,你介意分享吗?
我找到了各种解决方法,但遗憾的是,这似乎不是一个真正可靠的解决方案.
"?faces-redirect=true"到每个 bean的操作的返回值然后
@RequestScoped用其他东西替换(Flash Scopes,CDI对话,@ SessionScoped,......).如果它"?faces-redirect=true"是如此好,有没有办法配置整个应用程序以这种方式处理所有请求?
如果有表单,并且有文本框和按钮,那么在提交表单后如何删除文本框的内容?
<h:inputText id="name" value="#{bean.name}" />
<h:commandButton id="submit" value="Add Name" action="#{bean.submit}" />
Run Code Online (Sandbox Code Playgroud)
在文本框中输入值并提交后,该值仍显示在文本框中.我需要在提交后清除文本框的内容.我怎样才能做到这一点?
我面临以下问题:在一个页面中,我列出了我的应用程序的所有用户,并为每个用户都有一个"编辑"按钮,这是一个"GET"链接?id=<userid>.
编辑页面具有<f:viewParam name="id" value="#{editUserBean.id}"/>元数据.
如果我输入了一些输入错误并提交(我使用CDI Weld Bean验证),页面会再次显示,但我丢失?id=...了URL,因此丢失了我正在编辑的用户的用户ID.
我看过JSF验证错误中描述的类似问题,丢失了值,但是带有inputhidden的解决方案(或更糟糕的是,使用tomahawk,看起来有点过分)需要大量的uggly代码.
我尝试用CDI添加一个"对话",它正在工作,但它看起来对我来说太过分了.
在验证错误的情况下,JSF中是否存在一个简单的解决方案来保留视图参数?
[我的环境:Tomcat7 + MyFaces 2.1.0 + Hibernate Validator 4.2.0 + CDI(Weld)1.1.2]
我想了解在JSF2.0中附加标记"?faces-redirect=true"的action属性背后的语义是什么<h:commandlink>.无论是使用它还是使用它,应用程序确实导航到操作中指定的目标页面.所以乍一看,似乎唯一的效果就是整容,即向用户提供反馈(如果他正在查看浏览器的访问过的URL),他已经移动到新页面.但如果它是如此无害且无副作用,我无法理解为什么它不是默认行为.我怀疑它与JSF2.0的基于post的机制有关.我通过对网址人们看到他的浏览器(当一个JSF应用程序在浏览时已经注意到?faces-redirect=true不使用)是'前’,'页面的次数.’
元NB.我在防火墙后面并且受到"SO需要来自另一个域的外部JavaScript"问题的困扰,所以我为没有格式化而道歉.当我可以从其他域访问时,我还会在几个小时内提供有关您的答案的反馈.
我只是页面与关联的@RequestScoped支持bean.我从其他页面到达此页面,我在其中传递参数"project".所以,当我进入正确的页面时,我会像contextRoot/faces/jsf.xhtml?project=123.
视图:
<f:metadata>
<f:viewParam name="project" value="#{entityBean.projectId}" />
</f:metadata>
...
<p:commandButton value="#{msg['button.add']}"
actionListener="#{entityBean.addNewEntity((entityName),(entityDescritpion))}"
ajax="true" update=":projectDetailForm"/>
Run Code Online (Sandbox Code Playgroud)
支持豆:
@Named("entityBean")
@RequestScoped
public class EntityBean implements Serializable{
private String projectId;
@PostConstruct
public void init() {
params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
for (Map.Entry<String, String> entry : params.entrySet()) {
System.out.println(entry.getKey() + " / " + entry.getValue());
}
if (params.get("project") != null) {
projectId = params.get("project");
} else {
HttpServletRequest request =
(HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
String projectId = request.getParameter("project");
}
}
//projectId getter and setter
//public void addNewEntity(String …Run Code Online (Sandbox Code Playgroud) 我已经构建了一个位于菜单栏顶部的登录代码片段.如果用户在任何页面中通过导航并突然按下登录按钮,我会希望看到该人员经过身份验证并同时停留在他最初来自的页面上.所以我在支持bean上使用了这个:
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
Run Code Online (Sandbox Code Playgroud)
然后如果有说mypage.htm?a = 2&b = 2使用request.getQueryString()得到a = 2&b = 2
但getQueryString返回null,我怎样才能完全从支持bean获得原始URL?
jsf ×9
jsf-2 ×6
navigation ×2
redirect ×2
action ×1
cdi ×1
clear ×1
commandlink ×1
datatable ×1
forms ×1
jboss-weld ×1
post ×1
url ×1
viewaction ×1
viewparams ×1