在JSP页面中通过form表单提交时候,往往需要进行数据回显效果。例如以下场景往往需要数据回显:
(1)提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面。
(2)查询页面,点击查询后往往需要查询条件表单的数据回显。
例如如下一段用于请求查询的JSP代码:
<form method="post" action="${_index}/auth/roleErp" id="roleErpForm">
<div class="fe-fm-table">
<table width="100%">
<tbody>
<tr>
<th>ERPID:</th>
<td>
<input type="text" id="erp" name="erp" class="fe-text w160" value="$!{roleErp.erp}" />
</td>
<th>角色:</th>
<td>
<select id="roleId" name="roleId" class="fe-select w230 valid" value="$!{roleErp.roleId}">
<option value="" selected>请选择</option>
<option value="001">公司管理者</option>
<option value="002" >市场部</option>
<option value="003" >人力资源</option>
<option value="004" >售后</option>
</select>
</td>
<td>
<div class="btns">
<button id="input_select" type="submit" class="btn-h28 btn-blue mr20"><strong>查 询</strong></button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</form>
通过设置表单的value元素,接受回显controller返回请求的数据。可以通过以下方法使得SpringMVC回显数据。
一、 SpringMVC默认对pojo数据进行回显
springmvc默认对pojo数据进行回显。pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写),页面只需要写参数的属性就可以实现绑定。
@RequestMapping(value = "auth/roleErp")
public ModelAndView roleInfoList(RoleErp roleErp) {
ModelAndView mv = new ModelAndView("auth/roleErp");
return mv;
}
其中参数名roleErp必须是RoleErp类的首字母小写,注:此时如果参数名与参数的类型(即RoleErp类)不一致或者参数名与页面的绑定参数名(即<input type="text" id="erp" name="erp" class="fe-text w160" value="${roleErp.erp}" />
中的roleErp)不一致,数据将不能够回显。
注:有时候我们在开发过程中往往会遇到页面的表单元素多于请求参数类属性(这个参数类实际就是数据库实体类)的情况(即页面的Pojo类属性往往包含并多于domain的Pojo类属性的情况)。此时一个比较可行的方法则是页面Pojo类继承domain的Pojo类,多于表单元素添加为页面Pojo类属性,此时在请求参数类型可以替换为页面的Pojo类。如完整过程可描述为:
<input type="text" id="erp" name="erp" class="fe-text w160" value="${roleErpSearch.erp}" />
<input type="text" id="erpName" name="erpName" class="fe-text w160" value="${roleErpSearch.erpName}" />
RoleErp类为数据库实体类,而erpName字段为页面表单元素,在RoleErp类中添加该属性明显不合理,此时则可以定义一个RoleErpSearch类(继承RoleErp类)定于erpName属性。
public class RoleErp implements Serializable{
/**
* ERP
*/
private String erp;
public String getErp() {
return erp;
}
……
}
public class RoleErpSearch extends RoleErp implements Serializable {
String erpName;
public String getErpName() {
return erpName;
}
public void setErpName(String erpName) {
this.erpName = erpName;
}
……
}
在controller中用RoleErpSearch类接受参数即可。
@RequestMapping(value = "auth/roleErp")
public ModelAndView roleInfoList(RoleErpSearch roleErpSearch) {
ModelAndView mv = new ModelAndView("auth/roleErp");
return mv;
}
二、 通过@ModelAttribute数据回显
使用@ModelAttribute注解方式可实现数据回显效果。使用@ModelAttribute注解参数的方式默认也是参数类名首字母小写作为key值,但也可以通过@ModelAttribute(“roleErpSearch”)更改key值如下:
<input type="text" id="erp" name="erp" class="fe-text w160" value="${roleErpSearch.erp}" />
@RequestMapping(value = "auth/roleErp")
public ModelAndView roleInfoList(@ModelAttribute(“roleErpSearch”)RoleErp roleErpSearch) {
ModelAndView mv = new ModelAndView("auth/roleErp");
return mv;
}
当用@ModelAttribute(“roleErpSearch”)注释后,参数名就可以不再是RoleErp的首字母小写,此时,SpringMVC会把“roleErpSearch”作为key值写到request中,而页面引用时候绑定参数就得用“roleErpSearch”了。
三、 通过Model或ModelAndView数据回显
使用Model或ModelAndView也可以实现数据回显,此时则需要进行手动设置,手动设置比较灵活,可以改变key值等优势。采用Model方式只是把请求参数重新放回Request中,而ModelAndView则可以把请求参数放回到具体的视图域中。
@RequestMapping(value = "auth/roleErp")
public ModelAndView roleInfoList(RoleErp roleErpSearch) {
ModelAndView mv = new ModelAndView("auth/roleErp");
mv.addObject("roleErpSearch".roleErpSearch);
return mv;
}
或
@RequestMapping(value = "auth/roleErp")
public ModelAndView roleInfoList(Model model, RoleErp roleErpSearch) {
ModelAndView mv = new ModelAndView("auth/roleErp");
model.addAttribute("roleErpSearch",roleErpSearch);
return mv;
}
四、 简单数据的回显,需要手动设置
对于简单数据类型,如:Integer、String、Float等只能通过手动设置将传入的参数再放到request实现显示。手动方式可为:ModelAndView的mv.addObject(“id”,id)或Model 的model.addAttribute(“id”,id);
<input type="text" id="id" name="id" class="fe-text w160" value="$!{id}" />
@RequestMapping(value = "auth/roleErp")
public ModelAndView roleInfoList(Integer id) {
ModelAndView mv = new ModelAndView("auth/roleErp");
mv.addObject("id",id);
return mv;
}
或
@RequestMapping(value = "auth/roleErp")
public ModelAndView roleInfoList(Model model, Integer id) {
ModelAndView mv = new ModelAndView("auth/roleErp");
model.addAttribute("id",id);
return mv;
}