spring4の検索画面の作り方

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,852

gik

score 146

spring4+MyBatisで検索画面を作っているのですが、うまくいきません。
エラーがでます。
教えてください。
os winodws10、java1.8、tomcat8.0、spring4

package jp.co.kenshu.controller;

import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import jp.co.kenshu.dto.test.TestDto;
import jp.co.kenshu.form.SearchForm;
import jp.co.kenshu.form.TestForm;
import jp.co.kenshu.service.TestService;

@Controller
public class TestController {

    @Autowired
    private TestService testService;


    @RequestMapping(value = "/test/{id}", method = RequestMethod.GET)
    public String test(Model model, @PathVariable int id) {
        TestDto test = testService.getTest(id);
        model.addAttribute("message", "MyBatisのサンプルです");
        model.addAttribute("test", test);
        return "test";
    }

    @RequestMapping(value = "/test/", method = RequestMethod.GET)
    public String testAll(Model model) {
        List<TestDto> tests = testService.getTestAll();
        model.addAttribute("message", "MyBatisの全件取得サンプルです");
        model.addAttribute("tests", tests);
        return "test";
    }
    @RequestMapping(value = "/test/insert/input/", method = RequestMethod.GET)
    public String testInsert(Model model) {
        TestForm form = new TestForm();
        model.addAttribute("testForm", form);
        model.addAttribute("message", "MyBatisのinsertサンプルです。");
        return "testInsert";
    }

    @RequestMapping(value = "/test/insert/input/", method = RequestMethod.POST)
    public String testInsert(@ModelAttribute TestForm form, Model model) {
        int count= testService.insertTest(form.getName());
        return "redirect:/test/";
    }
    @RequestMapping(value = "/test/delete/input/", method = RequestMethod.GET)
    public String testDelete(Model model) {
        TestForm form = new TestForm();
        model.addAttribute("testForm", form);
        model.addAttribute("message", "MyBatisのdeleteサンプルです。");
        return "testDelete";
    }

    @RequestMapping(value = "/test/delete/input/", method = RequestMethod.POST)
    public String testDelete(@ModelAttribute TestForm form, Model model) {
        int count = testService.deleteTest(form.getId());
        return "redirect:/test/";
    }
    @RequestMapping(value = "/test/update/input/{id}/", method = RequestMethod.GET)
    public String testUpdate(Model model, @PathVariable int id) {
        TestDto test = testService.getTest(id);
        model.addAttribute("message", "MyBatisのUpdateサンプルです");
        model.addAttribute("test", test);
        TestForm form = new TestForm();
        form.setId(test.getId());
        form.setName(test.getName());
        model.addAttribute("testForm", form);
        return "testUpdate";
    }

    @RequestMapping(value = "/test/update/input/{id}/", method = RequestMethod.POST)
    public String testUpdate(Model model, @ModelAttribute TestForm form) {
        TestDto dto = new TestDto();
        BeanUtils.copyProperties(form, dto);
        int count = testService.updateTest(dto);
        return "redirect:/test/";
    }

    @RequestMapping(value = "/test/search/", method = RequestMethod.GET)
    public String TestSearch(Model model) {
        SearchForm form = new SearchForm();
        model.addAttribute("SearchForm", form);
        model.addAttribute("message", "MyBatisサンプルです。");
        return "TestSearch1";
    }

    @RequestMapping(value = "/test/search/{name}", method = RequestMethod.GET)
    public String TestSearch1(@ModelAttribute SearchForm form, Model model) {
        TestDto test= testService.SearchTest1(form.getName());
        model.addAttribute("test",test);
        return "redirect:/test/search";
    }


}
package jp.co.kenshu.service;

import java.util.LinkedList;
import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import jp.co.kenshu.dto.test.TestDto;
import jp.co.kenshu.entity.Test;
import jp.co.kenshu.mapper.TestMapper;

@Service
public class TestService {

    @Autowired
    private TestMapper testMapper;

    public TestDto getTest(Integer id) {
        TestDto dto = new TestDto();
        Test entity = testMapper.getTest(id);
        BeanUtils.copyProperties(entity, dto);
        return dto;
    }
    public List<TestDto> getTestAll() {
        List<Test> testList = testMapper.getTestAll();
        List<TestDto> resultList = convertToDto(testList);
        return resultList;
    }

    private List<TestDto> convertToDto(List<Test> testList) {
        List<TestDto> resultList = new LinkedList<>();
        for (Test entity : testList) {
            TestDto dto = new TestDto();
            BeanUtils.copyProperties(entity, dto);
            resultList.add(dto);
        }
        return resultList;
    }
    public int insertTest(String name) {
        int count = testMapper.insertTest(name);
        return count;
    }
    public int deleteTest(int id) {
        int count = testMapper.deleteTest(id);
        return count;
    }

    public int updateTest(TestDto dto) {
        int count = testMapper.updateTest(dto);
        return count;
    }

    public TestDto SearchTest1(String name) {
        TestDto dto = new TestDto();
        Test entity = testMapper.SearchTest1(name);
        BeanUtils.copyProperties(entity, dto);
        return dto;
    }

}

イメージ説明

イメージ説明

TestSearch1.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<html>
<head>
<meta charset="utf-8">
<title>Welcome</title>
</head>
<body>
   <form:form action="${pageContext.request.contextPath}/test/serach/"
        method="get" modelAttribute="SearchForm">
       <form:label path="name">名前:</form:label><form:input path="name" size="40" /><br>
        <input type="submit" value="Search"/>
    </form:form>
    <hr/>
    <table>
        <tr>
            <th>Id</th>
            <th>Name</th>
        </tr>
            <tr>
                <td>${test.id}</td>
                <td>${test.name}</td>
            </tr>
    </table>
</body>
</html>
mvc-config.xml
   <context:component-scan base-package="jp.co.kenshu" />
    <mvc:annotation-driven />
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
       <property name="basename" value="classpath:ValidatorMessages" />
    </bean>
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' -->
        <property name="prefix" value="/WEB-INF/view/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <!-- DataSource -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost/test" />
        <property name="username" value="" />
        <property name="password" value="" />
    </bean>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="jp.co.kenshu.mapper" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
HTTPステータス 400 - 

説明 The request sent by the client was syntactically incorrect.


イメージ説明
イメージ説明
イメージ説明
イメージ説明

いろいろ考えたり、アドバイスをもらっていろいろ今回直しました。
まだエラーがでて動きません。動くようにしたいです。わかる方教えてください。
この部分のせてとかあれば載せます。
後どなたかこのソースコードでうごくか確認してもらえないでしょうか?
リンク内容
を参考にしました
controller、DTO、Entity、Mapperあっていますでしょうか?
後name検索をspring4とMyBatis3でやっているサイトとかあれば教えてください。
参考にします。
よろしくお願いします。
後jspはうごくようになりました。
名前を入力すると400エラーになります。
イメージ説明
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2016/10/21 21:49

    ORMのネストの設定が間違えてるように見えますが。 多分上がってないファイルでしょうね。 何が上がってないかはわかりませんのであしからず

    キャンセル

  • gik

    2016/10/21 23:09

    すいません。何の情報を追記すればよいでしょうか?

    キャンセル

回答 3

check解決した方法

0

もう少し勉強してからチャレンジします。
たくさんのアドバイスありがとうございました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こういう時は、まず、例外のメッセージをgoogleで検索することをお勧めします。

It's likely that neither a Result Type nor a Result Map was specified.
上記で検索してHITしたサイトの抜粋では、
>解決方法:
>XMLドキュメントでresultTypeを明示していない場合に発生する問題である。 
>一般的なDMLは構わないが、SELECTの場合には、必ず明示しなければならない。

提示されているXMLを確認してみるに、

<select id="SearchTest1" parameterType="String">
と、なっています。
つまり、このselect結果を代入すべきresultがないようです。

MyBatisのresultTypeなり、resultMapを指定してみてください。

<select id="SearchTest1" parameterType="String" resultMap="TestResult">
とすべきではないでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/26 18:06 編集

    クライアントのブラウザからPOSTなりGETなりで要求したURLが
    該当するRequestMappingアノテーションで分離したとき、
    正しく分解できない形なのです。
    このヒントをありがとうございます。
    このようにかえてみました。
    ですが、まだ動きません。
    @RequestMapping(value = "/test/search/", method = RequestMethod.GET)
    public String TestSearch(Model model) {
    SearchForm form = new SearchForm();
    model.addAttribute("SearchForm", form);
    model.addAttribute("message", "MyBatisサンプルです。");
    return "TestSearch1";
    }

    @RequestMapping(value = "/test/search/{name}", method = RequestMethod.GET)
    public String TestSearch1(@ModelAttribute SearchForm form, Model model) {
    TestDto test= testService.SearchTest1(form.getName());
    model.addAttribute("test",test);
    return "redirect:/test/search";
    }
    後methodの部分をgetにしました。(POSTも試しましたが400エラーでした)
    しかし、うごかない。
    間違っているから動ないのでしょうが、どこが間違っているのでしょうか。
    もうすいません。教えてください

    キャンセル

  • 2016/10/26 19:08

    なぜ、サーバばかり直すのですか。要求しているURLが正しいのですか。
    いい加減頭が痛くなりました。
    スクリーンショットから応答したページのURLは、
    http://localhost:8080/SpribgKenshu/test/search/
    で、エラーページ上部の、要求したURLは
    http://localhost:8080/SpribgKenshu/test/search/?name=gaku

    どこの世界にスラッシュの後に?が続くURLがあるのですか。
    試行錯誤しておかしなことをやる前にきちんとした知識をつけなさい。

    もうこれ以上はお答えしません。

    キャンセル

  • 2016/10/26 19:51 編集

    すいません。
    ありがとうございました。

    キャンセル

0

MybatisのMapper定義にて、resultTypeが設定されていないときのエラーでしょうか。

例えば、以下のように設定します。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="seren.sample.mapper.TodoMapper">
  <select id="search" resultType="seren.sample.dto.Todo">
select
  id, task
from
  todo
  </select>
</mapper>

SQLが発行できない問題はこれで解決するでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/23 12:26

    mapper定義が重複しているのではないでしょうか。

    キャンセル

  • 2016/10/23 18:50 編集

    mapper定義が重複しているとはどういう意味でしょう?
    調べてみたんですが、わかりませんでした。
    どこを調べたらよいでしょうか?
    すいません。今回すべてのせてみました。
    写真とかみにくいとは思いますが、ぜひ教えてください。
    お願いします

    キャンセル

  • 2016/10/28 00:13

    まずControllerクラスでの@RequestMappingsとブラウザからリクエストしているURLの関係ですが、@RequestMappingsで指定するURLの最後に / がついているものと、/がないものが混在しています。 最後の/は不要だと思いますので修正しましょう。

    そうした上で、searchボタンを押した際にリクエストされるURLを再確認し、修正しましょう。
    具体的には、@RequestMapping(value = "/test/search/{name}", method = RequestMethod.GET) に対応するURLが、searchボタンで実行されているかを確認しましょう。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる