Arreglo de notas de estudio de JavaWeb (centro)

Pedido

contenido
  1. encabezado de solicitud
  2. Solicitar enfoque de parámetro
  3. Aspectos destacados funcionales del objeto de dominio
  4. enfoque de reenvío de solicitudes
  5. Otros métodos, obtener información del cliente, información relacionada con la URL...

solicitud como una función de un objeto de dominio

Sólo válido dentro de la misma solicitud

Cómo obtener encabezados de solicitud

Los métodos relacionados con el encabezado de la solicitud son:

  • String getHeader(String name): Obtener el encabezado de solicitud del nombre especificado;
  • Enumeración getHeaderNames(): Obtener todos los nombres de encabezado de solicitud;
  • int getIntHeader(String name): Obtener el encabezado de la solicitud cuyo valor es de tipo int.

Otros metodos

  • int getContentLength(): Obtenga el número de bytes en el cuerpo de la solicitud, la solicitud GET no tiene cuerpo de solicitud, ningún cuerpo de solicitud devuelve -1;
  • String getContentType(): obtenga el tipo de solicitud, si la solicitud es GET, este método devuelve nulo; si es una solicitud POST, el valor predeterminado es application/x-www-form-urlencoded, lo que indica que el contenido del cuerpo de la solicitud utiliza la codificación de URL;
  • String getMethod(): devuelve el método de solicitud, por ejemplo: GET
  • Locale getLocale(): Devuelve la configuración regional del navegador del cliente actual. java.util.Locale representa el país y el idioma, lo cual es útil en la internacionalización;
  • String getCharacterEncoding(): Obtenga la codificación de la solicitud, si no hay setCharacterEncoding(), luego devuelva nulo, lo que indica que se usa la codificación ISO-8859-1;
  • void setCharacterEncoding(String code): Establezca la codificación de la solicitud, ¡solo válida para el cuerpo de la solicitud! ¡Tenga en cuenta que para GET no hay cuerpo de solicitud! ! ! ¡Entonces este método solo es válido para los parámetros en la solicitud POST! enfocar
  • String getContextPath(): devuelve la ruta de contexto, por ejemplo: /hola
  • String getQueryString(): devuelva los parámetros en la URL de solicitud, por ejemplo: nombre = zhangSan
  • String getRequestURI(): Devuelve la ruta URI de la solicitud, por ejemplo: /hello/oneServlet
  • StringBuffer getRequestURL(): Devuelve la ruta de la URL de la solicitud, por ejemplo: http://localhost/hello/oneServlet, que devuelve la información de la ruta excepto los parámetros;
  • String getServletPath(): devuelve la ruta del Servlet, por ejemplo: /oneServlet
  • String getRemoteAddr(): devuelve la dirección IP del cliente actual;
  • String getRemoteHost(): devuelve el nombre de host del cliente actual, pero la implementación de este método aún obtiene la dirección IP;
  • String getScheme(): Devuelve el protocolo de solicitud, por ejemplo: http;
  • String getServerName(): devuelve el nombre del host, por ejemplo: localhost
  • int getServerPort(): devuelve el número de puerto del servidor, por ejemplo: 8080

solicitud de reenvío

Los recursos dinámicos (Servlet) saltan a otros recursos (Servlet, html, jsp...)

Reenviar texto

  1. RequestDispatcher getRequestDispatcher(String path) Obtener el objeto del transpondedor

  2. Llame al reenvío (solicitud, respuesta) del objeto RequestDispatcher

    RequestDispatcher.forward(solicitud,respuesta);

1 y 2 combinados:

request.getRequestDispatcher(String path).forward(request,response);

Funciones de reenvío:

  1. hacer solo una solicitud
  2. La url del cliente no cambiará
  3. El reenvío del lado del servidor solo se puede reenviar a los recursos internos del servidor
El campo de solicitud se usa generalmente en el reenvío de solicitudes

Obtener parámetros de solicitud

Método 1: String getParamter (String name) Obtenga un valor correspondiente a un nombre de parámetro de solicitud según el nombre

El primer caso: el front-end pasa el nombre del parámetro de solicitud y pasa el valor

Resultado: valor pasado

El segundo caso: el front-end pasa el nombre del parámetro de solicitud, sin pasar el valor nombre de usuario=&email=111

resultado: ""

El tercer caso: el front-end no pasa el nombre del parámetro de solicitud

resultado: nulo

Método 2: String[] getParameterValues(String name) Un nombre de parámetro de solicitud corresponde a múltiples valores Por ejemplo, obtenga el valor de una casilla de verificación
//一个请求参数名对应多个值
 String[] love = request.getParameterValues("hobbyArr");//获取爱好(复选框)
//数组转换为集合
 List<String> hobbyList = Arrays.asList(hobbyArr);
 System.out.println("love:"+loveList);
//数组转换集合 Arrays.asList(arr)
//asList()这个方法返回的ArrayList不是集合体系中的ArrayList,是一个内部类ArrayList ,是只读的
hobbyList.add("唱歌");//出错!!!!!!
La ArrayList devuelta por el método Arrays.asList() no es una ArrayList en el sistema de recopilación, sino una clase interna ArrayList, que es de solo lectura.
Método 3: Map<String,String[]> getParameterMap() Obtenga todos los parámetros de solicitud, obtenga un conjunto de mapas, generalmente combine el jar de terceros, convierta el mapa en un objeto java
Map<String, String[]> parameterMap = request.getParameterMap();
Recorrer la colección de mapas
1.先得到key集合 然后遍历key, 得到value  不推荐
2.得到EntrySet   Entry(key/value键值对)  推荐
Map<String, String[]> parameterMap = request.getParameterMap();
Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
for (Map.Entry<String, String[]> entry : entries) {
    
    
    System.out.println(entry.getKey() +"-->"+Arrays.asList(entry.getValue()));
}

Problemas de caché del navegador:

Modifique la página, cuando visita, la página no ha cambiado, puede ser un problema de caché del navegador

cromo: ctrl + F5 actualización subyacente

Respuesta

contenido

  1. establecer encabezado de respuesta
  2. enviar código de estado
  3. Establezca el cuerpo de la respuesta: obtenga el flujo de salida de la respuesta, la salida es importante
  4. la redirección es importante

establecer encabezado de respuesta

  • void setIntHeader(String name, int value) Establece el encabezado de respuesta, el valor del encabezado de respuesta es de tipo int
  • void addIntHeader (nombre de cadena, valor int)
  • void addHeader(String name,String value) Establece el encabezado de respuesta, el valor del encabezado de respuesta es String
  • void setHeader (nombre de cadena, valor de cadena)
  • void setContentType(String) establecer el encabezado de respuesta de tipo de contenido

Encabezados de respuesta importantes:

tipo de contenido: “texto/html;juego de caracteres=UTF-8”:

Dígale al navegador, el tipo de contenido de la respuesta del servidor, y el navegador lo analiza de acuerdo con el tipo de contenido

juego de caracteres: solo válido para archivos de texto

tipo de valor

text/html: texto html de respuesta

Imagen: Binario

  • imagen/gif: formato de imagen gif
  • imagen/jped: formato de imagen jpg
  • imagen/png: formato de imagen png

CSS:

texto/css

js:

texto/javascript

json:

aplicación/json

establecerOyente()

Enviar código de estado para entender

  • response.setStatus(200): establece el código de estado;
  • response.sendError(404, "El recurso que está buscando no existe"): cuando se envía un código de estado de error, Tomcat salta a una página de error fijo, pero puede mostrar un mensaje de error.

200: éxito

304: Adelante

404: El recurso no existe

405: método de solicitud no admitido

400: Solicitud fallida

500: error interno del servidor, se produjo una excepción en segundo plano

cuerpo de respuesta

flujo de salida a través de la respuesta

Flujo de salida de respuesta de caracteres: texto de salida de response.getWriter(), datos json

Secuencia de salida de respuesta de bytes: secuencia universal de respuesta, getOutputStream(), texto, archivo

Aviso:

Estos dos flujos no pueden coexistir y, si se usan al mismo tiempo, se lanzará una excepción java.lang.IllegalStateException.

Caso: imagen de respuesta del servidor

response.setContentType("image/gif");
//使用字节响应输出流  网络IO
ServletOutputStream outputStream = response.getOutputStream();

//服务器响应一张图片  图片位于服务器硬盘

//1.使用本地输入IO流   读取服务器硬盘图片   到服务器内存
FileInputStream fis = new FileInputStream("D:\\图片\\nbagif.gif");
int content = -1;  //变量, 内存
while((content = fis.read()) != -1){
    
    
    //2.再使用网络输出IO流, 把服务器内存的资源写到客户端
    outputStream.write(content);
}

redirigir

response.sendRedirect (ruta redirigida)

características;

  1. Dos solicitudes, el campo de solicitud no es válido
  2. La barra de direcciones del cliente cambia
  3. El salto ocurre en el lado del cliente.
  4. Saltar recursos: Pueden ser recursos internos del servidor (recursos que no pueden saltar al directorio WEB-INF), o recursos externos del servidor

Problemas de ruta de recursos de redirección y reenvío:

访问的项目名: /web
重定向到demo1.html
重定向的url写绝对路径:   直接写/ 表示忽略项目名
如果没有设置访问的项目名: 必须加 /项目名/资源路径
项目名 通过request.getContextPath()获取到
重定向的url: 统一的写: req.getContextPath()+"/资源路径"
resp.sendRedirect(req.getContextPath()+"/demo1.html");

 //转发
 // 转发的url, 有项目名,没有项目名, 都不需要加/项目名
 // 统一写法:  /资源路径req.getRequestDispatcher("/demo1.html").forward(req,resp);
camino redirigido
//req.getContextPath()+"/资源路径"
resp.sendRedirect(req.getContextPath()+"/demo1.html");

Procesamiento ilegible

El motivo de los caracteres ilegibles: la codificación del proyecto está unificada como UTF-8 y la codificación (publicación) de tomcat es ISO-8859-1

obtener solicitud, a través de url

Método de procesamiento:

  1. Tomcat comienza desde 8, maneja la codificación de solicitud de obtención, codificación predeterminada: UTF-8
  2. Tomcat7 o anterior, no manejó la codificación de codificación de solicitud Get o ISO-8859-1

    1. Especifique la codificación de solicitud de obtención en server.xml: UTF-8 (se puede configurar antes de Tomcat 7)
    <Connector URIEncoding= "UTF-8"  connectionTimeout= "20000"  port= "8888"  protocol= "HTTP/1.1"  redirectPort= "8443" />
    
    1. Válido para todos los servidores web, manejado por código
    //1.打散
    byte[] bytes = name.getBytes("UTF-8");
    //2.组装成字符串
    name = new String(bytes,"UTF-8");
    
Al recibir una solicitud: byte[] bytes = name.getBytes("UTF-8"); El valor depende de la versión de Tomcat. Tomcat7 era ISO-8859-1 antes

solicitud posterior, a través del cuerpo de la solicitud

request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");

Resumen de procesamiento de código distorsionado:

  1. Obtenga el código de solicitud: se procesó el tomcat8 anterior, no es necesario administrarlo
  2. codificación de solicitud posterior, solicitud de llamada.setCharacterEncoding("UTF-8");
  3. Configuración de codificación de respuesta: Codificación de respuesta (no distingue entre solicitudes de obtención o publicación) response.setContentType("text/html;charset=UTF-8");
  4. 2,3 El código son las dos primeras líneas de código como el servlet antes de obtener los parámetros y responder a los datos

Solo se puede acceder a una dirección IP de un determinado recurso una vez por hora

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        response.setContentType("text/html;charset=utf-8");
        ServletContext application  = this.getServletContext();
        Integer count = (Integer)application.getAttribute("count");
        HashMap<String,Long> map = (HashMap) application.getAttribute("map");
        if(map == null){
    
    
//            application.setAttribute("map",new HashMap<String,Long>()); 错误
            map = new HashMap<String,Long>();
        }
        if(count == null){
    
    
            count = 0;
        }
        String ip = request.getRemoteAddr();
        long visitTime = System.currentTimeMillis();
        if(!map.containsKey(ip)){
    
    
            map.put(ip,visitTime);
            count++;
        }else {
    
    
            if(System.currentTimeMillis()-map.get(ip)<3600000){
    
    
                response.getWriter().println("刚刚来过啦,过会再来吧~");
            }else {
    
    
                map.put(ip,System.currentTimeMillis());
                count++;
            }
        }
        response.getWriter().print("<h1>本页面一共被访问" + count + "次!</h1>");
        application.setAttribute("count", count);
        application.setAttribute("map",map);
}

JSP

JSP

Esencialmente una clase Java Servlet

jsp es un recurso dinámico que contiene Java script y html, al que los navegadores no pueden acceder directamente

Cuando el navegador solicita jsp, el servidor web necesita ejecutar el código jsp, el resultado después de la ejecución se convierte en html estático y la respuesta se envía al navegador.

secuencia de comandos JSP

  • <%...%>: El código que se puede escribir en el método java se puede escribir en él
  • <%=…%>: expresión, el resultado de la expresión se muestra en la página
  • <%!..%>: Java define miembros de clase, define atributos, define métodos
jsp es esencialmente equivalente a una clase Servlet Java

directiva JSP

Nueve objetos incorporados de jsp: preguntas de la entrevista

Objetos incorporados: no es necesario crearlos, se pueden usar directamente

Cuatro objetos de dominio: pageContext, solicitud, sesión, aplicación

Objeto de respuesta: respuesta

Objeto de flujo de respuesta: fuera

Objeto de configuración: config

Indica esto: página

objeto de excepción: excepción

Cookie de sesión de tecnología de seguimiento de sesión

http no tiene estado, el servidor no puede distinguir si la solicitud del navegador proviene del mismo navegador

Características de las cookies:

Creada en el servidor, guardada en el navegador del cliente y después de cada solicitud, la cookie almacenada en el navegador del cliente en el servidor se devolverá al servidor a través del encabezado de la solicitud.

Escenario de uso: nombre de usuario, contraseña guardada en la cookie (recordar contraseña)

Proporcionar método: getName() getValue()

Caso: recordar contraseña

Cuando el usuario inicie sesión en la página, verifique que recuerde la contraseña, inicie sesión y, una vez que el inicio de sesión sea exitoso, vuelva a iniciar sesión la próxima vez y muestre el nombre de usuario y la contraseña del último inicio de sesión

Ideas:

Servlet de inicio de sesión:

  1. Determinar si el inicio de sesión es exitoso
  2. Después de un inicio de sesión exitoso, determine si desea marcar "Recordarme"
  3. Si está marcado, guarde el nombre de usuario y la contraseña en la cookie,
  4. Si no está marcado: Determinar si existe una cookie para el nombre de usuario y la contraseña, y en caso afirmativo eliminarla

iniciar sesión.jsp:

El valor del formulario de nombre de usuario y contraseña obtiene el valor de la cookie y lo muestra dinámicamente

<%= %> Contenido de salida a la página: Desventaja: si el contenido es nulo, también se mostrará en la página

Reemplace <%= %>, use expresiones EL: ${域中的属性名}obtenga datos de todo el dominio

${域中的属性名}Búsqueda mundial:

​ Primero busque desde el dominio de la página, si lo encuentra, regrese directamente

Si no lo encuentra, busque desde la solicitud, si lo encuentra, regrese directamente

​ Si no lo encuentra, busque desde la sesión, si lo encuentra, regrese directamente

Si no lo encuentra, busque desde la aplicación, si lo encuentra, regrese directamente

Si no se encuentra: devuelve nulo directamente

Si el resultado de la expresión el es nulo, no se mostrará en la página

Las expresiones EL admiten el lenguaje de navegación de objetos:${对象.属性名..}

**Premisa: **Los objetos de usuario se almacenan en el dominio

cookie de operación java:

En el lado del servidor: Crear cookie: método de construcción Cookie (nombre de cadena, valor de cadena)

El método de guardar para el cliente: el método del objeto de respuesta: addCookie(Cookie)

Si no hay addCookie(), la cookie no se guardará en el cliente

El servidor obtiene la cookie:

La cookie se pasa al servidor a través del encabezado de la solicitud:

Cookie[] getCookies() del objeto de solicitud

Detalles de las cookies

  1. Antigüedad máxima de cookies

    max-age: setMaxAge(int) de la cookie tiempo máximo de supervivencia de la cookie

    Valor predeterminado: -1 Sobrevivir en la sesión, abrir el navegador para cerrar el navegador, llamado sesión

    > 0Valor de supervivencia de la cookie (segundos) tiempo, cuando se acabe el tiempo, el navegador eliminará la cookie

    0: eliminar la cookie inmediatamente

  2. camino de la galleta

    Establecer la ruta de la cookie, restringiendo esos recursos para permitir el acceso

    Se puede acceder a las cookies en el directorio principal del recurso

    Se puede acceder a la cookie del directorio de nivel superior del recurso

    Se puede acceder a las cookies bajo el directorio /.

    La ruta de la cookie se establece en /, lo que indica que todos los recursos de este proyecto pueden acceder a la cookie.

  3. Modificar el valor de la cookie

    Llamar al setValue() de la cookie

    Modificación sigilosa:

    Cookie c2 = nueva cookie ("nombre", "wangwu")

    Si el navegador del cliente tiene una cookie con la clave y la ruta es la misma, modifique el valor de la cookie

    Si la cookie de la clave no existe en el navegador del cliente, agregue

    Si la cookie de la clave existe en el navegador del cliente, pero la ruta es diferente, agregue

Almacenamiento de cookies chino:

Se puede almacenar después de tomcat7, no hay necesidad de considerar

Para tomcat7 y versiones anteriores, las cookies no pueden almacenar chino, y el chino debe estar codificado en URL

UTF-8: chino (que representa 3 bytes): % hexadecimal de dos dígitos % hexadecimal de dos dígitos % hexadecimal de dos dígitos

String str ="中国";  
//URL编码
String str1 = URLEncoder.encode(str, "UTF-8");
System.out.println(str1);//%E4%B8%AD%E5%9B%BD

//URL解码
String str2 = URLDecoder.decode(str1, "UTF-8");
System.out.println(str2);//中国
Para Tomcat8 y versiones posteriores, las cookies admiten chino, si hay símbolos especiales, no se pueden almacenar y se utiliza la codificación de URL

Sesión Http

efecto principal:

Realice el intercambio de datos entre múltiples solicitudes en una sesión

El alcance de una sesión:

Desde abrir el navegador para acceder al servidor, hasta cerrar el navegador

sesión de uso

1. Obtenga el objeto HttpSession request.getSession(); request.getSession(boolean)

getSession (): si la solicitud actual tiene una sesión, devuelve el objeto de la sesión de solicitud actual, si no, crea un nuevo objeto de sesión

getSession(creación booleana):

verdadero: Igual que getSession(),

falso: si la solicitud actual tiene una sesión, devuelve el objeto de la sesión de solicitud actual, si no, devuelve nulo

2. Eliminar la invalidación de la sesión ()

Hacer que la sesión no sea válida, la sesión no es válida y los datos almacenados en la sesión no son válidos

3. Establezca el tiempo máximo de supervivencia de la sesión void setMaxInactiveInterval(intervalo int) unidad: segundo

Tiempo de almacenamiento predeterminado de la sesión:

30 minutos, más de 30 minutos desde la última solicitud hasta la siguiente solicitud, el servidor elimina la sesión ( Tomcat mantiene un grupo de sesiones )

Características de la sesión

Creado en el servidor, guardado en el servidor

Preguntas de la entrevista sobre el principio de implementación de la sesión

El servidor creará un objeto de sesión para el usuario y guardará el ID de sesión en forma de cookie en el navegador del cliente. Cada vez que el usuario realice una solicitud, la cookie (JSESSIONID) se devolverá automáticamente al servidor. El servidor hará coincidir el objeto de sesión correspondiente en el grupo de sesiones de acuerdo con el ID de sesión. El servidor sabe de qué sesión proviene la solicitud actual (desde qué navegador),

Si se elimina la cookie del cliente, la solicitud no incluirá JSessionId, y el servidor no sabrá qué sesión pertenece a este usuario (navegador). Nadie puede acceder a la sesión anterior creada para este usuario. Es basura. El servidor elimina esta sesión después de 30 minutos de forma predeterminada.

Si el servidor elimina la sesión, incluso si el cliente tiene una cookie JSessionid, la sesión no se puede obtener, el servidor volverá a crear la sesión para el navegador y guardará la nueva ID de sesión en forma de cookie para el cliente.

Caso: cerrar sesión

1. Haga clic en el botón de cierre de sesión para enviar una solicitud a LogoutServlet

2. Deja que la sesión falle

3. Redirigir a login.jsp

Caso: Realización de Código de Verificación

El servidor que genera el código de verificación almacena previamente el código de verificación generado en la sesión

request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);

1. El usuario completa el código de verificación, hace clic para iniciar sesión y envía una solicitud de inicio de sesión a LoginServlet

2. Determinar si el código de verificación es correcto

3. Incorrecto: responda directamente a "Error de código de verificación" y reenvíe a login.jsp

4. Correcto: Redirigir a index.jsp

Caso: haga clic para actualizar el código de verificación

<a href="javascript:;" onclick="refreshCode()" >
    <img src="${pageContext.request.contextPath}/checkCodeServlet" title="看不清点击刷新" id="vcode"/>
</a>


另一种写法
<a href="javascript:refreshCode();">
    <img src="${pageContext.request.contextPath}/checkCodeServlet" title="看不清点击刷新" id="vcode"/>
</a>
点击a标签后调用函数,点击a标签触发href里的地址,执行js
//切换验证码
function refreshCode(){
    
    
    //1.获取验证码图片对象
    var vcode = document.getElementById("vcode");

    //2.设置其src属性,加时间戳
    vcode.src = "${pageContext.request.contextPath}/checkCodeServlet?time="+new Date().getTime();
}

Por qué sello de tiempo

Para evitar el almacenamiento en caché del navegador, si la barra de direcciones no cambia, el servidor pensará que no se ha iniciado una nueva solicitud y el último recurso se mostrará a través del caché y el código de verificación no se actualizará.

MVC

MVC es un **patrón de arquitectura de software**, este patrón divide el proyecto en tres módulos principales:

M : modelo modelo capa: pojo, dao

C : capa de control del controlador: Servlet

V : ver capa de vista: jsp, html

No se puede acceder directamente a la capa de vista y la capa de modelo en Java

desarrollo web java

El modelo clásico de tres niveles, el concepto jerárquico de las clases java

El rol de recibir solicitudes de usuarios: capa web

El papel del procesamiento de la lógica empresarial: capa de servicio

El papel de comunicarse con la base de datos: capa dao

Propósito de capas: Aislamiento de tecnología

Por ejemplo, la tecnología utilizada en la capa dao solo puede existir en la capa dao y no puede extenderse a otros

Beneficios: cuando el proyecto se expande, es necesario reemplazar la tecnología de una determinada capa, solo esta capa debe reemplazarse y otras capas no necesitan cambiarse

Precauciones:
  1. Llamada de capa cruzada, secuencia de llamada: llamada de capa web -> llamada de capa de servicio -> capa dao
  2. Solo la capa superior puede llamar a la capa inferior , la web puede llamar al servicio y el servicio puede llamar al dao, y la capa inferior no puede llamar a la capa superior
  3. Aislamiento de interfaz de uso de capa y capa, servicio: proporcionar interfaz, permitir uso web, dao capa proporcionar interfaz, permitir uso de servicio

Etiquetas JSTL (entender)

**Función: **Reemplaza el script Java, generalmente usado junto con expresiones EL

Ejecute en el lado del servidor y responda al navegador del cliente con el resultado después de la ejecución de jstl, y la etiqueta JSTL se ejecuta antes que la etiqueta Html

Pasos para el uso:

1. Importar dependencias que admitan JSTL

2. En la página jsp usando la etiqueta jstl, use el comando taglib para importar la biblioteca de etiquetas

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

prefijo: prefijo, nombre arbitrario, nombre estándar: c (biblioteca de etiquetas principales): Por ejemplo: <c:div>use prefijo para distinguir etiquetas html

Todos los nombres de etiquetas del núcleo:<c:标签名>

uri: url correspondiente a la etiqueta jstl, método de escritura fijo, importar biblioteca de etiquetas jstl, elegir biblioteca de etiquetas jsp/jstl

3. Usa etiquetas JSTL

Etiquetas JSTL comunes

(1) <c:si prueba="condición"></c:if>>

(sin más etiquetas, sin más etiquetas if)

(2) elegir etiqueta
<c:choose>
      <c:when test="${score >= 90}">
          <p>优秀</p>
      </c:when>
      <c:when test="${score >= 80}">
          <p>良好</p>
      </c:when>
      <c:when test="${score >= 60}">
          <p>及格</p>
      </c:when>
      <c:otherwise>
          <p>不及格</p>
      </c:otherwise>
  </c:choose>
(3) etiqueta foreach: bucle for

para mi

<c:forEach var="i" begin="0" end="9" step="2">
      <h1>${i}</h1>
 </c:forEach>

Bucle for mejorado:

<c:forEach var="admin" items="${admins}">
    <tr>
        <th>${admin.id}</th>
        <th>${admin.username}</th>
        <th>${admin.password}</th>
    </tr>
</c:forEach>
El bucle forEach tiene un varStatus="variable" para obtener el objeto de estado del bucle del bucle for

La etiqueta forEach también tiene un atributo: varStatus, que se usa para especificar el nombre de la variable que recibe el "estado del ciclo ", por ejemplo: <forEach varStatus="vs" .../>, luego puede usar la variable vs para obtener el estado del ciclo.

El valor de vs puede ser:

  • count: tipo int, el número de elementos (número de serie) que se han recorrido actualmente; el número de ciclos, a partir de 1
  • índice: tipo int, el subíndice del elemento actual; a partir de 0
  • primero: tipo booleano, si es el primer elemento;
  • last: tipo booleano, si es el último elemento;

Supongo que te gusta

Origin blog.csdn.net/m0_48895748/article/details/127728805
Recomendado
Clasificación