Spring MVC 3.

 
 
 
Сообщения:12
Я правильно понимаю, что даже если у меня не используется Hibernate (использую JDBC в связке с spring jdbcTemplate), то Hibernate Validator я всё равно могу использовать, да? :)
 
 
Сообщения:280
Да
 
 
Сообщения:5
У меня возникли одна проблема. Есть одна главная страница и необходимо после отправки данных переадресоваться на нее же! На другие страницы переадресация работает, а на основную нет .
Извиняюсь, что все в xml :oops:
файл dispatcher-servlet.xml
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="index.htm">indexController</prop>
            </props>
        </property>
    </bean>

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />

    <bean name="indexController"
          class="org.springframework.web.servlet.mvc.ParameterizableViewController"
          p:viewName="index" />


Пробовал напрямую в коде обращаться к странице, а не к названию вьюшки, но безрезультатно
ModelAndView mv = new ModelAndView("/WEB-INF/jsp/index.jsp");

Главная страница открывается по адресу
http://localhost:8084/WebApp/index.htm
При нажатии кнопки отправки данных с главной страницы:
HTTP Status 404 - /PhoneSender/index
description The requested resource (/PhoneSender/index) is not available.
 
 
Сообщения:5
Сделал проект по образу и подобию проекта garbuza
У меня проблема с edit. Сервак не находит вьюшки для него. Вот например тыкаю /user/12/edit
INFO: Hibernate: select user0_.id as id0_0_, user0_.birth as birth0_0_, user0_.email as email0_0_, user0_.name as name0_0_ from USERS user0_ where user0_.id=?
SEVERE: PWC6117: File "D:\dt\java\jweb\WebTest\build\web\user\12\WEB-INF\jsp\users.jsp" not found

Подскажите , пожалуйста, в чём может быть проблема?
 
 
Сообщения:3
Всем добрый вечер! Сравнила свой код с приведенным кодом garbuz и не могу понять что у меня не так. при submit операции по редактированию получаю ошибку
2014-08-24 01:08:09,378 DEBUG tener-1(4) uestMappingHandlerMapping: 209 str. - Looking up handler method for path /DB/service/OsnService/updateClient/41
2014-08-24 01:08:09,390 DEBUG tener-1(4) nHandlerExceptionResolver: 132 str. - [b]Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedExcepti on: Request method 'POST' not supported[/b]
2014-08-24 01:08:09,390 DEBUG tener-1(4) seStatusExceptionResolver: 132 str. - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedExcepti on: Request method 'POST' not supported
2014-08-24 01:08:09,391 DEBUG tener-1(4) tHandlerExceptionResolver: 132 str. - Resolving exception from handler [null]: org.springframework.web.HttpRequestMethodNotSupportedExcepti on: Request method 'POST' not supported
2014-08-24 01:08:09,392 WARN tener-1(4) .web.servlet.PageNotFound: 194 str. - [b]Request method 'POST' not supported[/b]
2014-08-24 01:08:09,392 DEBUG tener-1(4) servlet.DispatcherServlet: 999 str. - [b]Null ModelAndView returned to DispatcherServlet with name 'mvc-dispatcher-servlet': assuming HandlerAdapter completed request handling[/b]
2014-08-24 01:08:09,393 DEBUG tener-1(4) servlet.DispatcherServlet: 946 str. - Successfully completed request
2014-08-24 01:08:09,394 DEBUG tener-1(4) xceptionTranslationFilter: 115 str. - Chain processed normally
2014-08-24 01:08:09,394 DEBUG tener-1(4) yContextPersistenceFilter: 97 str. - SecurityContextHolder now cleared, as request processing completed


Сам контроллер ContractsController.class
@Controller
@RequestMapping("/DB/service/OsnService")
public class ContractsController {
    private static final Logger logger = Logger.getLogger(ContractsController.class);

    public static final String DATE_FORMAT = "dd.MM.yyyy";

    @Autowired
    DataServise dataServise;

    @RequestMapping(value="showClients", method = RequestMethod.GET)
    public String showClients(ModelMap contractsModel) {
        List<Client> clientList = dataServise.getAllClients();
        contractsModel.addAttribute("clientList", clientList);

        return "client_contract/show_ekvar_table";
    }

    @RequestMapping(value = "createClientsStart", method = RequestMethod.GET, params = "insertEkvar")
         public String insertClientStart(ModelMap contractsModel) {
        return "client_contract/add_ekvar";
    }

    @RequestMapping(value = "addClient", method = RequestMethod.GET)
    public String addClient(
            @RequestParam(value = "clientName", required = false) String clientName,
            @RequestParam(value = "clientINN", required = false) Long clientINN,
            @RequestParam(value = "clientAccount", required = false) Long clientAccount,
            @RequestParam(value = "clientNumberContract", required = false) String clientNumberContract,
            @RequestParam(value = "clientDataStart", required = false) Date clientDataStart,
            @RequestParam(value = "clientPrice", required = false) BigDecimal clientPrice,
            @RequestParam(value = "clientQuantity", required = false) Integer clientQuantity,
            @RequestParam(value = "clientDataEndRent", required = false) Date clientDataEndRent,
            @RequestParam(value = "clientDataEndPrice", required = false) Date clientDataEndPrice,
            ModelMap contractsModel) {

        dataServise.addClient(clientName, clientINN, clientAccount, clientNumberContract, clientDataStart, clientPrice,
        clientQuantity, clientDataEndRent, clientDataEndPrice);

        return "redirect:showClients";
    }

    @RequestMapping(value = "/deleteClient/{id}", method = RequestMethod.GET)
    public String deleteClient(@PathVariable ("id") Long  id){
        dataServise.deleteClient(id);
        return "client_contract/delete_ekvar";
    }


        @RequestMapping(value = "/clients", method = RequestMethod.GET)
        public ModelAndView get() {
                ModelAndView mav = new ModelAndView("client_contract/update_ekvar");
                mav.addObject("clientList", dataServise.getAllClients());
                mav.addObject("client", new Client());
                return mav;
            }

   @RequestMapping(method = RequestMethod.GET)
    public String addUpdate(@Validated @ModelAttribute("client") Client client, BindingResult result) {
        if (!result.hasErrors()){
            dataServise.updateClient(client);
        }
        return "redirect:/clients";
    }

    @RequestMapping(value = "/updateClient/{id}", method = RequestMethod.GET)
    public String updateClient(@PathVariable Long id, ModelMap contractsModel) {
        Client client = dataServise.getById(id);
        contractsModel.addAttribute("client", client);
        return "client_contract/update_ekvar";
    }

    //Для корректности отображения ввода даты в БД
        @InitBinder
        public void initBinder(WebDataBinder binder) {
            // Это чтобы пустые строки превращались в null
            binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
            // Это чтобы строки, содержащие дату, превращались в java.util.Date
            SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
            binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
        }

    private @Autowired
    ServletContext servletContext;

    @RequestMapping(value = "createClientsStart", method = RequestMethod.GET, params = "writeContrReady")
    public String writeClientStart(ModelMap contractsModel) {
        List<Client> clientList = dataServise.getAllClients();
        contractsModel.addAttribute("clientList", clientList);
        return "client_contract/client_file";
    }

    @RequestMapping(value = "/file", method = RequestMethod.GET)
    public @ResponseBody String myFileClient() throws IOException {
        InputStream inputStream = null;
        try {
            inputStream = servletContext.getResourceAsStream("/WEB-INF/read_write_file/clientFile.txt");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            return bufferedReader.readLine();
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }
}


и мой update_ekvar.jsp
<table>
    <c:forEach items="${clientList}" var="client">
        <tr>
            <td>${client.getId()}</td>
            <td>${client.getName()}</td>
            <td>${client.getINN()}</td>
            <td>${client.getAccount()}</td>
            <td>${client.getNumberContract()}</td>
            <td><fmt:formatDate value="${client.getDataStart()}" pattern="dd.MM.yyyy" /></td>
            <td>${client.getPrice()}</td>
            <td>${client.getQuantity()}</td>
            <td><fmt:formatDate value="${client.getDataEndRent()}" pattern="dd.MM.yyyy"/> </td>
            <td><fmt:formatDate value="${client.getDataEndPrice()}" pattern="dd.MM.yyyy"/> </td>
        </tr>
    </c:forEach>
</table>

<form:form method="post" modelAttribute="client">
    <form:hidden path="id"/>
    <table>
        <tr>
            <td><form:input type="text" path="name"/>наименование</td>
        </tr>
        <tr>
            <td><form:input type="number" path="INN"/>ЭДРПОУ</td>
        </tr>
        <tr>
            <td><form:input type="number" path="account"/>счет</td>
        </tr>
        <tr>
            <td><form:input type="text" path="numberContract"/>номер контракта</td>
        </tr>
        <tr>
            <td><form:input type="date" path="dataStart"/>дата контракта</td>
        </tr>
        <tr>
            <td><form:input type="number" path="price"/>цена ПОС-терминала грн.</td>
        </tr>
        <tr>
            <td><form:input type="number" path="quantity"/>количество ПОС-терминалов шт.</td>
        </tr>
        <tr>
            <td><form:input type="date" path="dataEndRent"/>дата окончание догора оренды</td>
        </tr>
        <tr>
            <td><form:input type="date" path="dataEndPrice"/>дата окончания оплаты</td>
        </tr>
    </table>
<label>
       <input type="submit" value="Сохранить изменения">
</label>
</form:form>


ссылка на контролер для редактирования идет из файла show_ekvar_table.jsp
<form action="${pageContext.request.contextPath}/DB/service/OsnService/createClientsStart">
    <table border="1">
        <tr>
            <%--<th></th>--%>
            <th>номер</th>
            <th>наименование</th>
            <th>ЭДРПОУ</th>
            <th>счет</th>
            <th>номер <br/> контракта </th>
            <th>дата <br/> контракта </th>
            <th>цена <br/> ПОС-терминала <br/> грн.</th>
            <th>количество <br/> ПОС-терминалов <br/> шт.</th>
            <th>дата окончание <br/> догора оренды</th>
            <th>дата окончания <br/> оплаты</th>
            <th></th>
        </tr>

        <c:forEach items="${clientList}" var="client">
                <tr>
                    <td>${client.getId()}</td>
                    <td>${client.getName()}</td>
                    <td>${client.getINN()}</td>
                    <td>${client.getAccount()}</td>
                    <td>${client.getNumberContract()}</td>
                    <td><fmt:formatDate value="${client.getDataStart()}" pattern="dd.MM.yyyy" /></td>
                    <td>${client.getPrice()}</td>
                    <td>${client.getQuantity()}</td>
                    <td><fmt:formatDate value="${client.getDataEndRent()}" pattern="dd.MM.yyyy"/> </td>
                    <td><fmt:formatDate value="${client.getDataEndPrice()}" pattern="dd.MM.yyyy"/> </td>
                    <td>
                        <a href="${pageContext.request.contextPath}/DB/service/OsnService/deleteClient/${client.getId()}">
                            <img src="${pageContext.request.contextPath}/resources/images/dell.jpg" alt=""/>
                        </a>
                        &nbsp;
                        <a href="${pageContext.request.contextPath}/DB/service/OsnService/updateClient/${client.getId()}">
                            <img src="${pageContext.request.contextPath}/resources/images/update.jpg" alt=""/>
                        </a>
                    </td>
      </tr>
  </c:forEach>
    </table>

    <label>
        <input type="submit" id="insertEkvar"  name="insertEkvar" value="Созадть" class="submit" >
    </label>
    <label>
        <input type="submit" id="writeContrReady" name="writeContrReady" value="Действующие контракты" class="submit">
    </label>
    <label>
        <input type="button" id="write" name="write" value="Заканчивающиеся догова аренды" onclick="WriteFileEkvar()">
    </label>
</form >


почему выползает ошибка
HTTP Status 405 - Request method &#39;POST&#39; not supported ни как не пойму, подскажите пож., помогите. Заранее все спасибо!
 
 
Сообщения:2185
У вас 66 строка контроллера описывает обработку GET метода запроса, в то время, как форма отправляется POST запросом.
 
 
Сообщения:3
Проблема в том, что я пыталась сделать так
        @RequestMapping(value = "/clients", method = RequestMethod.GET)
        public ModelAndView get() {
                ModelAndView mav = new ModelAndView("client_contract/update_ekvar");
                mav.addObject("clientList", dataServise.getAllClients());
                mav.addObject("client", new Client());
                return mav;
            }

    @RequestMapping(method = RequestMethod.GET)
    public String addUpdate(@Validated @ModelAttribute("client") Client client, BindingResult result) {
        if (!result.hasErrors()){
            dataServise.updateClient(client);
        }
        return "redirect:/clients";
    }

   @RequestMapping(value = "/updateClient/{id}", method = RequestMethod.POST)
       public String updateClient(@PathVariable Long id, ModelMap contractsModel) {
        Client client = dataServise.getById(id);
        contractsModel.addAttribute("client", client);
        return "client_contract/update_ekvar";
    }

но тогда получаю код ошибки
HTTP Status 405 - Request method &#39;GET&#39; not supported даже не добравшись до формы редактирования

если же исправляю на
@RequestMapping(value = "/clients", method = RequestMethod.GET)
        public ModelAndView get() {
                ModelAndView mav = new ModelAndView("client_contract/update_ekvar");
                mav.addObject("clientList", dataServise.getAllClients());
                mav.addObject("client", new Client());
                return mav;
            }

    @RequestMapping(method = RequestMethod.POST)
public String addUpdate(@Validated @ModelAttribute("client") Client client, BindingResult result) {
        if (!result.hasErrors()){
            dataServise.updateClient(client);
        }
        return "redirect:/clients";
    }

    @RequestMapping(value = "/updateClient/{id}", method = RequestMethod.GET)
    public String updateClient(@PathVariable Long id, ModelMap contractsModel) {
        Client client = dataServise.getById(id);
        contractsModel.addAttribute("client", client);
        return "client_contract/update_ekvar";
    }

то форма редактирования открывается, я там правлю но при sumbit получаю ошибку HTTP Status 405 - Request method &#39;POST&#39; not supported и в итоге измененные данные не сохраняются
Изменен:24 авг 2014 18:18
 
 
Сообщения:2185
Прошу прощения, в силу того, что я собственно со спрингом не сталкивался, не дочитал ваш код до конца. Да, GET там оставьте. Но позвольте спросить, а addUpdate у вас и есть тот метод, который должен произвести обновление сущности? А почему у него нет URL маппинга? Я думаю, что там должен быть тот же URL, что и у updateClient.
 
 
Сообщения:3
Ни чего не получается, что-то видно не до понимаю. Буду дальше биться
Quote:
Я думаю, что там должен быть тот же URL, что и у updateClient.
Прописала выпала ошибка. не найденного id.
 
 
Сообщения:441
Вот читаю я первое сообщение темы, и эту тему, также статьи на хабре про MVC. На которых говорится что View должен подписаться на события изменения модели... но чтото не вижу этого здесь. Где интерфейс-событие и подписка на события? Или я чтото упустил?
 
 
Сообщения:578
MVC для Web это не совсем тот MVC, который был разработан для Smalltalk. Взаимодействие по типу запрос-ответ накладывает свои ограничения. Как до появления веб-сокетов вы бы передавали события изменения модели на клиентов (т.е. На браузеры пользователей) по HTTP? Инициатором взаимодействия всегда должен быть сам клиент, поэтому MVC немножко другой. Можете еще почитать про Model2, так правильнее называть вебовский MVC.

Любая инструкция на русском языке должна начинаться со слов: "Ну что, уже сломал?"
 
 
Сообщения:441
samolisov:
MVC для Web это не совсем тот MVC, который был разработан для Smalltalk. Взаимодействие по типу запрос-ответ накладывает свои ограничения. Как до появления веб-сокетов вы бы передавали события изменения модели на клиентов (т.е. На браузеры пользователей) по HTTP? Инициатором взаимодействия всегда должен быть сам клиент, поэтому MVC немножко другой. Можете еще почитать про Model2, так правильнее называть вебовский MVC.

ага, спасибо.

A с появлением вебсокета, слушатель стал привязыватся?
Изменен:20 фев 2015 09:06
 
Модераторы:wedens
Сейчас эту тему просматривают:Нет