美文网首页
从零搭建项目开发框架-11编写Controller

从零搭建项目开发框架-11编写Controller

作者: 孔垂云 | 来源:发表于2017-07-04 23:20 被阅读0次

    Controller层的作用就是获取从页面传过来的值,调用service层进行业务处理,并把结果返回给页面。

    controller可以可以处理业务逻辑呢?当然可以,代码想怎么写就怎么写。不过这是不建议的,逻辑处理还是要放在service层。更不允许直接调用dao操作数据库。

    基础的controller包括以下方法:
    1、进入页面
    2、点击新增
    3、执行新增
    4、点击修改
    5、执行修改
    6、执行删除

    这样就把一个简单的页面的功能都做出来了,剩下的就是完善丰富。
    这里先介绍用户管理的例子,里面包含了分页、查询条件等功能,很具有代表性

    SysUserController.java

    @RequestMapping("/sys/user")
    @Controller
    public class SysUserController {
        @Autowired
        private SysUserService sysUserService;
        @Autowired
        private SysUserLoginService sysUserLoginService;
        @Autowired
        private SysRoleService sysRoleService;
        @Autowired
        private PubConfig pubConfig;
    
        /**
         * 进入用户管理界面
         *
         * @return
         */
        @RequestMapping("/index")
        public ModelAndView index(HttpServletRequest request, HttpServletResponse response, SysUserSearchVO sysUserSearchVO) {
            ModelAndView mv = new ModelAndView();
            int recordCount = sysUserService.count(sysUserSearchVO);// 获取查询总数
            String url = createUrl(sysUserSearchVO);
            PageNavigate pageNavigate = new PageNavigate(url, sysUserSearchVO.getPageIndex(), recordCount);//定义分页对象
            List<SysUser> list = sysUserService.list(sysUserSearchVO);
            mv.addObject("pageNavigate", pageNavigate);// 设置分页的变量
            mv.addObject("list", list);// 把获取的记录放到mv里面
            mv.addObject("listRole", sysRoleService.list());// 角色列表
            mv.setViewName("/plat/sys/user/index");// 跳转至指定页面
            BackUrlUtil.createBackUrl(mv, request, url);// 设置返回url
            return mv;
        }
    
        // 设置分页url,一般有查询条件的才会用到
        private String createUrl(SysUserSearchVO sysUserSearchVO) {
            String url = pubConfig.getDynamicServer() + "/sys/user/index.htm?";
            if (StringUtil.isNotNullOrEmpty(sysUserSearchVO.getUsername()))
                url += "&username=" + sysUserSearchVO.getUsername();
            if (StringUtil.isNotNullOrEmpty(sysUserSearchVO.getRealname()))//如果为模糊查询,要把该字段encode
                url += "&realname=" + sysUserSearchVO.getRealname();
            if (sysUserSearchVO.getStatus() != null)
                url += "&status=" + sysUserSearchVO.getStatus();
            if (sysUserSearchVO.getRoleId() != null)
                url += "&roleId=" + sysUserSearchVO.getRoleId();
            return url;
        }
    
        /**
         * 进入添加用户界面
         *
         * @param request
         * @param response
         * @param
         * @retursysUsern
         */
        @RequestMapping("/toAdd")
        public ModelAndView toAdd(HttpServletRequest request, HttpServletResponse response) {
            ModelAndView mv = new ModelAndView();
            mv.addObject("listRole", sysRoleService.list());// 角色列表
            SysUser sysUser = new SysUser();
            mv.addObject("sysUser", sysUser);
            mv.setViewName("/plat/sys/user/add");
            BackUrlUtil.setBackUrl(mv, request);// 设置返回的url
            return mv;
        }
    
        /**
         * 进入修改用户界面
         *
         * @param request
         * @param response
         * @param
         * @return
         */
        @RequestMapping("/toUpdate")
        public ModelAndView toUpdate(HttpServletRequest request, HttpServletResponse response, int id) {
            ModelAndView mv = new ModelAndView();
            SysUser sysUser = sysUserService.get(id);
            mv.addObject("sysUser", sysUser);
            mv.addObject("listRole", sysRoleService.list());// 角色列表
            mv.setViewName("/plat/sys/user/update");
            BackUrlUtil.setBackUrl(mv, request);// 设置返回的url
            return mv;
        }
    
        /**
         * 新增用户
         *
         * @param request
         * @param response
         * @param sysUser
         * @return
         */
        @RequestMapping("/add")
        public String add(HttpServletRequest request, HttpServletResponse response, SysUser sysUser) {
            sysUser.setStatus(1);
            int flag = sysUserService.add(sysUser);
            if (flag == 0)
                return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户信息新增失败");
            else if (flag == 2)
                return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户账号已存在");
            else
                return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户信息新增成功");
        }
    
        /**
         * 修改用户
         *
         * @param request
         * @param response
         * @param sysUser
         * @return
         */
        @RequestMapping("/update")
        public String update(HttpServletRequest request, HttpServletResponse response, SysUser sysUser) {
            int flag = sysUserService.update(sysUser);
            if (flag == 0)
                return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户信息修改失败");
            else
                return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户信息修改成功");
        }
    
        /**
         * 删除用户
         *
         * @param request
         * @param response
         * @param id
         * @return
         */
        @RequestMapping("/delete")
        public String delete(HttpServletRequest request, HttpServletResponse response, int id) {
            int flag = sysUserService.delete(id);
            if (flag == 0)
                return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户删除失败");
            else
                return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户删除成功");
        }
    
        /**
         * 重置密码
         *
         * @param request
         * @param response
         */
        @RequestMapping("/saveResetPass")
        public String saveResetPass(HttpServletRequest request, HttpServletResponse response, int id) {
            int flag = sysUserService.saveResetPass(id);
            if (flag == 0)
                return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户重置密码失败");
            else
                return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户重置密码成功,重置后密码变为123456");
        }
    
        /**
         * 用户加锁,状态由1变为0
         *
         * @param request
         * @param response
         * @param id
         */
        @RequestMapping("/saveLock")
        public String saveLock(HttpServletRequest request, HttpServletResponse response, int id) {
            int flag = sysUserService.updateStatus(id, 2);
            if (flag == 0)
                return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户锁定失败");
            else
                return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户锁定成功");
        }
    
        /**
         * 用户解锁,状态由2变为1
         *
         * @param request
         * @param response
         * @param id
         */
        @RequestMapping("/saveUnlock")
        public String saveUnlock(HttpServletRequest request, HttpServletResponse response, int id) {
            int flag = sysUserService.updateStatus(id, 1);
            if (flag == 0)
                return "forward:/error.htm?msg=" + StringUtil.encodeUrl("用户解锁失败");
            else
                return "forward:/success.htm?msg=" + StringUtil.encodeUrl("用户解锁成功");
        }
    
    
        /**
         * 验证用户代码是否存在
         *
         * @param request
         * @param response
         */
        @RequestMapping("/checkUserExist")
        public void checkUserExist(HttpServletRequest request, HttpServletResponse response, String username) {
            SysUser sysUser = sysUserService.getByUsername(username);
            if (sysUser == null)
                WebUtil.out(response, "true");
            else
                WebUtil.out(response, "false");
        }
    }
    

    代码比较长,这里面主要说几个重要的地方

    PubConfig.java 全局公共变量

    学过Spring的都知道依赖注入DI的概念,但是怎么样注入一个类呢,即在配置文件里面定义了参数,在java代码里面怎么来调用呢?
    首先在配置文件定义参数
    这里在application.properties里面加了六个参数

    #config environment params
    versionNo=1.1
    imageServer=http://localhost:8080
    imageUploadPath=D:\\upload
    staticServer=http://localhost:8080
    dynamicServer=http://localhost:8080
    webTitle=Basic Development PlatForm
    

    1、版本号,用于定义js和css的版本
    2、图片服务器地址
    3、图片上传路径
    4、静态服务器地址
    5、动态服务器地址
    6、系统标题

    这里先说一下图片服务地址和上传路径。一般分布式系统都有专门的文件上传服务,即当前的系统上传都调用专门的服务,上传至指定的文件存储路径,返回一个上传后生成的文件路径。这里图片上传路径可以随意指定,比如D:\upload,不要和web工程放到一起。图片服务器可以采用apache或nginx定义,指向上传路径,端口任意,相当于静态文件地址。

    静态服务器地址指静态资源存储的地址,和图片服务器一样,单独剥离出来。
    动态服务器地址毫无疑问指当前web应用的访问地址,也可以用域名来代替。

    在系统开发中这三个地址可以是一个,部署时分离开即可。

    applicationContext.xml中增加如下配置:

    <!--设置公共参数 -->
        <bean id="pubConfig" class="com.critc.plat.core.pub.PubConfig">
            <property name="imageServer" value="${imageServer}"/>
            <property name="imageUploadPath" value="${imageUploadPath}"/>
            <property name="staticServer" value="${staticServer}"/>
            <property name="dynamicServer" value="${dynamicServer}"/>
        </bean>
    

    PubConfig.java中如下设置:

    /**
     * 全局参数配置,用于在后端获取参数
     *
     * @author 孔垂云
     * @date 2017-06-13
     */
    @Component
    public class PubConfig {
        private String imageServer;//图片服务器地址
        private String imageUploadPath;//图片路径
        private String staticServer;//静态地址
        private String dynamicServer;//动态地址
    // set get省略
    }
    

    通过@Component即把该类注入,在controller、service中就可以直接用了。

    backUrl 返回页面url

    页面返回值的应用场景是这样的:我按照用户名查询,查到数据后,点击修改,跳转至修改界面,点击修改,然后再调回我查询结果界面。很多系统遇到这种情况直接不处理,直接返回用户管理首页,这样用户体验是非常不好的,比如我一次查询到20条记录,每次修改都要重新查一次。
    如果在easyUI或Ext页面中,这种情况是不存在的,原因就在于那两种是业务无刷新的,当前设计的框架是需要页面跳转的,所以跳转时就需要把当前页面的地址带过去,处理完再返回当前页面,所以就需要处理返回页面url

    原理就是在点击修改或新增按钮时,把当前页面的url直接传过去,修改或新增页面增加一个隐藏域hidden,来保存这个返回的url,点击修改或保存后,再直接返回这个页面。

    PageNavigate分页实现

    系统实现分页的方式太多太多了,比如页面直接拼写分页脚本,利用js来生成分页代码,在服务端利用标签直接生成分页代码等等,不一而足。而且分页的方式也多种多样,显示上一页、下一页,显示数字分页等等。
    本框架定义了PageNavigate这个类来处理分页,把页面跳转url、当前页数、记录总数传进去就可以生成分页的html脚本。

    源码下载

    本阶段详细源码

    相关文章

      网友评论

          本文标题:从零搭建项目开发框架-11编写Controller

          本文链接:https://www.haomeiwen.com/subject/inwocxtx.html