3

我有一个非常痛苦的问题。在网上找不到解决方案。

我正在使用带有 JSF 的 Spring 3.0,并且配置了 PrimeFaces Spring Security,还配置了 Spring Web Flow(但我在本示例中没有使用它)。

这是我想要实现的行为:用户从 p:selectOneMenu 中选择一个值并提交更改。然后为 Bean 发送值,并且它也在那里被更改。效果:使用 p:selectOneMenu 我更改了 userBean 中的值

全部实施后,我得到一个错误,上面写着:

    HTTP Status 405 - Request method 'POST' not supported

选择一个菜单是这样写的:

<f:view>
<h:form id="formUserChange"  >
<p:panelGrid columns="2">
<p:selectOneMenu id="chooseUserType" onchange="formUserChange.submit();" 
value="#{userBean.userType}" valueChangeListener="#{userBean.processValueChange}" 
style="padding: 0px 5px; font-size: 13px; width: 200px;" >
      <f:selectItem itemLabel="Option 1" itemValue="KO" />
      <f:selectItem itemLabel="Option 2" itemValue="KJ" />
</p:selectOneMenu>
</p:panelGrid>
</h:form>
</f:view>

Bean是这样放置的:

   @ManagedBean(name = "userBean")
   @SessionScoped
   public class UserBean implements Serializable, ValueChangeListener {

private static final long serialVersionUID = 1L;

private String userName = "Michal";
private String userType = "WO";

public UserBean() {
}

public String getUserName() {
    System.out.println("I got now " + userType);
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getUserType() {
    return userType;
}

public void setUserType(String userType) {
    this.userType = userType;
    System.out.println("I set user as " + userType);
}

@Override
public void processValueChange(ValueChangeEvent arg0) throws AbortProcessingException {
    System.out.println("I have got " + userType);
}

    }

在我在网上找到的一个例子中,有人说不需要 valueChangeListener 因为 value="#{userBean.userType}" 可以解决问题,但这不是这里的问题,我都试过了,但都没有效果。

值根本没有变化。我知道 bean 在控制台上工作,但在控制台上出现错误:

    18:09:26,565 INFO  [stdout] (http-localhost-127.0.0.1-8080-4) I got now WO

    18:09:28,537 WARN  [org.springframework.web.servlet.PageNotFound] (http-localhost-127.0.0.1-8080-4) Request method 'POST' not supported

我也得到了页面(如开头所述):

    HTTP Status 405 - Request method 'POST' not supported

我错过了什么?任何注释或某事?我不知道出了什么问题

4

1 回答 1

0
  1. 如果您使用的是 Spring Webflow,则不建议使用 @ManagedBean 注释 - 您将无法从中访问 Spring bean。请改用@Component('userBean') 和@Scope(value=WebApplicationContext.SCOPE_SESSION)。您需要将 Spring EL 解析器添加到您的配置中,以便 Faces 能够解析您的 Spring bean,请参阅http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/web/jsf /el/SpringBeanFacesELResolver.html

  2. 您无需提交表单即可更新支持 bean 的值。删除 onchange="formUserChange.submit();"。在 JavaScript 中通过 ID 引用 JSF 组件不是一个好习惯,因为这些可能会发生变化。

  3. 如果您不需要值更改侦听器,您可以添加 ajax 处理程序以让 selectOneMenu 在更改事件上更新支持 bean:

<p:selectOneMenu id="chooseUserType" value="#{userBean.userType}" style="padding: 0px 5px; font-size: 13px; width: 200px;" >
      <f:selectItem itemLabel="Option 1" itemValue="KO" />
      <f:selectItem itemLabel="Option 2" itemValue="KJ" />
      <p:ajax event="change"/>
</p:selectOneMenu>
于 2013-01-17T15:27:03.650 回答