Java 如何使用重定向使方法返回null

Java 如何使用重定向使方法返回null,java,redirect,jsf-2,Java,Redirect,Jsf 2,在jsf中,我想返回到相同的页面,但带有重定向。因此,如果用户单击“刷新”,我不希望再次提交表单 public String changeLanguage() { if (locale == Locale.ENGLISH) locale = new Locale("ar"); else locale = Locale.ENGLISH; return null; } 查看代码:- mybean会话镜 <!DOCTYPE html PU

在jsf中,我想返回到相同的页面,但带有重定向。因此,如果用户单击“刷新”,我不希望再次提交表单

public String changeLanguage() {
    if (locale == Locale.ENGLISH)
        locale = new Locale("ar");
    else
        locale = Locale.ENGLISH;
    return null;
}
查看代码:- mybean会话镜

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui"
    xmlns:m="http://medicalgate.com/facelets" xmlns:h="http://java.sun.com/jsf/html">

<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>#{msg.hello}</title>
</h:head>
<h:body>
    <f:view locale="#{mybean.locale}">
        <h:form>
            <h:commandLink value="lang" action="#{mybean.changeLanguage}"></h:commandLink>
        </h:form>
    </f:view>
</h:body>
</html>

不幸的是,这个问题的答案并非一目了然那么简单。JSF是一个严重基于状态的框架,您想要的P-R-G模式不能很好地使用它

若您绝对必须这样做,那个么您将需要对bean请求的范围进行限定,并使用视图参数来持久化状态

基本上,您需要进行以下更改:

MyBean.java

@RequestScoped
public class MyBean {
    public string submit() {
        String outcome = "MyView?faces-redirect=true&includeViewParams=true";
        return outcome;
    }
/* Bean goes here */
}
MyView.jsf

不幸的是,这有一个缺点,那就是您的参数将被放入GET参数中http://mysite/MyView.jsf?fname=test,但您的页面也不会出现回发问题

因此,权衡是您要做的决定,打破后退按钮的状态性,或者无状态性,以及与JSF的状态性作斗争以避免回发的额外工作。

试试这个。您将看到如何根据当前区域设置页面标题。当您单击链接时,该方法将被调用一次,即使您刷新页面,也不会再次调用该方法。注意,您的mybean已被mybean替换:

{myBean.locale} 所选区域设置:{myBean.locale} @ManagedBean @会议范围 公共类MyBean{ Locale=Locale.ENGLISH; 公共字符串转换语言{ 调用System.out.printlnMethod; 如果locale==locale.ENGLISH locale=新的Localear; 其他的 locale=locale.ENGLISH; 返回null; } 公共语言环境getLocale{ 返回区域设置; } }
只需指出,您可以使用导航处理程序消除此问题中所述的重复参数:当然,您可以使用自定义导航处理程序来清理它,OCPSoft的重写库使它更干净,因为您可以使用@Paramatername注释字段,并避免整个viewParam混乱。我试着给出一个使用vanilla JSF来确保安全的示例:您不会在代码中发送任何视图参数,即使您是从视图中获取它。这不会保留{myBean.firstName}字段的状态。@XtremeBiker这正是重定向的includeViewParams=true位所做的。当这个参数包含在结果中时,当前页面的所有视图参数都会自动添加到重定向中。好的,还没看到,我很谦虚!无论如何,关于您的示例,请注意您缺少h:head标记,该标记。当前代码只执行一个页面转发并使您保持在同一页面上,您有什么问题?此代码将我返回到同一页面,当使用浏览器刷新按钮时,此方法将再次调用,我不希望这样。它不应该,你能发布你的视图代码吗?添加了完成视图代码。这在页面刷新时不会调用该方法。您使用的是哪个JSF版本/impl?我仍然不知道它对我不起作用。我正在我的项目中使用PrimeFacesAPI。这可能是原因吗?