1
votes

Problème de mappage d'Ajax sur Spring MVC Controller

Version courte:

J'ai besoin de savoir quoi mettre ici:

<?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>

et ici:

<?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>

pour que ma saisie semi-automatique Ajax fonctionne avec un contrôleur Spring MVC.


Version longue:

J'essaie de mapper la balise de saisie semi-automatique Ajax source avec mon contrôleur Spring MVC, et je ne parviens pas à faire fonctionner quoi que ce soit.

Ce que j'ai essayé:

J'ai un contrôleur Spring MVC similaire à celui-ci: p>

<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>

Et une page .jsp qui ressemble à ceci:

@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() {

Mais le contrôleur getOrgsViaAjax La méthode ne s'exécute jamais. Firebug dit 404.

Du côté .jsp, j'ai essayé:

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'

Du côté du contrôleur, j'ai essayé:

<!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>

Mais je n'arrive pas à faire quoi que ce soit correctement.

Firebug indique clairement que lorsque je tape quelque chose dans le champ de saisie (pour être autocomplété), il envoie une requête, mais il revient toujours 404:

 entrez la description de l'image ici

Il est donc clair que la fonction de saisie semi-automatique déclenche une requête, mais elle n'est pas mappée au contrôleur MVC

Comment obtenir la source pour qu'elle corresponde au code RequestMapping > dans Spring MVC?


EDIT:

Je ne sais pas si cela est pertinent mais je dois noter qu'il existe un mvc-dispacher-servlet. xml qui ressemble à ceci:

@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";            
    }

}

Modifier:

Comme demandé, voici le web.xml: p >

// 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) {
    ...
}

Et juste au cas où, voici le til es.xml aussi:

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

5 commentaires

Vous mappez un /PersonAffiliations.html mais demandez à / PersonAffiliations , est-ce la requête prévue?


J'ai essayé de tout changer (en supprimant / ajoutant .html à la source et au mapping ) mais rien de tout cela ne fonctionne


pouvez-vous afficher le web.xml? pourquoi définissez-vous les beans dans le xml? Pouvez-vous supprimer des beans et ajouter & dans le répartiteur xml pour l'analyse des composants pour charger les beans dans le contexte du printemps? Est-ce la seule demande de contrôleur qui ne fonctionne pas pour vous?


@Veeram J'ai publié le web.xml. Pourquoi suis-je en train de définir les beans dans le XML? Eh bien, ce n'est pas moi qui ai construit cela, donc je ne sais pas pourquoi l'architecte d'origine de l'application a décidé de le faire de cette façon (et lui demander sera difficile). Oui, c'est la seule demande de contrôleur qui ne fonctionne pas pour moi.


Pouvez-vous supprimer le @RequestMapping ("/ PersonAffiliations.html") du niveau de la classe et essayer la source comme '$ {pageContext.request.contextPath} /PersonAffiliations.html/‌ getOrgsViaAjax' < / code>?


3 Réponses :


-1
votes

Changez votre mappage en @RequestMapping ("/ PersonAffiliations") .

Vous demandez actuellement à / PersonAffiliations / getOrgsViaAjax au lieu de /PersonAffiliations.html/getOrgsViaAjax


2 commentaires

Changer le @RequestMapping au niveau de la classe? Ou au niveau de la méthode?


J'ai ajouté le mvc-dispatcher-servlet.xml pour clarifier pourquoi la classe a @RequestMapping ("/ Person Affiliations.html")



2
votes

En examinant de près la configuration que vous avez fournie, il semble que votre application est configurée dans un sens (Web mvc) et que vous essayez de l'utiliser d'une autre manière (service Web de repos).

Vous devez apporter quelques modifications pour effectuer votre application reposante.

Créez un nouveau contrôleur annoté avec @RestController

'${pageContext.request.contextPath}/rest/personAffiliations/getOrgsViaAjax'

Enregistrez le contrôleur dans le mvc- dispatcher-servlet.xml

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

Enregistrez un nouveau mappage d'URL pour les services Web restants dans web.xml

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

Changer la source à utiliser

@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\"}";
   }
}


7 commentaires

D'accord. Lors de l'ajout du url-pattern au web.xml , il renvoie une erreur: cvc-complex-type.2.4.d: Un contenu non valide a été trouvé en commençant par élément 'url-pattern'. Aucun élément enfant n'est attendu à ce stade.


Je vois. Pouvez-vous mettre à jour votre web.xml pour utiliser le servlet 3.0? Quelque chose comme


Génial. Veuillez vous assurer que lorsque vous le déployez dans un environnement supérieur, le serveur d'applications prend en charge les spécifications de servlet 3.0. Tomcat 7 fait c'est là que j'ai testé le code.


Je déploie sur un serveur IBM WAS. Mon environnement de développement local doit correspondre au serveur de destination.


De plus, en fait, j'ai pu le faire fonctionner sans la spécification 3.0 en divisant le servlet-mapping


Ainsi, au lieu d'un servlet-mapping avec deux url-pattern , il y a deux servlet-mapping avec un url-pattern chacun


C'est la solution de contournement pour les versions de servlet inférieures, je crois.



0
votes

Vous enregistrez un servlet avec "* .html" alors votre répartiteur de servlet ne demande que le suffixe * .html. C'est pourquoi vos autres méthodes de cartographie fonctionnent bien. Parce que vous avez un mappage de niveau de classe @RequestMapping ("/ PersonAffiliations.html") et qu'il se termine par le suffixe .html.

Mais lorsque vous utilisez @RequestMapping (value = "/ getOrgsViaAjax" ) alors votre URL devient PersonAffiliations.html / getOrgsViaAjax . Cela ne se termine pas par le modèle * .html. Il se produit donc une erreur 404.

Solution possible

Vous ajoutez le suffixe .html à la fois l'url de printemps et l'url de saisie semi-automatique comme suit:

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

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


0 commentaires