springmvc CRUD控制器写法和jsp页面写法 总结大全。

本例介绍控制器和jsp页面的写法,分两部分。

本文中,jsp页面,一共有3个,浏览页面,增加页面,修改页面。

控制器一共有6个。浏览getAuthors,增加页面跳转authorAdd,增加业务authorSave,修改页面跳转authorModify,修改业务authorUpdate,删除业务authorDel。

一、控制器

1,入参。

其中控制器中,需要带id传值的,有2个,一个删除业务,一个是修改页面跳转。这里两个同样需要路径参数注解。

带bean传值的,有3个,一个是增加页面跳转,一个是增加业务,一个是修改业务。

带BindingResult,error返回值的,有2个,一个是增加业务。一个是修改业务。

带Valid校验bean的,也是2个,一个是增加业务。一个是修改业务。

带路径参数注解 @PathVariable的,有2个。一个是删除业务,一个是修改页面跳转。

带请求参数注解 @RequestParam 的,有1个,浏览所有getAuthors。且该请求参数后需要跟着实参。

代码如下:

@Controller
public class ZhouyiAuthorController {
    

    @Autowired
    private ZhouyiAuthorService zhouyiAuthorService;
    
    @RequestMapping("/getAuthors")
    public ModelAndView getAuhoros(@RequestParam(value="pn",defaultValue = "1")Integer pn) {
        PageHelper.startPage(pn, 12);
        ModelAndView mv = new ModelAndView("zhouyiAuthor");
        List<ZhouyiAuthor> zhouyiContentAuthors = zhouyiAuthorService.getZhouyiContentAuthors();
        PageInfo page = new PageInfo(zhouyiContentAuthors,7);
        mv.addObject("pageinfo", page);
        return mv;
    }
    
    @RequestMapping("/zhouyiAuthorDel/{id}")
    public ModelAndView zhouyiAuthorDel(@PathVariable("id") Integer id) {
        ModelAndView mv = new ModelAndView();
        List<ZhouyiAuthor> zhouyiAuthorsFromContents = zhouyiAuthorService.getZhouyiAuthorsFromContents(id);
        if(zhouyiAuthorsFromContents.size()>0) {
            mv.addObject("errors", "*该作者下有子类目,不允许删除!");
            mv.setViewName("forward:/getAuthors");
            return mv;
        }
        int deleteZhouyiContentAuthor = zhouyiAuthorService.deleteZhouyiContentAuthor(id);
        if(deleteZhouyiContentAuthor!=1) {
            mv.addObject("errors", "*删除异常!");
            mv.setViewName("forward:/getAuthors");
            return mv;
        }
        
        mv.setViewName("redirect:/getAuthors");
        return mv;
    }
    
    @RequestMapping("/zhouyiAuthorAdd")
    public ModelAndView zhouyiAuthorAdd(ZhouyiAuthor zhouyiAuthor){
        ModelAndView mv = new ModelAndView("zhouyiAuthorAdd");
        return mv;
    }
    
    @RequestMapping("/zhouyiAuthorSave")
    public ModelAndView zhouyiAuthorSave(@Valid ZhouyiAuthor zhouyiAuthor,BindingResult errors) {
        ModelAndView mv = new ModelAndView();
        if(errors.getFieldErrorCount()>0) {
            for (FieldError err : errors.getFieldErrors()) {
            System.out.println("err.field:= "+err.getField()+ "  | message:==="+ err.getDefaultMessage());
            }
            mv.setViewName("zhouyiAuthorAdd");
            return mv;
        }
        zhouyiAuthorService.addZhouyiContentAuthor(zhouyiAuthor);
        mv.setViewName("forward:/getAuthors");
        return mv;
    }
    
    @RequestMapping("/zhouyiAuthorModify/{id}")
    public ModelAndView zhouyiAuthorModify(@PathVariable("id") Integer id) {
        ModelAndView mv = new ModelAndView("zhouyiAuthorModify");
        mv.addObject("zhouyiAuthor",zhouyiAuthorService.getZhouyiContentAuthorById(id) );
        return mv;
    }
    
    @RequestMapping("/zhouyiAuthorUpdate")
    public ModelAndView zhouyiAuthorUpdate(@Valid ZhouyiAuthor zhouyiAuthor,BindingResult errors) {
        ModelAndView mv = new ModelAndView();
        if(zhouyiAuthor.getOrderId()==null) {
            errors.addError(new FieldError("zhouyiAuthor", "orderId", "不能为空"));
        }
        if(errors.getErrorCount()>0) {
            mv.setViewName("zhouyiAuthorModify");
            return mv;
        }
        zhouyiAuthorService.modifyZhouyiContentAuthor(zhouyiAuthor);
        mv.setViewName("redirect:/getAuthors");
        return mv;
    
    }
    
}

 

2.jsp页面。

有3个,如果能用springmvc标签写的,就用springmvc标签写,不要用html普通标签写,因为有一些附件功能,比如path在修改页面时,若有列表可以自动检查当前值并且选中。

 头如下:

<title>Yiwiki - 作者</title>
<% pageContext.setAttribute("APP_PATH", request.getContextPath()); %>
<script  src="${APP_PATH}/static/js/jquery-1.12.4.min.js"></script>
<link href="${APP_PATH}/static/bootstrap-3.3.7-dist/css/bootstrap-theme.css" rel="stylesheet">
<link href="${APP_PATH}/static/bootstrap-3.3.7-dist/css/bootstrap.css" rel="stylesheet">
<script  src="${APP_PATH}/static/bootstrap-3.3.7-dist/js/bootstrap.js" ></script>

</head>
<body>

头文件包括如下:

<body>
<jsp:include page="/header.jsp"></jsp:include>
    <ol class="breadcrumb">
        <li><a href="#">Home</a></li>
        <li><a href="#">作者分类</a></li>
        <li class="active">修改</li>
    </ol>
//下面为主体部分
<div class="container">

 

 浏览页面如下:

<div class="container">
        <span style="margin-left:3px;color:#ce4844;font-weight:bold">${errors }</span>
        
        <a href="${APP_PATH }/zhouyiAuthorAdd"><button type="button" class="btn btn-primary "
            style="margin-bottom: 8px; float: right">新增</button></a>
        <table class="table table-striped table-hover">
            <tr>
                <td>ID</td>
                <td>排序</td>
                <td>作者名称</td>
                <td>说明</td>
                <td>操作</td>
            </tr>

            <c:forEach items="${pageinfo.list }" var="zhouyiAuthor">
                <tr>
                    <td>${zhouyiAuthor.id }</td>
                    <td>${zhouyiAuthor.orderId }</td>
                    
                    <td>${zhouyiAuthor.name }</td>
                    <td>${zhouyiAuthor.info }</td>
                    <td><a href="${APP_PATH }/zhouyiAuthorModify/${zhouyiAuthor.id}"><button type="button" class="btn btn-primary btn-xs btn_edit" edit_id="${zhouyiAuthor.id }">修改</button></a>
                        <a href="${APP_PATH }/zhouyiAuthorDel/${zhouyiAuthor.id}"><button type="button" class="btn btn-primary btn-xs" onclick="return confirm('确定要删除吗?')">删除</button></a></td>
                </tr>
            </c:forEach>
        </table>
        共${pageinfo.total }条记录,共${pageinfo.pages }页
        <nav style="float: right" aria-label="Page navigation">
            <ul class="pagination">
                <li><a
                    href="${APP_PATH }/getAuthors?pn=1"
                    aria-label="Previous"> <span aria-hidden="true">&laquo;</span>
                </a></li>

                <c:forEach items="${pageinfo.navigatepageNums }" var="nums">
                    <c:if test="${pageinfo.pageNum == nums }">
                        <li class="active"><a
                            href="${APP_PATH }/getAuthors?pn=${nums}">${nums }</a></li>
                    </c:if>
                    <c:if test="${pageinfo.pageNum != nums }">
                        <li><a
                            href="${APP_PATH }/getAuthors?pn=${nums}">${nums }</a></li>
                    </c:if>
                </c:forEach>

                <li><a
                    href="${APP_PATH }/getAuthors?pn=${pageinfo.pages}"
                    aria-label="Next"> <span aria-hidden="true">&raquo;</span>
                </a></li>
            </ul>
        </nav>

    

    </div>

增加跳转页面如下:

<div class="container">
<form:form  modelAttribute="zhouyiAuthor" class="form-horizontal" id="saveForm"  >

  <div class="form-group">
 
    <label for="name" class="col-sm-2 control-label">作者</label>
    <div class="col-sm-6">
     <form:input type="text" path="name" class="form-control" id="name" placeholder="姓名" /><form:errors path="name"></form:errors>
    </div>
  </div>
  
<div class="form-group">
    <label for="info" class="col-sm-2 control-label">说明</label>
    <div class="col-sm-6">
      <form:input type="text"  path="info" class="form-control" id="info" placeholder="备注"/><form:errors path="info"></form:errors>
    </div>
  </div>
   
    <div class="form-group">
    <label for="" class="col-sm-2 control-label"></label>
    <div class="col-sm-6" >
      <button type="submit" id="saveIndex" class="btn btn-primary" formenctype="multipart/form-data"   formaction="${APP_PATH }/zhouyiAuthorSave" formmethod="post"  >保存</button>
    </div>
  </div>

   </form:form>
      
    </div>

修改页面如下:修改页面必须有隐藏的id域,以便于在modify业务时,作为入参确定唯一性。

<div class="container">
<form:form  modelAttribute="zhouyiAuthor" class="form-horizontal" id="saveForm"  >

  <div class="form-group">
 <form:hidden path="id"/>
    <label for="name" class="col-sm-2 control-label">作者</label>
    <div class="col-sm-6">
     <form:input type="text" path="name" class="form-control" id="name" placeholder="姓名" /><form:errors path="name"></form:errors>
    </div>
  </div>
  
<div class="form-group">
    <label for="info" class="col-sm-2 control-label">说明</label>
    <div class="col-sm-6">
      <form:input type="text"  path="info" class="form-control" id="info" placeholder="备注"/><form:errors path="info"></form:errors>
    </div>
  </div>
   <div class="form-group">
    <label for="orderId" class="col-sm-2 control-label">排序</label>
    <div class="col-sm-2">
      <form:input type="text"  path="orderId" class="form-control" id="orderId" placeholder="排序"/><form:errors path="orderId"></form:errors>
    </div>
  </div>
    <div class="form-group">
    <label for="" class="col-sm-2 control-label"></label>
    <div class="col-sm-6" >
      <button type="submit" id="saveIndex" class="btn btn-primary" formenctype="multipart/form-data"   formaction="${APP_PATH }/zhouyiAuthorUpdate" formmethod="post"  >保存</button>
    </div>
  </div>
  </form:form>
    </div>

 

JSR303 校验与错误跳转

如果使用valid注解,进行bean的校验,BindingResult errors ,在页面跳转时,不能有forward和redirect修饰符,且,跳转后的页面,如果有之前关联的bean,内容被清空,需要再一次赋值一次。

也就是说,如果用自带的jsr303校验,不能有关联的bean,或者给关联的bean在再次赋值。并且跳转时,不能有forward和redirect。

若必须跳转到它页处理,可以用modelandview把值扶到这里,然后再跳转,不使用官方自带的错误机制。

如下,:add页面时显示页面,save页面是业务页面。本例因为大量写入,所以没有跳转到目录浏览页面,继续留在添加页面,这里这个例子并不是很通用。

@RequestMapping("/zhouyiContentAdd")
    public ModelAndView zhouyiContentAdd(ZhouyiContent zhouyiContent,@SessionAttribute("authorId") Integer authorId){
        ModelAndView mv = new ModelAndView();
        zhouyiContent.setContent(null);
        zhouyiContent.setInfo(null);
        mv.addObject("zhouyiAuthor", zhouyiAuthorService.getZhouyiContentAuthorById(authorId));
        mv.addObject("zhouyiYao",zhouyiYaoService.getZhouyiYaos() );
        
        mv.setViewName("zhouyiContentAdd");
        return mv;
    }
    
    @RequestMapping("/zhouyiContentSave")
    public ModelAndView zhouyiContentSave(@Valid ZhouyiContent zhouyiContent,BindingResult errors,@SessionAttribute("authorId") Integer authorId) {
        ModelAndView mv = new ModelAndView();
        
        if(errors.getErrorCount()>0) {
            mv.addObject("tips", null);
            mv.addObject("errors", "*添加保存异常!");
            mv.addObject("zhouyiAuthor", zhouyiAuthorService.getZhouyiContentAuthorById(authorId));
            mv.addObject("zhouyiYao",zhouyiYaoService.getZhouyiYaos() );
            mv.setViewName("zhouyiContentAdd");
            return mv;
        }
        zhouyiContentService.addZhouyiContent(zhouyiContent);
        mv.addObject("tips", zhouyiContent.getId()+"条,添加成功!");
        mv.setViewName("forward:/zhouyiContentAdd");
        
        return mv;
    }

 

posted @ 2020-01-15 08:23  琴声清幽  阅读(461)  评论(0编辑  收藏  举报