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

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脚本。

源码下载

本阶段详细源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,180评论 1 23
  • 第一次到海上,第二天记录。 上海之行,不虚此行!
    易查理阅读 185评论 0 0
  • 太多大号热捧网剧《河神》,小编看了也觉得眼前一亮,真真和那些无脑雷剧不一样。 可惜吃了太多影视剧虎头蛇尾的亏,看了...
    爱砸咋地阅读 379评论 0 1
  • 参加工作后的第一个十一假期,值了两天班后才出来玩耍。早在小长假之前就一直在规划此次蜀南之行,时间是4号——8号,路...
    年轻的比尔阅读 664评论 4 4