java 在 JSF Bean 中找不到方法
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13861758/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Method Not Found in JSF Bean
提问by bali208
I have completed an application using JSF 1.x, which is up and running.
我已经使用 JSF 1.x 完成了一个应用程序,该应用程序已启动并正在运行。
The application has 2 parts, one being invoke a action event and display the same page, and the second being invoke a method and navigate to next page. Typical Hello world Example.
该应用程序有两个部分,一个是调用一个动作事件并显示相同的页面,第二个是调用一个方法并导航到下一页。典型的 Hello world 示例。
But the Second part of the application is not working as it is not finding the method in the bean class.
但是应用程序的第二部分不起作用,因为它没有在 bean 类中找到方法。
The 'Goodbye' button in hello.jsp
is not working.
中的“再见”按钮hello.jsp
不起作用。
I invoked the Url http://localhost:8090/balaji/faces/JSP/hello.jsp
which is executing correctly displaying me the hello.jsp page.
我调用了http://localhost:8090/balaji/faces/JSP/hello.jsp
正确执行的 Url ,向我显示了 hello.jsp 页面。
But the Goodbye Button in hello.jsp page is not working, which when clicked will not change the URL. But i got the error on stack trace as shown below. The Method is existing and it is public, EL expression is correct, navigation rule is set, JSP page exist, but the method is not responding.
但是 hello.jsp 页面中的 Goodbye Button 不起作用,单击时不会更改 URL。但是我在堆栈跟踪中遇到错误,如下所示。Method存在并且是public,EL表达式正确,导航规则设置,JSP页面存在,但是方法没有响应。
My Stack Trace show the following Error:
我的堆栈跟踪显示以下错误:
Stacktrace:
堆栈跟踪:
13 Dec, 2012 7:17:19 PM javax.faces.event.MethodExpressionActionListener processAction
SEVERE: Received 'org.apache.jasper.el.JspMethodNotFoundException' when invoking action listener '#{helloBean.goodbye}' for component 'goodbyeCommand'
13 Dec, 2012 7:17:19 PM javax.faces.event.MethodExpressionActionListener processAction
SEVERE: org.apache.jasper.el.JspMethodNotFoundException: /JSP/hello.jsp(40,2) '#{helloBean.goodbye}' Method not found: [email protected](javax.faces.event.ActionEvent)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:73)
at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:99)
at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:771)
at javax.faces.component.UICommand.broadcast(UICommand.java:372)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:475)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:756)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1822)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
My Application Structure is as follows :
我的应用程序结构如下:
Package Structure :
封装结构:
Maven Dependencies :
Maven 依赖项:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.achutha.labs</groupId>
<artifactId>02JsfExample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>02JsfExample</name>
<dependencies>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>1.2_14</version>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>1.2_14</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<!-- EL -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>el-impl</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<build>
<finalName>JavaServerFaces</finalName>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<url>http://localhost:8090/manager/text</url>
<server>TomcatServer</server>
<path>/balaji</path>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Faces Configuration :
人脸配置:
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
<managed-bean>
<description> The one and only HelloBean.</description>
<managed-bean-name>helloBean</managed-bean-name>
<managed-bean-class>com.achutha.bean.HelloBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<description>Navigation From the Hello Page.</description>
<from-view-id>/JSP/hello.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/JSP/goodbye.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
Deployment Descriptor (web.xml) :
部署描述符(web.xml):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app version="2.5"
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-app_2_5.xsd">
<display-name>Hello, World!</display-name>
<description>Welcome to JavaServer Faces</description>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>faces/JSP/hello.jsp</welcome-file>
</welcome-file-list>
</web-app>
hello.jsp
你好.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<f:view>
<html>
<head>
<title>JSF In Action - Hello, world!</title>
</head>
<body>
<h:form id="welcomeForm">
<h:outputText id="welcomeOutput" value="Welcome to JavaServer Faces !"
style="font-family: Arial, sans-serif; font-size: 23; color: green;" />
<p>
<h:message id="errors" for="helloInput" style="color: red" />
</p>
<p>
<h:outputLabel for="helloInput">
<h:outputText id="helloInputLabel"
value="Enter Number of controls to display: ">
</h:outputText>
<h:inputText id="helloInput" value="#{helloBean.numControls}"
required="true">
<f:validateLongRange minimum="1" maximum="500" />
</h:inputText>
</h:outputLabel>
</p>
<p>
<h:panelGrid id="controlPanel" binding="#{helloBean.controlPanel}"
columns="20" border="1" cellspacing="0" />
</p>
<h:commandButton id="redisplayCommand" type="submit" value="Redisplay"
actionListener="#{helloBean.addControls}" />
<h:commandButton id="goodbyeCommand" type="submit" value="Goodbye"
actionListener="#{helloBean.goodbye}" immediate="true"/>
</h:form>
</body>
</html>
</f:view>
goodbye.jsp :
再见.jsp :
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<html>
<head>
<title>Jsf in Action - Hello World!</title>
</head>
<body>
<h:form id="goodbyeForm">
<p>
<h:outputText id="welcomeOutput" value="Good Bye"
style="font-family: Arial, sans-serif; font-size: 24; font-style: bold; color: green;" />
</p>
<p>
<h:outputText id="helloBeanOutputLabel"
value="Number of controls displayed: " />
<h:outputText id="helloBeanOutputLabel"
value="#{helloBean.numControls}" />
</p>
</h:form>
</body>
</html>
</f:view>
Bean class :
豆类:
package com.achutha.bean;
import java.util.List;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
public class HelloBean {
private int numControls;
private HtmlPanelGrid controlPanel;
public int getNumControls() {
return numControls;
}
public void setNumControls(int numControls) {
this.numControls = numControls;
}
public HtmlPanelGrid getControlPanel() {
return controlPanel;
}
public void setControlPanel(HtmlPanelGrid controlPanel) {
this.controlPanel = controlPanel;
}
public void addControls(ActionEvent actionEvent) {
Application application = FacesContext.getCurrentInstance()
.getApplication();
List<UIComponent> children = controlPanel.getChildren();
children.clear();
for (int count = 0; count < numControls; count++) {
HtmlOutputText output = (HtmlOutputText) application
.createComponent(HtmlOutputText.COMPONENT_TYPE);
output.setValue(" " + count + " ");
output.setStyle("color: blue");
children.add(output);
}
}
public String goodbye() {
return "success";
}
}
Clean Deployment :The application is deploying itself fine on Tomcat 7. I checked the deployed package structure on &tomcat_home%/webapps and all the JSP files are intact in proper place as expected.
干净部署:该应用程序在 Tomcat 7 上部署得很好。我检查了 &tomcat_home%/webapps 上部署的包结构,所有 JSP 文件都按预期在适当的位置完好无损。
I am not able to figure out the error, and what makes 'GoodBye' button trigger ?
我无法弄清楚错误,是什么让“再见”按钮触发?
回答by Fritz
Your goodbye
method doesn't have the complete firm of an ActionListener
你的goodbye
方法没有一个完整的公司ActionListener
public String goodbye() {
return "success";
}
It must receive an ActionEvent
as a parameter like your other method does and return void, if I'm not mistaken. As it is, you might actually want to put it as an action
instead of an actionListener
in your commandButton
, changing
ActionEvent
如果我没记错的话,它必须像您的其他方法一样接收一个作为参数并返回 void。实际上,您可能实际上想将它作为 anaction
而不是actionListener
in 您的commandButton
,更改
<h:commandButton id="goodbyeCommand" type="submit" value="Goodbye"
actionListener="#{helloBean.goodbye}" immediate="true"/>
to
到
<h:commandButton id="goodbyeCommand" type="submit" value="Goodbye"
action="#{helloBean.goodbye}" immediate="true"/>
and leaving the goodbye
method as it is.
并保持goodbye
方法不变。