Spring MVC Cartographie des ressources
J'ai pu en tester une demande de cartographie de Spring MVC, et je suis tombé sur une drôle de situation dans mon application. J'ai décidé de créer un simple cenario de sorte que vous pouvez comprendre mon problème. Je vais d'abord vous montrer les détails de mon projet (la source), et puis je vais arriver à ma question.
J'ai la structure de répertoire suivante dans mon projet:
+webapp
+WEB-INF
+recursos
+estilos
test.css
+spring
fronte-beans.xml
+views
+testes
page1.jsp
page2.jsp
web.xml
Mon Tomcat descripteur de déploiement:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.4">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>fronte</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring/fronte-beans.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>fronte</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Mon contexte de l'application pour DispatcherServlet:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd ">
<mvc:annotation-driven />
<mvc:resources mapping="/recursos/**" location="/WEB-INF/recursos/" />
<context:component-scan base-package="com.regra7.minhaapp.contro" />
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
Ma classe de contrôleur pour la page1.jsp:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value="/path")
public class TestController
{
@RequestMapping(value="/to/something")
public String getPage()
{
return "testes/page2";
}
}
Ma page1.jsp:
<!DOCTYPE html>
<%@ page
language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html lang="pt-BR">
<!-- ############################################### -->
<!-- HEADER -->
<!-- ############################################### -->
<head>
<title>Test Page</title>
<meta name="author" content="RDS" />
<meta name="description" content="? ? ?" />
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="recursos/estilos/test.css" media="all" />
</head>
<!-- ############################################### -->
<!-- BODY -->
<!-- ############################################### -->
<body>
<h1>PAGE 1</h1>
<p>This is a test, p1.</p>
<p>This is a test, p2.</p>
<p>This is a test, p3.</p>
<a href="${pageContext.request.contextPath}/path/to/something">CLICK TO PAGE 2</a>
</body>
</html>
Je peux accéder à la page1.jsp et page2.jsp en douceur, mais le fichier CSS de page2.jsp finit par ne pas être trouvé. Le texte suivant est imprimé sur ma console:
dez 29, 2014 8:16:22 PM org.springframework.web.servlet.PageNotFound noHandlerFound
WARNING: No mapping found for HTTP request with URI [/testeSpringMvc/path/to/recursos/estilos/test.css] in DispatcherServlet with name 'fronte'
Pour quelle raison "/path/to" est inclus dans le résultat de ce chemin? Si j'essaie d'ajouter différentes combinaisons de cartographie, à la fois classe ou de la méthode de niveau, la même chose arrive. Cependant, si je carte le lien d'une chaîne de requête de l'URL (), comme suit, le fichier est trouvé sans problèmes...
page1.jsp:
<a href="${pageContext.request.contextPath}/?cd=page2">CLICK TO PAGE 2</a>
Contrôleur:
@Controller
@RequestMapping(value="/")
public class TestController
...
@RequestMapping(params="cd=page2")
public String getPage()
Ce qui se passe? Comment puis-je définir un chemin d'accès je veux donc que mes pages à utiliser et à trouver les ressources nécessaires? Je suis en train de séparer les pages en différents chemins pour que je puisse appliquer les fonctions de sécurité de Tomcat (contraintes de sécurité).
NOTE: j'ai essayé d'utiliser contextPath pour m'aider dans l'établissement de la CSS chemin d'accès au fichier, mais rien n'a fonctionné. En fait, la situation s'est aggravée en raison de Page1.jsp est également avéré ne pas avoir de stylisation:
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}recursos/estilos/test.css" media="all" />
Comme toujours, je vous remercie de votre attention et de temps.
OriginalL'auteur Loa | 2014-12-30
Vous devez vous connecter pour publier un commentaire.
Même qui m'arrivait, et j'ai trouvé une solution. J'espère que cela peut aider quelqu'un d'autre:
Comme vous le voyez dans le message d'erreur, les chemins d'accès que vous utilisez pour les ressources
/testeSpringMvc/path/to/recursos/estilos/test.css
sont d'essayer d'être résolu par le Printemps DispatchServlet.Cela se produit parce que dans votre web.xml fichier sont les suivantes:
Votre
fronte
servlet va essayer de résoudre tout ce qui commence par/
.Il suffit d'ajouter une extension simple pour vous
<url-pattern>
. Quelque chose comme<url-pattern>/*.html</url-pattern>
devrait faire le travail.OriginalL'auteur Paco Lagunas
Je viens de trouver la réponse à mes problèmes. Je laisse ici la solution, mais malheureusement je n'ai pas compris comment il résout le vu du scénario.
J'ai constaté que ce problème peut être résolu avec JSTL. J'ai lu la JSTL de la documentation, et tout ce que je trouve a cette description:
Si la référence au fichier CSS est modifié par la phrase suivante, le problème sera résolu:
Si un modérateur voir et connaître l'explication de la façon dont ce problème est résolu, je vous prie de bien de l'exposer ici. Modifier ma réponse, ou en commentaire, s'il vous plaît. Je suis sûr que d'autres personnes peuvent avoir le même doute que moi dans l'avenir.
Merci à tous pour l'attention et de temps.
OriginalL'auteur Loa
Prendre un coup d'oeil à ce l'entrée de blog. Le passage pertinent est:
Comme une solution de contournement possible, peut-être que cela peut fonctionner:
Juste si je suis clair, vous avez essayé de changer le lien css dans votre page2.jsp:
<link type="text/css" href="../../recursos/estilos/test.css" media="all" />
?Je ne l'avait pas fait, en fait. J'ai essayé de quelque chose d'autre avant. Après la lecture de votre commentaire, j'ai essayé ce que vous avez suggéré, et, malheureusement, il ne fonctionne pas... je suis vraiment frustré avec cela, et je sais que je suis en train de faire quelque chose de mal. Je suis sûr qu'il ya des façons de carte de cette façon, en gardant le style d'une page. Avez-vous dirais un peu de la source qui serait de m'indiquer ce que je cherche? Je vous serais éternellement reconnaissant. Dans l'avenir, si je trouve la réponse, je vais partager avec vous tous ici. Merci à vous de toute façon.
OriginalL'auteur Don Bottstein
Vous pouvez accéder à des ressources comme indiqué ci-dessous.
vous êtes manquant /au début
quand vous frappez le css url directement. qu'est-ce que le retour?
Pouvez-vous ouvrir un fichier war et de voir où est le test.css stockées?
Quand je regarde le code source de la page, le navigateur indique que la ressource n'a pas pu être trouvé. Je ne fais pas de la distribution de mon application dans la GUERRE encore, parce que je suis juste de le tester. Mais test.css est dans le "style" le dossier, qui est à l'intérieur de "ressources", ce qui à son tour est à l'intérieur de "WEB-INF", et "webapp" (la structure du répertoire est à la portée de ma question).
Voulez-vous partager le projet sur github?
OriginalL'auteur kamoor