Устранение неполадок Ajax для Spring MVC Controller - PullRequest
0 голосов
/ 09 января 2019

Короткая версия:

Мне нужно знать, что здесь поставить:

$(document).ready(function() {
    $('#orgSearch').autocomplete({
        // what do I put for "source" ???
        source : '/getOrgsViaAjax'
    });
});

и здесь:

// What do I put for the arguments in `@RequestMapping` ?
// What do I put as the arguments for the method?
// What do I name the method?

@RequestMapping(value = "/getOrgsViaAjax", method = RequestMethod.GET)
public @ResponseBody String getOrgsViaAjax(@RequestParam("term") String query) {
    ...
}

, чтобы мой автозаполнение Ajax работало с контроллером Spring MVC.


Длинная версия:

Я пытаюсь сопоставить тег автозаполнения Ajax source с моим контроллером Spring MVC, и я не могу заставить что-либо работать.

Что я пробовал:

У меня есть контроллер Spring MVC, похожий на этот:

@Controller
@RequestMapping("/PersonAffiliations.html")
public class PersonAffiliationsController extends BaseController {

    @RequestMapping(value = "/getOrgsViaAjax", method = RequestMethod.GET)
    public @ResponseBody String getOrgsViaAjax(@RequestParam("term") String query) {

        System.out.println("getOrgsViaAjax -- Here");
        return "{\"Test OrgOne\":\"42695847\",\"Test OrgTwo\":\"84920493\",\"Test OrgThree\":\"22222222\",\"Test OrgFour\":\"42226589\"}";
    }

    // The controller methods below all work
    // I included them here just incase they're causing my issues
    @RequestMapping(method = RequestMethod.GET)
    public String getPerson(Map model, HttpServletRequest request) {
        ...
        return "PersonAffiliations";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String processForm(@Valid PersonForm objPersonForm, BindingResult result, Map model, HttpServletRequest request) {
        ...
        return "PersonAffiliations";            
    }

    @RequestMapping(params = "update", method = RequestMethod.POST)
    public String processNameForm(@Valid PersonAffiliationForm objPersonAffiliationForm, BindingResult result, Map model, HttpServletRequest request) {
        ...
        return "PersonAffiliations";            
    }

}

И страница .jsp, похожая на эту:

<!DOCTYPE HTML><%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<html>
    <script src="resources/js/jquery-1.12.4.js"></script>
    <script src="resources/js/jquery-ui.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {

            console.log("here");
            console.log('${pageContext.request.contextPath}');

            $('#orgSearch').autocomplete({
                source : '${pageContext.request.contextPath}/PersonAffiliations/getOrgsViaAjax'
            });
        });
    </script>
    <head>
        <title>Person Affiliation Editor</title>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    </head>
    <body>
        <form:form name="AddPersonAffiliationForm" action="PersonAffiliations.html" modelAttribute="BlankPersonAffiliationForm">
            ...
            <form:input id="orgDeptId" path="deptId" />
            <form autocomplete="off" id="searchOrgForm">
                <div class="autocomplete">
                    <input id="orgSearch" type="text" style="width:500px" name="orgSearch" placeholder="Organization" />
                </div>
            </form>


        </form:form>
    </body>
</html>

Но метод контроллера getOrgsViaAjax никогда не выполняется. Firebug говорит 404.

На стороне .jsp я пробовал:

source : '${pageContext.request.contextPath}/PersonAffiliations/getOrgsViaAjax'

source : '${pageContext.request.contextPath}/PersonAffiliations//getOrgsViaAjax'

source : '/PersonAffiliations/getOrgsViaAjax'

source : '/getOrgsViaAjax'

source : '${pageContext.request.contextPath}/PersonAffiliations.html/getOrgsViaAjax'

source : '/PersonAffiliations.html/getOrgsViaAjax'

На стороне контроллера я пробовал:

@RequestMapping(value = "/getOrgsViaAjax", method = RequestMethod.GET)
public @ResponseBody String getOrgsViaAjax(@RequestParam("term") String query) {


@RequestMapping(value = "/getOrgsViaAjax")
public @ResponseBody String getOrgsViaAjax(@RequestParam("term") String query) {


@RequestMapping(value = "/getOrgsViaAjax")
public @ResponseBody String getOrgsViaAjax() {

Но я не могу ничего понять.

Firebug проясняет, что когда я что-то набираю в поле ввода (для автозаполнения), он отправляет запрос, но он всегда возвращается 404:

enter image description here

Итак, ясно, что функция автозаполнения запускает запрос, но он не сопоставлен с контроллером MVC

Как вы можете получить source, совпадающий с RequestMapping в Spring MVC?


EDIT:

Я не уверен, что это уместно, но я должен отметить, что есть mvc-dispacher-servlet.xml, который выглядит так:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"   
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">


    <bean name="/SearchPerson.html" 
        class="org.personhub.controller.SearchPersonController" />      

    <bean name="/authenticate.html" 
        class="org.personhub.controller.LogInController" />

    <bean name="/PersonSummary.html"
            class="org.personhub.controller.PersonSummaryController" />

    <bean name="/ManagePerson.html" 
        class="org.personhub.controller.ManagePersonController" />

    <bean name="/PersonNames.html" 
        class="org.personhub.controller.PersonNamesController" />

    <bean name="/PartyAddresses.html" 
        class="org.personhub.controller.PartyAddressesController" />

    <bean name="/PartyIdentifiers.html" 
        class="org.personhub.controller.PartyIdentifiersController" />

    <bean name="/PersonAffiliations.html" 
        class="org.personhub.controller.PersonAffiliationsController" />

    <bean name="/PartyContactMethods.html" 
        class="org.personhub.controller.PartyContactMethodsController" />

    <bean name = "Logout.html"
         class= "org.personhub.controller.LogOutController"> </bean>    

      <!--  <mvc:resources mapping="/resources/**" location="/resources/" /> -->
     <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass">
            <value>
                org.springframework.web.servlet.view.tiles3.TilesView
            </value>
        </property>
    </bean>

    <bean id="tilesConfigurer"  
        class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">  
        <property name="definitions">  
            <list>  
                <value>/WEB-INF/tiles.xml</value>  
            </list>  
        </property>  
    </bean>  


</beans>

Edit:

По запросу, вот web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>PersonHubWeb</display-name>
    <welcome-file-list>
        <welcome-file>LogIn.jsp</welcome-file>              
    </welcome-file-list>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>


    <servlet>
        <servlet-name>PersonHubStart</servlet-name>
        <servlet-class>org.personhub.utils.StartUpServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>     
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>      

</web-app>

И просто, вот вам файл tile.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
  "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" 
  "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
    <definition name="base.definition"
        template="/WEB-INF/pages/BaseLayout.jsp">
        <put-attribute name="title" value="Person Hub UI" />
        <put-attribute name="header" value="/WEB-INF/pages/Baseheader.jsp" />
        <put-attribute name="menu" value="/WEB-INF/pages/BaseMenu.jsp" />
        <put-attribute name="feedback" value="/WEB-INF/pages/BaseFeedback.jsp" />
        <put-attribute name="body" value="" />
        <put-attribute name="footer" value="/WEB-INF/pages/Basefooter.jsp" />
    </definition>


    <definition name="Search" template="/WEB-INF/pages/SearchLayout.jsp">
        <put-attribute name="title" value="Person Hub UI" />
        <put-attribute name="header" value="/WEB-INF/pages/SearchHeader.jsp" />     
        <put-attribute name="body" value="" />
        <put-attribute name="footer" value="/WEB-INF/pages/Basefooter.jsp" />
    </definition>   

    <definition name="PersonSearch" extends="Search">               
        <put-attribute name="body" value="/WEB-INF/pages/SearchPerson.jsp" />
    </definition>

    <definition name="PersonSummary" extends="base.definition">         
        <put-attribute name="body" value="/WEB-INF/pages/PersonSummary.jsp" />
    </definition>

    <definition name="ManagePerson" extends="base.definition">      
        <put-attribute name="body" value="/WEB-INF/pages/ManagePerson.jsp" />
    </definition>

    <definition name="PersonNames" extends="base.definition">       
        <put-attribute name="body" value="/WEB-INF/pages/PersonNames.jsp" />
    </definition>

    <definition name="PersonAffiliations" extends="base.definition">        
        <put-attribute name="body" value="/WEB-INF/pages/PersonAffiliations.jsp" />
    </definition>

    <definition name="PartyContactMethods" extends="base.definition">       
        <put-attribute name="body" value="/WEB-INF/pages/PartyContactMethods.jsp" />
    </definition>

    <definition name="PartyAddresses" extends="base.definition">

        <put-attribute name="body" value="/WEB-INF/pages/PartyAddresses.jsp" />
    </definition>

    <definition name="PartyIdentifiers" extends="base.definition">

        <put-attribute name="body" value="/WEB-INF/pages/PartyIdentifiers.jsp" />
    </definition>

</tiles-definitions>

Ответы [ 3 ]

0 голосов
/ 12 января 2019

При тщательном рассмотрении настроек вы обнаружите, что ваше приложение настроено в одном направлении (web mvc), и вы пытаетесь использовать его по-другому (остальные веб-службы).

Вам нужно внести несколько изменений, чтобы сделать ваше приложение спокойным.

Создать новый контроллер с пометкой @RestController

@RestController
@RequestMapping("/personAffiliations")
public class PersonAffiliationsRestController {
   @RequestMapping(value = "/getOrgsViaAjax", method = RequestMethod.GET)
   public @ResponseBody String getOrgsViaAjax(@RequestParam("term") String query) {
     return "{\"Test OrgOne\":\"42695847\",\"Test OrgTwo\":\"84920493\",\"Test OrgThree\":\"22222222\",\"Test OrgFour\":\"42226589\"}";
   }
}

Зарегистрируйте контроллер в mvc-dispatcher-servlet.xml

<bean name="/personAffiliations" class="org.personhub.controller.PersonAffiliationsRestController" />

Зарегистрируйте новое отображение URL для остальных веб-сервисов в web.xml

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>     
    <url-pattern>*.html</url-pattern>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>  

Изменить источник для использования

'${pageContext.request.contextPath}/rest/personAffiliations/getOrgsViaAjax'
0 голосов
/ 12 января 2019

Затем вы регистрируете сервлет с помощью * .html, поэтому ваш диспетчер сервлетов запрашивает только суффиксы * .html. Вот почему ваши другие методы отображения работают хорошо. Потому что у вас есть отображение уровня класса @RequestMapping("/PersonAffiliations.html"), и оно заканчивается суффиксом .html.

Но когда вы используете @RequestMapping(value = "/getOrgsViaAjax"), тогда ваш URL становится PersonAffiliations.html/getOrgsViaAjax. Это не заканчивается шаблоном * .html. Так происходит ошибка 404.

Возможное решение

Вы добавляете суффикс .html и URL-адрес пружины, и URL автозаполнения следующим образом:

source : '${pageContext.request.contextPath}/PersonAffiliations.html/getOrgsViaAjax.html'

@RequestMapping(value = "/getOrgsViaAjax.html")
public @ResponseBody String getOrgsViaAjax(@RequestParam("term") String query) {
    ...
}
0 голосов
/ 11 января 2019

Измените ваше отображение на @RequestMapping("/PersonAffiliations").

В настоящее время вы запрашиваете /PersonAffiliations/getOrgsViaAjax вместо /PersonAffiliations.html/getOrgsViaAjax

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...