我知道如何创建JSF 2.0 servlet,也知道如何创建portlet,但是我在结合这两种技术时遇到了问题。我的JSF portlet工作得很好,直到我必须通过<h:commandLink />
调用支持bean的方法。当我单击这些链接时,当前页面将被重新加载,并且不会调用任何方法。我认为我的应用程序需要一些额外的配置。为了使这样的命令链接工作,需要做些什么:
<h:commandLink action="#{backingBean.doSomething}" />
请注意,我使用的是提供JSF 2.0 portlet桥接的WebSphere 8门户服务器。
编辑
我在这里看到了一个基本的冲突:
- portlet API负责生成url——生成有效的门户url
- JSF负责生成url -生成有效的JSF- url
我的托管bean是使用注释配置的:
@ManagedBean(name = "backingBean")
@ViewScoped
public class entryEditController
{
public String doSomething()
{
return "result.xhtml";
}
}
这是我的faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<application>
<view-handler>com.ibm.faces20.portlet.FaceletPortletViewHandler</view-handler>
<el-resolver>com.ibm.faces20.portlet.PortletELResolver</el-resolver>
<resource-handler>com.ibm.faces20.portlet.httpbridge.PortletResourceHandler</resource-handler>
</application>
</faces-config>
- WAS 8.0.0.8更新
-
如果您的bean是
@SessionScoped
或@ViewScoped
,您必须将此添加到web.xml:<context-param> <param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name> <param-value>false</param-value> </context-param>
- 在步骤2之前,我添加了一个带有无效动作值的新命令按钮。这将导致验证错误。如果出现验证错误,则不执行命令=>确保没有任何验证错误,例如,通过向模板添加
<h:messages />
- 阅读这个答案:https://stackoverflow.com/a/2120183/395879