做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}获取就可以了。

原文地址:https://www.cnblogs.com/sdgtxuyong/p/12022585.html