Java
spring
spring-mvc
jdbctemplate

春の目覚め作戦 SpringMVC その1

SpringMVC(5)をいじってみる

いつまでもStruts1系じゃいられない:sweat_smile:

まずは何か作りますかね

超絶シンプルなTodoアプリを作りました:joy:

1.初期画面
初期画面.png
2.登録前
登録前.png
3.登録後
登録後.png
4.完了後
完了.png
5.検索前
検索前.png
6.検索後
検索後.png
7.一覧風景
全景.png

「完了」ボタン押下すると取り消し線が出てきます。「復活」ボタン押下すると取り消し先が消えます。

説明するまでもないでしょうが、コントローラはこんな感じですわ。
「登録」「検索」「完了」「復活」すべてリダイレクトしてます。そしてその度にテーブルからデータを全部だしてきてリストにして画面に渡すという潔よい作りです:relaxed:

   @RequestMapping(value = "/newItem", params="newItem",method = RequestMethod.POST)
    @Transactional("transactionManagerName")
    public String newItem(@Validated TodoForm form, BindingResult result, Model model)
    {
        DefaultTransactionDefinition dtDef = new DefaultTransactionDefinition();
        TransactionStatus tSts = txMgr.getTransaction(dtDef);

        try
        {
             jdbcTemplate.update("INSERT INTO todo (content,done) VALUES (?, ?)", form.getContent(),false);
             txMgr.commit(tSts);
        }
        catch(Exception ex)
        {
            txMgr.rollback(tSts);
            logger.debug("update失敗",ex.toString());
        }

        return "redirect:/";
    }

    @RequestMapping(value = "/newItem", params="searchItem",method = RequestMethod.POST)
    @Transactional("transactionManagerName")
    public String searchItem(@Validated TodoForm form, BindingResult result, Model model)
    {
        String likeSQL = "select * from todo where content like '%" + form.getContent() + "%'";

        //テーブルtodoから全データを取得する
        List<Map<String, Object>> ret = jdbcTemplate.queryForList(likeSQL);
        //画面にわたすデータのリストを生成する
        List<TodoItem> mList = new ArrayList<TodoItem>();
        for(int i=0;i<ret.size();i++)
        {
            TodoItem tmp = new TodoItem();
            tmp.setId(ret.get(i).get("id").toString());
            tmp.setContent(ret.get(i).get("content").toString());
            if(ret.get(i).get("done").toString().equals("false"))
            {
                tmp.setDone(false);
            }
            else
            {
                tmp.setDone(true);
            }
            mList.add(tmp);
        }
        //画面にわたすリストをModelに設定する
        model.addAttribute("mList", mList );

        return "todo/todo";
    }

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(Locale locale, Model model)
    {
        //テーブルtodoから全データを取得する
        List<Map<String, Object>> ret = jdbcTemplate.queryForList("select * from todo");
        //画面にわたすデータのリストを生成する
        List<TodoItem> mList = new ArrayList<TodoItem>();
        for(int i=0;i<ret.size();i++)
        {
            TodoItem tmp = new TodoItem();
            tmp.setId(ret.get(i).get("id").toString());
            tmp.setContent(ret.get(i).get("content").toString());
            if(ret.get(i).get("done").toString().equals("false"))
            {
                tmp.setDone(false);
            }
            else
            {
                tmp.setDone(true);
            }
            mList.add(tmp);
        }
        //画面にわたすリストをModelに設定する
        model.addAttribute("mList", mList );

        return "todo/todo";
    }

    @RequestMapping(value = "/restore", method = RequestMethod.POST)
    @Transactional("transactionManagerName")
    public String restore(@Validated TodoForm form, BindingResult result, Model model)
    {
        DefaultTransactionDefinition dtDef = new DefaultTransactionDefinition();
        TransactionStatus tSts = txMgr.getTransaction(dtDef);

        List<Map<String, Object>> ret = jdbcTemplate.queryForList("select * from todo WHERE id=?",new Object[]{form.getId()});
        if(ret.size()>0)
        {
            TodoItem upItem = new TodoItem();
            upItem.setId(form.getId());
            upItem.setContent(form.getContent());
            upItem.setDone(form.getDone());

            SqlParameterSource param = new BeanPropertySqlParameterSource(upItem);

            try
            {
                 jdbcTemplate.update("UPDATE todo SET done = ? WHERE id = ?",false,form.getId());
                 txMgr.commit(tSts);
            }
            catch(Exception ex)
            {
                txMgr.rollback(tSts);
                logger.debug("update失敗",ex.toString());
            }
        }
        else
        {
            logger.debug("update対象なし");
        }

        return "redirect:/";
    }

    @RequestMapping(value = "/done", method = RequestMethod.POST)
    @Transactional("transactionManagerName")
    public String done(@Validated TodoForm form, BindingResult result, Model model)
    {

        DefaultTransactionDefinition dtDef = new DefaultTransactionDefinition();
        TransactionStatus tSts = txMgr.getTransaction(dtDef);

        List<Map<String, Object>> ret = jdbcTemplate.queryForList("select * from todo WHERE id=?",new Object[]{form.getId()});
        if(ret.size()>0)
        {
            TodoItem upItem = new TodoItem();
            upItem.setId(form.getId());
            upItem.setContent(form.getContent());
            upItem.setDone(form.getDone());

            SqlParameterSource param = new BeanPropertySqlParameterSource(upItem);

            try
            {
                 jdbcTemplate.update("UPDATE todo SET done = ? WHERE id = ?",true,form.getId());
                 txMgr.commit(tSts);
            }
            catch(Exception ex)
            {
                txMgr.rollback(tSts);
                logger.debug("update失敗",ex.toString());
            }
        }
        else
        {
            logger.debug("update対象なし");
        }

        return "redirect:/";
    }

MySQLを使ってます。テーブルはこんな感じですわ。
sql
CREATE TABLE `todo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`content` varchar(50) DEFAULT NULL,
`done` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8

薄っぺらいソースはこちらでございまーす:hugging:
https://github.com/pugachev/todomvc.git

この土日はお天気悪かった:umbrella2:し寒かった:snowflake:んで、手遊びで作ってみました。
他の方のも参考にさせて頂きました。ありがとうございました。