SpringMVC 通用Controller

1public abstract class AbstractController<T extends AbstractEntity> { 2 3    @Resource 4    private Validator validator; 5 6    protected static final Logger logger = LoggerFactory.getLogger(AbstractController.class); 7 8    protected String className; 9 10    protected String entityName; 11 12    public AbstractController() { 13        className = ReflectionUtils.getSuperClassGenricType(getClass()).getName(); 14        entityName = StringUtils.substringAfterLast(className, ".").toLowerCase(); 15    } 16 17    /** 18     * 获取实体服务类的实例 19     * 20     * @return 21     */ 22    protected abstract Manager<T, String> getEntityService(); 23 24    /** 25     * 获取View的基础位置,例如ugr/user/ ,系统会自动添加list,edit等 26     * 27     * @return 28     */ 29    protected abstract String getBasePagePath(); 30 31    /** 32     * 选择删除项目的模式,默认为空或是logic表示逻辑删除,不等于logic则表示物理删除 33     * 34     * @return 35     */ 36    protected abstract String getDeleteMode(); 37 38    @InitBinder 39    public void initBinder(WebDataBinder binder) { 40        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 41        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); 42        binder.registerCustomEditor(Integer.class, new CustomNumberEditor(Integer.class, true)); 43        binder.registerCustomEditor(Double.class, new CustomNumberEditor(Double.class, true)); 44        binder.registerCustomEditor(MultipartFile.class, new ByteArrayMultipartFileEditor()); 45    } 46 47    /** 48     * 根据默认的请求参数进行分页查询。 回调函数:beforeDoList(...), afterDoList(...) 49     * 50     * @param request 51     *            当前的HttpServletRequest 52     * @param filterMap 53     *            过滤条件,如:filterMap.put("id_eq", "12222222")。 可以为null 54     * 55     * @param sortMap 56     *            排序条件,如:sortMap.put("id", "desc"); asc为正序,desc为倒序。 可以为null 57     * @return ScrollResult<T> 58     */ 59    @RequestMapping(value = "list", method = { RequestMethod.POST, RequestMethod.GET }) 60    public ModelAndView list(HttpServletRequest request) { 61 62     63        // 提取客户端可能传送的过滤条件和排序条件 64        Map<String, Object> filterMap = WebUtils.getParametersStartingWith(request, "search_"); 65        Map<String, Boolean> sortMap = HcUtils.getOrderFromPage(request, "sort_"); 66 67        // 自定义查询、排序条件 68        beforeList(request, filterMap, sortMap); 69 70        HibernateCriteria hc = HcUtils.creat(filterMap, sortMap); 71 72        ModelAndView mav = new ModelAndView(); 73 74        doList(mav, request, hc); 75         76        afterList(mav, request); 77         78        // 向叶面发送查询和排序条件 79        for(String key:filterMap.keySet()){             80            mav.addObject(StringUtils.substringBefore(key, "_"), filterMap.get(key)); 81        } 82         83        for(String key:sortMap.keySet()){ 84            mav.addObject(StringUtils.substringBefore(key, "_"), sortMap.get(key)); 85        } 86 87        mav.setViewName(getBasePagePath() + "list"); 88 89        return mav; 90    } 91 92    /** 93     * 分页查询(list)回调函数,该方法在执行查询之前调用。可以继续添加过滤条件和排序条件。 94     * 95     * @param request 96     * @param filterMap 97     * @param sortMap 98     */ 99    protected void beforeList(HttpServletRequest request, Map<String, Object> filterMap, Map<String, Boolean> sortMap) { 100    }; 101 102    protected void doList(ModelAndView model, HttpServletRequest request, HibernateCriteria hc) { 103        int pageNumber = com.gbhk.core.util.WebUtils.getPageNumber(request); 104        int pageSize = com.gbhk.core.util.WebUtils.getPageSize(request); 105 106        Page<T> datas = null; 107        if (hc.criterion.isEmpty()) { 108            datas = getEntityService().getPage(pageNumber, pageSize, "id", true); 109        } else { 110            datas = getEntityService().getPageByCriteria(pageNumber, pageSize, hc); 111        } 112        model.addObject("datas", datas); 113        model.addObject("pageNumber", pageNumber); 114    } 115 116    /** 117     * 分页查询(list)回调函数,该方法在返回视图之前调用。可以继续添加返回信息。 118     * 119     * @param request 120     * @param response 121     * @param mav 122     */ 123    protected void afterList(ModelAndView model, HttpServletRequest request) { 124    }; 125 126    @SuppressWarnings("unchecked") 127    @RequestMapping(value = "preCreate", method = { RequestMethod.POST, RequestMethod.GET }) 128    public ModelAndView preCreate(int page, HttpServletRequest request) throws Exception { 129        T bean = (T) ReflectionUtils.getSuperClassGenricType(getClass()).newInstance(); 130        ModelAndView mav = new ModelAndView(); 131        beforePreCreate(mav, bean, request); 132 133        mav.addObject("bean", bean); 134        mav.addObject("page", page); 135 136        afterPreCreate(mav, bean, request); 137 138        mav.setViewName(getBasePagePath() + "create"); 139 140        return mav; 141    } 142 143    protected void beforePreCreate(ModelAndView model, T bean, HttpServletRequest request) { 144    }; 145 146    protected void afterPreCreate(ModelAndView model, T bean, HttpServletRequest request) { 147    }; 148 149    /** 150     * 定向到新增实体的表单界面<br/> 151     * 回调函数:onCreate(...) 152     * 153     * @param request 154     * @param response 155     * @return 156     * @throws Exception 157     */ 158    @RequestMapping(value = "create", method = RequestMethod.POST) 159    public ModelAndView create(int page, T bean, HttpServletRequest request, RedirectAttributes redirectAttributes) 160            throws Exception { 161 162        beforeCreate(request); 163 164        getEntityService().save(bean); 165         166        afterCreate(redirectAttributes); 167         168        ModelAndView mav = new ModelAndView("redirect:edit/" + bean.getId() + "/" + page + "/"); 169        redirectAttributes.addFlashAttribute("msg", "添加成功!"); 170 171        // 重定向到Edit 172        return mav; 173    } 174 175    protected void beforeCreate(HttpServletRequest request) { 176    }; 177 178    protected void afterCreate(RedirectAttributes redirectAttributes) { 179    }; 180 181    /** 182     * 表单编辑界面 183     */ 184    @RequestMapping(value = "edit/{id}/{page}", method = RequestMethod.GET) 185    public ModelAndView edit(@PathVariable("id") String id, @PathVariable("page") int page, HttpServletRequest request) 186            throws Exception { 187 188        ModelAndView mav = new ModelAndView(); 189        T bean = getEntityService().get(id); 190        beforeEdit(mav, bean, request); 191 192        mav.addObject("bean", bean); 193        mav.addObject("id", id); 194        mav.addObject("page", page); 195 196        afterEdit(mav, bean, request); 197 198        mav.setViewName(getBasePagePath() + "edit"); 199 200        return mav; 201    } 202 203    protected void beforeEdit(ModelAndView model, T bean, HttpServletRequest request) { 204    }; 205 206    protected void afterEdit(ModelAndView model, T bean, HttpServletRequest request) { 207    }; 208 209    @RequestMapping(value = "save", method = RequestMethod.POST) 210    public ModelAndView save(@RequestParam String id, @RequestParam int page, HttpServletRequest request, 211            @ModelAttribute("bean") T bean, RedirectAttributes redirectAttributes) throws Exception { 212        ModelAndView mav = new ModelAndView(); 213        try { 214 215            BindException errors = bindRequestEntity(request, bean); 216 217            beforeSave(mav, bean, request); 218 219            if (errors.hasErrors()) { 220                logger.error(errors.getMessage()); 221                redirectAttributes.addFlashAttribute("msg", getMessageFromErrors(errors)); 222                mav.addObject("msg", "11"); 223                mav.setViewName("redirect:" + "edit/" + id + "/" + page + "/"); 224                return mav; 225            } 226 227            getEntityService().save(bean); 228 229        } catch (Exception e) { 230            e.printStackTrace(); 231        } 232 233        mav.addObject("bean", bean); 234        mav.addObject("id", id); 235        mav.addObject("page", page); 236        mav.addObject("msg", "保存成功"); 237 238        afterSave(mav, bean, request); 239 240        mav.setViewName(getBasePagePath() + "edit"); 241 242        return mav; 243    } 244 245    protected void beforeSave(ModelAndView model, T bean, HttpServletRequest request) { 246    }; 247 248    protected void afterSave(ModelAndView model, T bean, HttpServletRequest request) { 249    }; 250 251    /** 252     * 所有RequestMapping方法调用前的Model准备方法, 实现Struts2 253     * Preparable二次部分绑定的效果,先根据form的id从数据库查出User对象,再把Form提交的内容绑定到该对象上。 254     * 因为仅update()方法的form中有id属性,因此仅在update时实际执行. 255     */ 256    @ModelAttribute 257    public void getEntity(@RequestParam(value = "id", defaultValue = "") String id, Model model) { 258        if (!"".equals(id)) { 259            model.addAttribute("bean", getEntityService().get(id)); 260        } 261    } 262 263    /** 264     * 从Request中绑定对象并进行校验. 265     */ 266    protected BindException bindRequestEntity(HttpServletRequest request, T bean) throws Exception { 267        ServletRequestDataBinder binder = new ServletRequestDataBinder(bean); 268        initBinder(binder); 269        binder.bind(request); 270        BindException errors = new BindException(binder.getBindingResult()); 271 272        // validator.validate(entity, errors); 273        return errors; 274    } 275 276    /** 277     * 保存实体(save.do)回调函数,在执行实体与Request参数绑定之前调用用。 278     * 注意:由于entity可能是托管对象,对entity所做的修改都将反映到数据库。 所以有必要在此方法中进行前期的数据校验,以免发生意外。 279     * 280     * @param request 281     * @param entity 282     * @param mav 283     * @return 是否通过校验 284     */ 285    protected boolean beforeBindRequestEntity(HttpServletRequest request, T entity) { 286        return false; 287    }; 288 289    @RequestMapping(value = "delete/{id}/{page}",method = RequestMethod.GET) 290    public String delete(@PathVariable("id") String id, @PathVariable("page") int page, RedirectAttributes ra, 291            HttpServletRequest request) throws Exception { 292 293        T bean = getEntityService().get(id); 294        beforeDelete(request, bean, ra); 295 296        if (StringUtils.isBlank(getDeleteMode()) || "logic".equals(getDeleteMode())) { 297            // 物理删除 298            getEntityService().delete(bean); 299        } else { 300            // 逻辑删除 301            bean.setEnabled(false); 302            getEntityService().update(bean); 303        } 304 305        ra.addAttribute("page", page); 306        ra.addFlashAttribute("msg", "删除成功"); 307 308        afterDelete(request, bean, ra); 309         310        //截取uri动态拼接返回list路径 311        //示例:uri:uri:/gbhk-web/admin/property/delete/8a8a89be5114b516015114bea7c30002/1/ 312        //      返回字符串:/admin/property/list 313        String uri = request.getRequestURI(); 314        String[] array = uri.split("/"); 315        String retStr=""; 316        for(int i=2;i<array.length-3;i++){ 317             retStr+="/"+array[i]; 318        } 319        return "redirect:"+retStr+"/list"; 320    } 321 322    /** 323     * 批量删除实体<br/> 324     * 回调函数:beforeDoRemove(...), afterDoRemove(...) 325     * 326     * @param request 327     * @param response 328     * @return 329     * @throws Exception 330     */ 331    @RequestMapping(value = "delete", method = RequestMethod.POST) 332    public ModelAndView deleteBatch(@RequestParam("ids") String ids, @RequestParam("page") int page, 333            RedirectAttributes ra, HttpServletRequest request) throws Exception { 334 335        beforeDelete(request, null, ra); 336 337        if (StringUtils.isBlank(ids)) { 338            ra.addFlashAttribute("msg", "请选择要删除的信息!"); 339        } else { 340            String[] id_s = StringUtils.split(ids, ","); 341            if (StringUtils.isBlank(getDeleteMode()) || "logic".equals(getDeleteMode())) { 342                // 物理删除 343                for (String id : id_s) { 344                    getEntityService().deleteById(id.trim()); 345                } 346            } else { 347                // 逻辑删除 348                for (String id : id_s) { 349                    T bean = getEntityService().get(id.trim()); 350                    bean.setEnabled(false); 351                    getEntityService().update(bean); 352                } 353            } 354 355            ra.addFlashAttribute("msg", "删除成功"); 356        } 357 358        ra.addAttribute("page", page); 359 360        afterDelete(request, null, ra); 361 362        return new ModelAndView(getBasePagePath() + "list"); 363    } 364 365    protected void beforeDelete(HttpServletRequest request, T entity, RedirectAttributes ra) { 366    }; 367 368    protected void afterDelete(HttpServletRequest request, T entity, RedirectAttributes ra) { 369    }; 370 371    /** 372     * 查询实体信息<br/> 373     * 回调函数:onShow(...) 374     * 375     * @param request 376     * @param response 377     * @return 378     * @throws Exception 379     */ 380    @RequestMapping(value = "view/{id}/{page}", method = RequestMethod.GET) 381    public ModelAndView view(@PathVariable("id") String id, @PathVariable("page") int page, HttpServletRequest request) 382            throws Exception { 383        ModelAndView mav = new ModelAndView(); 384 385        T bean = getEntityService().get(id); 386        beforeView(mav, bean, request); 387 388        mav.addObject("bean", bean); 389        mav.addObject("id", id); 390        mav.addObject("page", page); 391 392        afterView(mav, bean, request); 393 394        mav.setViewName(getBasePagePath() + "view"); 395 396        return mav; 397    } 398 399    protected void beforeView(ModelAndView model, T bean, HttpServletRequest request) { 400    }; 401 402    protected void afterView(ModelAndView model, T bean, HttpServletRequest request) { 403    }; 404 405    private String getMessageFromErrors(BindException errors) { 406        StringBuilder sb = new StringBuilder(); 407        sb.append("错误信息:"); 408        List<ObjectError> list = errors.getAllErrors(); 409        for (ObjectError error : list) { 410            sb.append(error.getDefaultMessage()).append(";"); 411        } 412        return sb.toString(); 413    } 414 415     416}

 

1@Controller 2@RequestMapping(value = "/admin/user") 3public class UserController extends AbstractController<User>{ 4     5    @Autowired 6    private UserManager userManager; 7 8    @Override 9    protected Manager<User, String> getEntityService() { 10        return userManager; 11    } 12 13    @Override 14    protected String getBasePagePath() { 15        return "ugr/user/"; 16    } 17 18    @Override 19    protected String getDeleteMode() { 20        return null; 21    } 22 23     24}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )