没有可用消息 JSP Spring Boot

No message available JSP SpringBoot

我浏览了几乎所有与我的问题相关的 post 并尝试了我找到的所有解决方案,但这个问题一直出现。

我正在开发一个 Web 应用程序,我几乎拥有所有将包含的页面,但是当我尝试将控制器与任何 JSP 连接时,每次都会出现此消息,所以我创建了一个新项目只有一个 table 和几个页面,仍然得到相同的 "error" 但只有加载一些信息的页面,我已经尝试了一个非常简单的页面并且它有效

白标错误页面

此应用程序没有 /error 的显式映射,因此您将其视为后备。

出现意外错误(类型=未找到,状态=404)。 没有可用的消息

Pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>mjsl.gineco</groupId>
    <artifactId>GinecObstWeb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>GinecObstWeb</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.core</artifactId>
      <version>2.5.2</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.asm</artifactId>
      <version>2.5.2</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.antlr</artifactId>
      <version>2.5.2</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.jpa</artifactId>
      <version>2.5.2</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.jpa.jpql</artifactId>
      <version>2.5.2</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>javax.persistence</artifactId>
      <version>2.1.0</version>
     </dependency>
     <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
      <version>2.5.2</version>
      <scope>provided</scope>
     </dependency>

    <!-- standard.jar --> 
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>

    <!-- JSTL --> 
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.1.2</version>
    </dependency>         

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.properties

spring.datasource.url=jdbc:mysql://localhost:13366/ginecoweb?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=gineco
spring.datasource.password=Gineco-94.Aguila
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=none
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.generate-ddl=false
spring.jpa.properties.hibernate.hbm2ddl.auto=none
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp

实体 Clientes.java

package mjsl.gineco.entity;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import lombok.Data;

@Data
@Entity
@Table(name = "clientes")
public class Clientes implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "CLAVCLI")
    private Integer clavCli;
    @Size(max = 100)
    @Column(name = "NOMBCLI")
    private String nombCli;
    @Size(max = 100)
    @Column(name = "DIRECLI")
    private String direCli;
    @Size(max = 50)
    @Column(name = "COLOCLI")
    private String coloCli;
    @Size(max = 50)
    @Column(name = "POBLCLI")
    private String poblCli;
    @Size(max = 30)
    @Column(name = "TELCLI")
    private String telCli;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "ESTACLI")
    private Double estaCli;
    @Size(max = 100)
    @Column(name = "OCUPCLI")
    private String ocupCli;
    @Size(max = 100)
    @Column(name = "NOCOCLI")
    private String nocoCli;
    @Size(max = 100)
    @Column(name = "OCCOCLI")
    private String occoCli;
    @Lob
    @Column(name = "EXPECLI")
    private byte[] expeCli;
    @Column(name = "FECHANACCli")
    @Temporal(TemporalType.DATE)
    private Date fechanacCli;
    @Size(max = 5)
    @Column(name = "GYRH")
    private String gyrhCli;
    @Column(name = "EMBARAZO")
    private Boolean embarazoCli;
    @Size(max = 50)
    @Column(name = "SEGUROCli")
    private String seguroCli;
    @Column(name = "NOSI")
    private Boolean nosiCli;
    @Size(max = 500)
    @Column(name = "FOTO")
    private String fotoCli;
    // @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
    @Size(max = 200)
    @Column(name = "EMAIL")
    private String emailCli;

}

客户端控制器

package mjsl.gineco.controller;

import java.util.List;
import mjsl.gineco.entity.Clientes;
import mjsl.gineco.service.ClientesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ClientesController {

    @Autowired
    ClientesService ctesService;

    @RequestMapping("")
    public String inicio() {
        return "inicio";
    }

    @RequestMapping("listcte")
    public String listaCtes(Model model) {
        List<Clientes> clientes = ctesService.getAllCtes();
        model.addAttribute("clientList", clientes);
        return "indexpac";
    }

    @RequestMapping("newcte")
    public String nuevoCte(Model model) {
        Clientes clientes = new Clientes();
        model.addAttribute("clienteNuevo", clientes);
        return "nuevopac";
    }
}

ClientesRepository

package mjsl.gineco.repository;

import mjsl.gineco.entity.Clientes;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ClientesRepository extends JpaRepository<Clientes, Integer> {

}

客户服务

package mjsl.gineco.service;

import java.util.List;
import java.util.Optional;
import mjsl.gineco.entity.Clientes;

public interface ClientesService {

    void saveCte(Clientes clientes);

    List<Clientes> getAllCtes();

    Optional<Clientes> getCte(Integer clavCli);

    void deleteCte(Integer clavCli);
}

ClientesServiceImpl

package mjsl.gineco.service;

import java.util.List;
import java.util.Optional;

import mjsl.gineco.entity.Clientes;
import mjsl.gineco.repository.ClientesRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ClientesServiceImpl implements ClientesService {

    @Autowired
    ClientesRepository ctesRepo;

    @Override
    public void saveCte(Clientes clientes) {
        ctesRepo.save(clientes);
    }

    @Override
    public List<Clientes> getAllCtes() {
        return ctesRepo.findAll();
    }

    @Override
    public Optional<Clientes> getCte(Integer clavCli) {
        return ctesRepo.findById(clavCli);
    }

    @Override
    public void deleteCte(Integer clavCli) {
        ctesRepo.deleteById(clavCli);
    }

}

indexpac.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
  <head>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
        <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.0/css/all.css" integrity="sha384-lZN37f5QGtY3VHgisS14W3ExzMWZxybE1SJSEsQp9S+oqd12jhcu+A56Ebc1zFSJ" crossorigin="anonymous">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>GinecoObstetricia Avanzada - Pacientes</title>
  </head>
  <body>
        <p><%@ include file="/WEB-INF/views/jspf/menu.jspf"%></p>
        <p></p>

        <div class="container-fluid">
            <div class="row-fluid">
                <div class="col-md-12">
                    <h4 class="text-center">Listado de Pacientes</h4>
                    <hr>
                    <a href="${pageContext.request.contextPath}/nuevopac" class="btn btn-success"><i class="glyphicon glyphicon-edit"></i> Nuevo(a) Paciente</a>
                    <div class="input-group mb-3">
                      <input type="text" class="form-control" placeholder="Buscar">
                      <div class="input-group-append">
                        <button class="btn btn-primary" type="submit">Ir</button> 
                      </div>
                    </div>
                    <p/>
                    <table class="table table-bordered table-striped">
                        <thead>
                        <tr>
                            <th>Id</th>
                            <th>Nombre</th>
                            <th>Teléfono</th>
                            <th>Ver</th>
                            <th>Expediente</th>
<!--                            <th>Eliminar</th>-->
                        </tr>
                        </thead>
                        <tbody>
                            <c:forEach var="clients" 
                                       items="${clientList}">
                                <c:url var="updateCteLink" value="/clientes/editapac">
                                    <c:param name="clavCli" value="${clients.clavCli}"/>
                                </c:url>
                                <c:url var="openCteLink" value="/clientes/datospac">
                                    <c:param name="clavCli" value="${clients.clavCli}"/>
                                </c:url>
                                <tr>
                                    <td>${clients.clavCli}</td>
                                    <td>${clients.nombCli}</td>
                                    <td>${clients.telCli}</td>
                                    <td>
                                        <a href="${updateCteLink}">
                                            <span class="fa-stack">
                                                <i class="far fa-edit" style="color:blue"> </i>
                                            </span>
                                        </a>
                                    </td>
                                    <td><a href="${openCteLink}">
                                            <span class="fa-stack">
                                                <i class="far fa-folder-open"> </i>
                                            </span>
                                        </a>
                                    </td>
<!--                                    <td>><a href="${pageContext.request.contextPath}/product/delete/${clients.clavCli}">
                                            <span class="fa-stack">
                                                <i class="far fa-trash-alt"> </i>
                                            </span>
                                        </a>
                                    </td>-->
                                </tr>
                            </c:forEach>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>


  </body>

        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>  
</html>

menu.jspf

<%@ page pageEncoding="UTF-8" %>
<%!
    public String getPath(){
        String path = getServletContext().getContextPath();
        return path;
    }

%>

<nav class="navbar navbar-default navbar-fixed-top navbar-expand-md bg-light navbar-light">
  <div class="container-fluid">
    <!-- -->  
    <div class="navbar-header">
      <a class="navbar-brand" href="#">GinecoObstetricia</a>
    </div>
    <!-- -->  
      <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item active">
              <a class="nav-link" href="<%=getPath()%>/index.jsp">Inicio <span class="sr-only">(current)</span></a>
            </li>
            <li class="nav-item">
              <a class="nav-link" href="<%=getPath()%>/login.jsp">Iniciar Sesión</a>
            </li>
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                Pacientes
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<!--                  <a class="dropdown-item" href="<%response.sendRedirect("indexpac");%>">Inicio</a>-->
                <a class="dropdown-item" href="<%=getPath()%>/indexpac.jsp">Inicio</a>
                <a class="dropdown-item" href="<%=getPath()%>/nuevopac.jsp">Agregar</a>
                <a class="dropdown-item" href="<%=getPath()%>/datospac.jsp">Expediente Médico</a>
                <a class="dropdown-item" href="<%=getPath()%>/datoscons.jsp">Consulta</a>
              </div>
            </li>
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                Estudios
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                <a class="dropdown-item" href="<%=getPath()%>/listadoest.jsp">Listado</a>
                <a class="dropdown-item" href="<%=getPath()%>/nuevoest.jsp">Nuevo</a>
              </div>
            </li>
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                Agenda
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                <a class="dropdown-item" href="<%=getPath()%>/index.jsp">Listado</a>
                <a class="dropdown-item" href="<%=getPath()%>/index.jsp">Nueva</a>
              </div>
            </li>
        </ul>
      </div>
  </div>
</nav>

nuevopac.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="mvc" %>

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
  <head>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>GinecoObstetricia Avanzada - Pacientes</title>
  </head>
  <body>
        <p><%@ include file="/WEB-INF/views/jspf/menu.jspf"%></p>
        <p></p>
         <div class="col-md-10 order-md-1">
            <mvc:form modelAttribute="clienteNuevo" action="createCte">
                <mvc:hidden path="clavCli" />
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Nombre</span>
                    </div>                
                    <mvc:input path="nombCli" type="text" class="form-control"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Fecha de Nacimiento</span>
                    </div>                
                    <mvc:input path="fechanacCli" type="date" class="form-control btn btn-outline-secondary col-md-3"/>
                    <div class="input-group-prepend">
                        <span class="input-group-text">Ocupación</span>
                    </div>                
                    <mvc:input path="ocupCli" type="text" class="form-control col-md-3"/>
                    <div class="input-group-prepend">
                        <span class="input-group-text">GyRH</span>
                    </div>                
                    <mvc:input path="gyrhCli" type="text" aria-labelledby="GyRH-ariaLabel" class="form-control col-md-3"/>
                    <div class="input-group-prepend">
                        <span class="input-group-text">Estatura</span>
                    </div>                
                        <mvc:input path="estaCli" type="text" class="form-control col-md-3"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Domicilio</span>
                    </div>                
                        <mvc:input path="direCli" type="text" class="form-control" placeholder="Calle y Número"/>
                        <mvc:input path="coloCli" type="text" class="form-control" placeholder="Colonia o Fraccionamiento"/>
                        <mvc:input path="poblCli" type="text" class="form-control" placeholder="Población"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Teléfono</span>
                    </div>                
                    <mvc:input path="telCli" type="text" class="form-control col-md-6"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Conyuge</span>
                    </div>                
                    <mvc:input path="nocoCli" type="text" placeholder="Nombre" class="form-control col-md-3"/>
                    <mvc:input path="occoCli" type="text" placeholder="Ocupación" class="form-control col-md-3"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">Compañía de Seguros</span>
                    </div>                
                    <mvc:input path="seguroCli" type="text" placeholder="Nombre de la Compañía de Seguros" class="form-control col-md-6"/>
                </div>
                <div class="input-group mb-3">
                    <div class="input-group-prepend">
                        <span class="input-group-text">E-mail</span>
                    </div>                
                    <mvc:input path="emailCli" type="text" placeholder="Correo Electrónico" class="form-control col-md-6"/>
                </div>
                <div class="form-check-inline mb-3">
                    <label class="form-check-label">
                      <mvc:checkbox path="nosiCli" class="form-check-input" value=""/>Recomendada
                    </label>        
                </div>
                <div class="input-group mb-3">
                    <input type="submit" value="Guardar" class="btn btn-success">
                    <button type="button" class="btn btn-danger">Cancelar</button>
                </div>
            </mvc:form>
         </div>

        <!--<p style="text-align: center"><img src="Resources/logo_mrysi.png" align="bottom"/></p>-->
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>  
     </body>

</html>

项目地图

基于您点击

时的控制器映射
localhost:8080/ => inicio page will load
localhost:8080/listcte => indexpac page will load
localhost:8080/newcte => nuevopac page will load

现在让我们看看你在尝试什么

localhost:8080/listado => 将抛出错误页面,因为在控制器 class.

中找不到此 URL 的映射

localhost:8080/newcte => 应该加载 nuevopac 页面。检查控制台是否有错误,请添加 nuevopac 代码。可能 JSP 抛出一些错误。

在您的控制器客户端中替换class @Controller for @RestController