做add添加业务时,字符集乱码,form标签库,button的href 问题,添加后页面跳转,forward,redirect 。定制错误输出
在做添加add业务时,需要用springmvc的标签库,<form:input path="username">,指定其path属性,然后在form的指定modelattribute的属性。再在controller方法中传入bean。(开时显示时传入,类似bean的占位符,在正式添加时也要传入),在bean里,可以添加jsr303校验。
1. 在用springmvc 添加到 数据库中时,中文乱码,解决办法为 在web.xml文件中,添加如下(可以试着添加到web.xml的最上面)
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
然后在数据库中,建立表时,用utf8编码存储。
2. form标签,在用springmvc时,必须用springmvc提供的标签才能完成封装bean,使用springmvc的标签后,仍然可以使用bootstrap的class样式
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
3.再用bootstrap时,button添加href跳转,直接用a标签,包围button即可。
<a href="${pageContext.request.contextPath }/addRolePage"><button type="button" class="btn btn-primary" style="margin-bottom: 8px; float: right" >新增</button></a>
4.用redirect跳转后,有时不更新页面,但用forward跳转,可以更新。后来测试,用redirect;/getRoles也可以更新。
@RequestMapping("/addRole") public String addRole(Role role) { roleService.addRole(role); // return "forward:/getRoles"; 用这个,在提交后,强制刷新,有重复提交的问题。
return "redirect:/getRoles"; }
5.在校验时,定制错误输出,比如我在add业务时,有一个规则,需要判断name不能重复。可以用这样的办法
调用service的判断,是否重复,然后把这个错误加入到BindingResult,里面,加入时有默认时ObjectErrors,但是这个类不能指定path属性,改为用new FieldError("role","name","角色名称重复"),的方法
代码如下,这样在前台<form:errors path="name">时,可以用path=“name”,就可以定制错误输出。
@RequestMapping("/addRole") public String addRole(@Validated Role role,BindingResult error) { if(role.getName()!=null&&roleService.getRoleByName(role.getName())!=null) { error.addError(new FieldError("role","name","角色名称重复")); }; if(error.getErrorCount()>0) { System.out.println("出错了!"); System.out.println(error.toString()); for(FieldError err:error.getFieldErrors()){ System.out.println(err.getField() + ":" + err.getDefaultMessage()); } return "addRolePage"; } roleService.addRole(role); return "redirect:/getRoles"; }
另外在做删除业务时,在判断是否能删除后,如果不能删除,给前台一个警告提示,这时可以用ModelAndView,然后把错信息添加给mv,再跳转,跳转后,需要加载原来的list数据,这时必须用forward,否则没有提示信息。forward的浏览器属性数据可以共享,且地址不变。但是redirect则不同
@RequestMapping("/roleDel/{id}") public ModelAndView roleDel(@PathVariable("id") Integer id,Role role,BindingResult error) { ModelAndView mv = new ModelAndView("forward:/getRoles"); Integer deleteRole = roleService.deleteRole(id); if(deleteRole==0) { error.addError(new FieldError("role", "name", "角色下有数据不为空")); System.out.println("error出错了"+error.toString()); mv.addObject("roleerr", "角色下有数据,不能删除"); System.out.println(mv.toString()); } return mv; }
前台页面用${roleerr}获取就可以了。