提交后清除JSF表单输入值

Ill*_*lep 11 forms jsf clear

如果有表单,并且有文本框和按钮,那么在提交表单后如何删除文本框的内容?

<h:inputText id="name" value="#{bean.name}" />          
<h:commandButton id="submit" value="Add Name" action="#{bean.submit}" />
Run Code Online (Sandbox Code Playgroud)

在文本框中输入值并提交后,该值仍显示在文本框中.我需要在提交后清除文本框的内容.我怎样才能做到这一点?

Vin*_*lds 14

您可以清空托管bean的属性,在呈现响应时不应重新绘制该属性.这可以使用类似于下面发布的代码段的代码完成:

private String name;

public String getName(){return name;}
public void setName(String name){this.name=name};

public String submit()
{
    //do some processing
    ...
    // blank out the value of the name property
    name = null;
    // send the user back to the same page.
    return null;
}
Run Code Online (Sandbox Code Playgroud)

可以在JSF运行时如何处理请求中找到当前行为的原因.对视图的所有JSF请求都按照JSF标准请求 - 响应生命周期进行处理.根据生命周期,在执行DataForm.Name应用程序事件(DataForm.submit)之前,使用来自请求的值(即,设置的值)更新托管bean内容.在渲染响应阶段呈现页面时,bean的当前值用于将视图呈现给用户.除非在应用程序事件中更改了值,否则该值将始终是从请求中应用的值.


Bal*_*usC 13

介绍

有几种方法可以实现这一目标.天真的方法是简单地清空支持bean中的字段.疯狂的方法是获取JS/jQuery,以便在提交后甚至在页面加载期间执行该操作.这些方式只会引入不必要的代码并指出思考/设计问题.所有你想要的只是一个新的请求/页面/视图/ bean.就像你得到GET请求一样.

POST重定向消息GET

因此,最好的方法是在提交后发送重定向.您可能已经听说过它:POST-Redirect-GET.它会在POST请求(表单提交)之后为您提供全新的GET请求,完全符合您的预期.这具有额外的好处,即当最终用户随后无意中按下F5并忽略浏览器警告时,不重新提交先前提交的数据.

有几种方法可以在JSF中执行PRG.

  1. 只需使用faces-redirect=true查询字符串返回相同的视图.假设a /page.xhtml,你可以在动作方法中这样做:

    public String submit() {
        // ...
    
        return "/page.xhtml?faces-redirect=true";
    }
    
    Run Code Online (Sandbox Code Playgroud)

    如果您仍然在使用JSF 1.x方式的导航案例,那么这是添加<redirect/>到相关导航案例的问题.另请参见如何使用导航规则进行重定向.

  2. 为了使其更具可重用性,您可以以编程方式获取视图ID:

    public String submit() {
        // ...
    
        UIViewRoot view = FacesContext.getCurrentInstance().getViewRoot();
        return view.getViewId() + "?faces-redirect=true";
    }
    
    Run Code Online (Sandbox Code Playgroud)

    无论哪种方式,如果您还查看了需要在请求URL中保留的参数,那么请附加&includeViewParams=true到结果中.另请参阅在JSF表单提交上保留GET请求查询字符串参数.

  3. 如果你正在使用一些在JSF上下文之外运行的URL重写解决方案,那么你最好抓住当前的请求URL(带有查询字符串)并使用它ExternalContext#redirect()来重定向到那个.

    public void submit() throws IOException {
        // ...
    
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        StringBuffer requestURL = ((HttpServletRequest) ec.getRequest()).getRequestURL();
        String queryString = ((HttpServletRequest) ec.getRequest()).getQueryString();
        ec.redirect((queryString == null) ? requestURL.toString() : requestURL.append('?').append(queryString).toString());
    }
    
    Run Code Online (Sandbox Code Playgroud)

    它只是一个混乱,应该真的被重构为一些实用类.

请求/查看范围内的bean

请注意,这一切都可以很好地与请求或视图范围的bean结合使用.如果你有一个与表单绑定的会话范围bean,那么不会从头开始重新创建bean.那你就是另一个需要解决的问题.将其拆分为一个较小的会话范围,一个用于会话范围数据,另一个范围用于视图范围数据.另请参见如何选择正确的bean范围?

面对消息

如果您因成功操作而显示面部消息,则只需将其设为flash消息即可.另请参阅如何在重定向页面中显示面部消息.

public String submit() {
    // ...

    FacesContext context = FacesContext.getCurrentInstance();
    context.addMessage(clientId, message);
    context.getExternalContext().getFlash().setKeepMessages(true);
    return "/page.xhtml?faces-redirect=true";
}
Run Code Online (Sandbox Code Playgroud)

阿贾克斯

只有当你碰巧有一个只有ajax的页面时,F5才会总是触发一个全新的GET请求,那么简单地将动作方法中的模型字段归零不应该造成太大的伤害.

也可以看看:


小智 5

您可以从提交表单时调用的Bean方法中清除表单;

private String name;
    private String description;
    private BigDecimal price;

/*----------Properties ------------*/
/*-----Getter and Setter Methods---*/

public void save()throws SQLException{
String sql = "INSERT INTO tableName(name,description,price) VALUES (?,?,?)";
    Connection conn = ds.getConnection();
    try {

        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, getName());
        pstmt.setString(2, getDescription());
        pstmt.setBigDecimal(3, getPrice());

        pstmt.executeUpdate();
    } catch (SQLException e) {
        e.getMessage();
        e.toString();
    }finally{
        conn.close();
        clear();
    }

}//End Save Method

public void clear(){
    setName(null);
    setDescription(null);
    setPrice(null);
}//end clear`
Run Code Online (Sandbox Code Playgroud)

请注意,在完成save方法的所有操作之后,将从save方法调用clear()方法。作为一种选择,您只有在方法操作成功的情况下才可以执行清除...以下方法位于ProductController类中...

    public String saveProduct(){
    try {
        product.save(); 
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

从view / jsp进行的方法调用如下所示:

<h:commandButton value="Save" action="#{productController.saveProduct}"/>
Run Code Online (Sandbox Code Playgroud)

  • 这个答案与Vineet的答案有何不同?该答案仅包含更多无关的噪声。 (3认同)

归档时间:

查看次数:

46791 次

最近记录:

8 年,6 月 前