15
respostas

${s:mvcUrl('PC#grava').build() }

Estou tentando usar o codigo abaixo ${s:mvcUrl('PC#grava').build() } em meu jsp mas estou recebendo a exceção:

org.apache.jasper.JasperException: /WEB-INF/views/produtos/form.jsp (line: 18, column: 1) The function mvcUrl cannot be located with the specified prefix

não sei o que pode ser.

15 respostas

Oi Alexandre. Tudo bem? Isso pode estar acontecendo por que talvez você não tenha feito o import da taglib do Spring na sua página JSP. Você lembra de ter feito o import?

Outra observação é que apesar de fazer o import o Eclipse vai acusar erro na sua página JSP, mas ela funcionará perfeitamente. Ele acusará erros porque não reconhece essa tag que é específica do Spring.

Caso não tenha feito o import veja a explicação textual da aula que fica fácil de copiar o impor lá. ;)

Espero ter ajudado, bons estudos.

Eu fiz o import mas mesmo assim não funcionou. Segue meu JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Livros de JAVA - Casa Do Codigo</title>
</head>
<body>

    <form:form action="${s:mvcUrl('PC#grava').build() }" method="post" commandName="produto">    
        <div>
            <label>Titulo</label> 
            <form:input path="titulo"/>
            <form:errors path="titulo" />
        </div>

        <div>
            <label>Descrição</label>
            <form:textarea  path="descricao"  rows="10" cols="20"/>
            <form:errors path="descricao" />
        </div>
        <div>
            <label>Páginas</label> 
            <form:input path="paginas"/>
            <form:errors path="paginas" />
        </div>

        <div>
            <label>Data de Lançamento</label> 
            <form:input path="dataLancamento"/>
            <form:errors path="dataLancamento" />
        </div>

        <c:forEach items="${tipos}" var="tipoPreco" varStatus="status">
            <div>
                <label>${tipoPreco}</label> 
                <form:input path="precos[${status.index}].valor"/>
                <form:hidden path="precos[${status.index}].tipo" value="${tipoPreco}"/>
            </div>
        </c:forEach>

        <button type="submit">Cadastrar</button>
    </form:form>
</body>
</html>

Estranho isso. Experimenta dar um clean no servidor. Clica com o direito no Tomcat na aba Servers do Eclipse e seleciona a opção clean... depois inicia o servidor e testa novamente pra ver se resolve.

Não rolou.

type Exception report

message /WEB-INF/views/produtos/form.jsp (line: 16, column: 1) The function mvcUrl cannot be located with the specified prefix

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: /WEB-INF/views/produtos/form.jsp (line: 16, column: 1) The function mvcUrl cannot be located with the specified prefix org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42) org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:443) org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:149) org.apache.jasper.compiler.Validator$ValidateVisitor$1FVVisitor.visit(Validator.java:1601) org.apache.jasper.compiler.ELNode$Function.accept(ELNode.java:139) org.apache.jasper.compiler.ELNode$Nodes.visit(ELNode.java:214) org.apache.jasper.compiler.ELNode$Visitor.visit(ELNode.java:256) org.apache.jasper.compiler.ELNode$Root.accept(ELNode.java:61) org.apache.jasper.compiler.ELNode$Nodes.visit(ELNode.java:214) org.apache.jasper.compiler.Validator$ValidateVisitor.validateFunctions(Validator.java:1610) org.apache.jasper.compiler.Validator$ValidateVisitor.getJspAttribute(Validator.java:1381) org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1231) org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:876) org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1553) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2392) org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2444) org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2450) org.apache.jasper.compiler.Node$Root.accept(Node.java:474) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2392) org.apache.jasper.compiler.Validator.validateExDirectives(Validator.java:1845) org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:218) org.apache.jasper.compiler.Compiler.compile(Compiler.java:374) org.apache.jasper.compiler.Compiler.compile(Compiler.java:354) org.apache.jasper.compiler.Compiler.compile(Compiler.java:341) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:657) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:209) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:266) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1225) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1012) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javax.servlet.http.HttpServlet.service(HttpServlet.java:620) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) note The full stack trace of the root cause is available in the Apache Tomcat/7.0.57 logs.

Oi Alexandre, tudo bem?

Como você realizou o import e seu jsp nesse ponto está correto, vamos tentar outras possibilidades até descobrirmos o que pode estar causando o erro. :)

Posta aqui o código do seu arquivo pom.xml, para a gente ver se pode ser algum problema com as dependências do projeto?

Abraço!

Segue!

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>br.com.alura</groupId>
    <artifactId>casadocodigo</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>casadocodigo Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <spring.version>4.0.1.RELEASE</spring.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <!-- Spring dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>7.0.30</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.15</version>
        </dependency>

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.0.0.GA</version>
        </dependency>

<!-- 
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.2.0.Final</version>
        </dependency>
 -->

    </dependencies>

    <build>
        <finalName>casadocodigo</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Oi, Alexandre tudo bem? Lucas e eu fizemos alguns testes no projeto original com seu pom.xml e encontramos alguns problemas.

1 ) Em uma aula futura o instrutor irá usar recursos do Java 8, pouca coisa mas que impacta no acompanhamento do projeto. Então configure seu projeto para utilizar o Java 8. No seu pom.xml na tag properties adicione as seguintes linhas:

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

2 ) Você está usando a versão 4.0.1 do Spring, enquanto o instrutor usa a versão 4.1.0. Caso continue usando a versão antiga, algumas coisas realmente não irá funcionar principalmente nas próximas aulas. Então mude a versão do Spring e faça update e clean do projeto.

Por garantias, faça clean no servidor também.

Depois disso, dê restart no servidor e teste novamente. Aqui tudo funcionou normalmente, mas caso tenha problemas, nos notifique.

Aguardo resposta.

Conseguiram resolver? Estou tendo o mesmo problema.

Rodrigo, tudo bem? O Alexandre não retornou mais nenhum status sobre a solução. Você poderia testar a solução que apresentei acima pra verificar se funciona pra você? Caso funcione, por favor, marque o tópico como resolvido.

Aguardo resposta, abraço!

Consegui corrigir.

Estava digitado errado, com R maiúsculo, como abaixo.

${s:mvcURl('PC#grava').build() }

Obrigado.

estou com o mesmo problema: lista.jsp

<%@ page language="java" contentType="text/html; UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset=UTF-8">
<title>Loja casa do código</title>
</head>
<body>

    <h1>Lista de Produtos</h1>
    <div>"${sucesso}"</div>
    <table>
        <tr>
            <td>Titulo</td>
            <td>Descrição</td>
            <td>Página</td>
        </tr>
        <c:forEach items="${produtos}" var="produto">
            <tr>
                <a href="${s:mvcURL('PC#detalhe').arg(0,produto.id).build()}" ><td>${produto.titulo}</td></a>
                <td>${produto.descricao}</td>
                <td>${produto.paginas}</td>
            </tr>
        </c:forEach>


    </table>

</body>
</html>

PomXML:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>br.com.casadocodigo</groupId>
    <artifactId>casadocodigo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <build>
        <finalName>casadocodigo</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <packaging>war</packaging>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <springframework.version>4.2.0.RELEASE</springframework.version>
        <jackson.version>2.5.3</jackson.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>8.0.21</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- configuracao jpa e driver -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc42</artifactId>
            <version>4.0</version>
            <scope>runtime</scope>
        </dependency>
        <!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.6.1</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.1</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.4.Final</version>
        </dependency>



    </dependencies>


</project>

Danilo, você testou as soluções acima?

Opa consegui resolver verifiquei que coloquei errado a sintaxe s:mvcURL ao invés de s:mvcUrl

Estou com a mensagem:

The method getBuild() is undefined for the type MvcUriComponentsBuilder.MethodArgumentBuilder

<form:form action="${s:mvcUrl('UC#grava').build()}" method="post" commandName="usuario">

Oi Guilherme, o eclipse apresenta essa mensagem mesmo, pode desconsiderar, o Wanderson comenta sobre esse erro mais acima.