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">«</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">»</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;
}