如果有表单,并且有文本框和按钮,那么在提交表单后如何删除文本框的内容?
<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-Redirect-GET.它会在POST请求(表单提交)之后为您提供全新的GET请求,完全符合您的预期.这具有额外的好处,即当最终用户随后无意中按下F5并忽略浏览器警告时,不重新提交先前提交的数据.
有几种方法可以在JSF中执行PRG.
只需使用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/>
到相关导航案例的问题.另请参见如何使用导航规则进行重定向.
为了使其更具可重用性,您可以以编程方式获取视图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请求查询字符串参数.
如果你正在使用一些在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范围?
如果您因成功操作而显示面部消息,则只需将其设为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)
归档时间: |
|
查看次数: |
46791 次 |
最近记录: |