Varios problemas encontrados por proyectos simples de SSM (el último problema, aunque puede ejecutarse, pero no puedo encontrar dónde está el problema)

Estas preguntas me han molestado durante mucho tiempo.

Principalmente debido al ejemplo del libro, regresa a la capa jsp a través de la capa del controlador. Sin embargo, el último proyecto SSM usa el controlador para devolver información a la capa de servicio y luego la capa de servicio regresa a la capa Jsp.

Práctica: Escriba un proyecto para la consulta de nombres borrosos. Mostrar información de consulta en otra página show.jsp.

Paso a paso:

Primero regrese a la capa JSP a través de la capa del controlador.

Primera pregunta: (iterador no encontrado, o tipo de iterador no)

javax.servlet.ServletException: javax.servlet.jsp.JspTagException: no sé cómo iterar sobre los "elementos" proporcionados en <forEach>

La información del código correspondiente a show.jsp:

Se solicita <%--querylist.account. Solo list.account no se solicita. (Indicando que la lista no es un objeto iterable) --%> 

<c:forEach items="${ queryList }" var="user"> 
    ${user.account}<br> 
    ${user.password}<br> 
    ${user.sex}<br> 
    ${user.name}<br> 
</c:forEach>
  
  

Este es el código correspondiente a show.jsp, esta información indica que el atravesador de querylist no tiene este objeto. Explique que el problema es que la lista de consultas no es un objeto iterable. Volvemos al archivo del controlador que define esta lista de consultas y encontramos:

// El problema radica en el usuario, queryList es un objeto de colección, pero el usuario es un objeto de clase, por lo que no se puede usar c:foreach 
        model.addAttribute("queryList",user);

Solución: reemplace el usuario con un objeto iterador. (Por ejemplo, el método de la capa de servicio que definimos anteriormente es un tipo de lista, que es un objeto iterador). (Adicional: cuando se usa la capa de servicio como la capa devuelta con JSP, sospecho que la razón por la que se informó el error antes es que el tipo de retorno de la capa de servicio fue reemplazado por el tipo de cadena)

Después de la modificación, la información de consulta del usuario se puede mostrar en show.jsp.

Segundo problema: no se encontró el bean "query2". Consulta claramente definida2

Intento poner la información obtenida de la consulta de información del usuario en la página query.jsp, es decir, query.jsp proporciona la función de consulta y pongo la información en query.jsp.

Mi primer intento fue cambiar el método originalmente devuelto para mostrar a consulta.

En query.jsp, copie el código de show.jsp. Sin embargo, resultó que había un gran problema, que encontré después de buscar durante mucho tiempo:

java.lang.IllegalStateException: ni BindingResult ni el objeto de destino simple para el nombre de bean 'query2' disponible como atributo de solicitud

Este mensaje de error indica que Spring no pudo encontrar el bean nombrado al procesar la solicitud query2.

El código original de JSP es: (aquí debe cambiar la consulta a entrada)

<form:form method="post" action="${pageContext.request.contextPath}/user/ query " modelAttribute="query2">

Porque usamos dos métodos para expresar la consulta y la visualización en el Controlador, y el proceso general es el siguiente:

Primero, ingresamos /input en el navegador.

Devuelva la información de POJO a query.jsp en /input. Enlace la información del formulario de POJO y query.jsp a través del atributo de query2.

Luego, en query.jsp, envíe la información del usuario y la acción es /query.

/query devuelve la información obtenida de la base de datos a query.jsp. Sin embargo, en este momento, en query.jsp, la información del formulario se volverá a leer y el atributo query2 de la información del formulario no está definido en este momento. Por lo tanto, IDEA genera un error: no se puede encontrar el bean "query2".

 
 

después de la modificación:

Proceso aproximado:

Primero, el navegador ingresa /input.

Devuelve información POJO a query.jsp. Tenga en cuenta que POJO no se ha vinculado al nombre de query.jsp en este momento. Entonces, los datos devueltos por la base de datos son nulos en este momento.

También devuelve los datos recuperados de la base de datos a query.jsp. (también nulo)

En el usuario query.jsp, envía la acción como /input.

Así que es lo mismo que la información anterior. En este momento, el usuario es {"null", "null", "null", "Li"}

Finalmente regrese a query.jsp. En este punto, hay información en la lista de consulta en el jsp. En este momento, la lista de consultas es {"2020", "1234", "Hombre", "Li XX"}

La tercera pregunta: proceso de seguimiento de pruebas para encontrar problemas (muy importante)

(Al aprender de esta manera, no necesita integrar y probar Spring y Mybatis primero). Quiero rastrear el resultado de este proceso a través de algunos métodos de prueba. Al buscar información, se puede obtener que se puede generar en modo de registro.

Método: importar la clase `org.slf4j.Logger`

No la clase `org.apache.commons.logging.Log`. El método `info` de la clase Log` acepta solo un parámetro y no puede usar el marcador de posición `{}` para formatear el mensaje. (Antes, aprendí a usar la clase org.apache.commons.logging.Log`, usando logger.info("inicio de sesión exitoso") para imprimir información como esta) Si desea usar marcadores de posición para formatear el mensaje, puede cambiar la clase `Log` a la clase `org.slf4j.Logger` y usar `org.slf4j.LoggerFactory` para obtener el objeto registrador (logger). Por ejemplo, podría modificar su código a lo siguiente:
 

De hecho, agregue dos oraciones en la clase de controlador:

registrador registrador final estático privado = LoggerFactory.getLogger(Query2Controller.class);

logger.info("Información de usuario: {}", usuario); //Comprobar si el objeto de usuario ha obtenido datos.

//Si aún desea probar si queryList obtiene datos, también puede escribirlo así.

package controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import po.User;
import service.Query2;

@Controller
@RequestMapping("/user")
public class Query2Controller {

    private static final Logger logger = LoggerFactory.getLogger(Query2Controller.class);
    @Autowired
    private Query2 query2;

    @RequestMapping("/input")
    public String input(Model model, User user){
        logger.info("User info: {}", user);
        model.addAttribute("query2",user);
        model.addAttribute("queryList",query2.query2list(user));
        return "query";
    }
}

Antes de agregar métodos, debe importar los paquetes de dependencia relevantes.

Y debido a que nuestro proyecto está configurado a través de log4j, el archivo genera información de registro, por lo que debemos vincular SLF4J y log4j.

Solo hay dos paquetes dependientes: un paquete dependiente de SLF4j, que coincide con la información de registro de salida anterior.

Una es enlazar el paquete de dependencias de log4j. Realice la salida de la información de registro en el archivo de configuración log4j.

使用`log4j`作为日志记录实现,您需要在应用程序的类路径中添加`SLF4J`到`log4j`的绑定库。您可以通过添加以下依赖项来实现这一点:
<!-- for Maven -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.32</version>
</dependency>

此外,您还需要在应用程序的类路径中添加`log4j`库。您可以通过添加以下依赖项来实现这一点:
<!-- for Maven -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

Finalmente, configure el archivo de configuración log4j,

Sin embargo, este archivo ya lo hemos agregado en mybatis study cuando creamos el proyecto.

Después de agregar dependencias, debe configurar `log4j` para especificar el comportamiento de registro. Puede crear un archivo llamado `log4j.properties` en el classpath de su aplicación y especificar allí la configuración de registro. Por ejemplo, puede agregar lo siguiente a su archivo de configuración:
# Configuración de registro global
log4j.rootLogger=DEBUG, stdout

# Salida de la consola...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

En el ejemplo anterior, configuramos un registrador de consola (agregador) llamado `stdout`, que envía información de registro a la consola. Puede cambiar la configuración según sea necesario.

El resultado es el siguiente:

información de usuario Esta información es la información del objeto de usuario que obtuvimos.

A través de la información de la consola, analicemos nuevamente:

Todo este proceso:

Primero ingrese al navegador: /usuario/input. Ingrese a la interfaz de entrada.

En este momento, se ejecutan dos model.addrbute y la información almacenada en el primer usuario es nula. La información almacenada en la primera lista de consultas también es nula. En este momento, la información que se muestra en la lista de consulta es nula, es decir, está vacía.

Luego proporcione estos datos a query.jsp

En query.jsp, envía la acción como /usuario/entrada. Continúa de regreso a esta interfaz de entrada.

En este momento, vuelva a ejecutar dos model.addrbute, pero la información almacenada en el primero contiene más información sobre el nombre. La información almacenada en la primera lista de consultas es un dato completo.

Finalmente, muestre la información de la lista de consultas.

Esta es la primera vez que el navegador accede a la información de entrada:

Esta es la segunda vez, en la interfaz de entrada, la información después de hacer clic en el botón: (acción:/entrada)

Finalmente, volviendo a la pregunta original. Envíelo a la capa de servicio a través del controlador y luego transfiéralo a la capa JSP.

La información JSP es devuelta por la capa de servicio: (la confusión inicial)

En el último proyecto SSM relativamente grande del libro, el método service.se devuelve a través de la capa del controlador. Luego, en el servicio, devuelve return ".jsp".

Esto es un poco diferente de lo que aprendimos al principio para devolver datos a través de la capa del controlador. devolver ".jsp"

La primera pregunta: el error es que el problema del hilo, de hecho, el verdadero problema no es este,

05-jul-2023 16:42:54.580 淇℃伅 [mysql-cj-abandoned-connection-cleanup] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Acceso ilegal: esta instancia de aplicación web ya se detuvo. No puede cargar []. El siguiente seguimiento de la pila se genera con fines de depuración, así como para intentar finalizar el subproceso que provocó el acceso ilegal.
    java.lang.IllegalStateException: acceso ilegal: esta instancia de aplicación web ya se ha detenido. No puede cargar []. El siguiente seguimiento de la pila se genera con fines de depuración, así como para intentar finalizar el subproceso que provocó el acceso ilegal.
 

Encuentre la ubicación del archivo. Resulta que mi archivo mybatis-context.xml está implementado. Está implementado en dao.userDao. Debería implementarse para especificar mybatis/UserMapper.xml

La segunda pregunta: el misterio sin resolver, el atributo del modelo pasado de la capa de servicio, en el JSP, no solicita obtener el atributo del modelo, pero aún se puede obtener el resultado final.

 

 

Comparemos los datos devueltos a JSP a través de la capa del controlador:

 

¿Cuál es la razón? Intente rastrear la salida a través del registro para ver cómo se pasa la información desde la capa de servicio a la capa de visualización.

En el archivo log4j, genere la siguiente información.

 

Finalmente, ingrese en la capa de servicio:

Los datos se pueden obtener en la consola. Tenga en cuenta que la transferencia de datos no es un problema.

Entonces, ¿por qué no se obtiene el indicador de atributo de modelo de JSP? ? ? Si no lo obtuvo, ¿cómo obtuvo el resultado final? ? ?

rompecabezas sin resolver 

Supongo que te gusta

Origin blog.csdn.net/qq_55928086/article/details/131547564
Recomendado
Clasificación