Javaweb Nota 5: JSP

JSP

El nombre completo de JSP es Java Server Pages, que es una tecnología de desarrollo web dinámico. Utiliza etiquetas JSP para insertar código Java en páginas web HTML. Las etiquetas generalmente comienzan con <% y terminan con %>.

JSP es un servlet de Java que se utiliza principalmente para implementar la parte de la interfaz de usuario de las aplicaciones web de Java. Los desarrolladores web escriben JSP combinando código HTML e incorporando acciones y comandos JSP.

JSP obtiene datos de entrada del usuario a través de formularios web, accede a bases de datos y otras fuentes de datos y luego crea dinámicamente páginas web.

Las etiquetas JSP tienen múltiples funciones, como acceder a bases de datos, registrar información de selección de usuarios, acceder a componentes de JavaBeans, etc., y también pueden transmitir información de control y compartir información en diferentes páginas web.

Sin JSP, solo use servlet para generar la página web

response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
//动态的响应html页面
writer.write("<!DOCTYPE html>");
writer.write("<html>");
writer.write("<head>");
writer.write("<meta charset='UTF-8'>");
writer.write("<title>Insert title here</title>");
writer.write("</head>");
writer.write("<body>");
writer.write("<h1>这个页面很繁琐</h1>");
writer.write("</body>");
writer.write("</html>"); 

Los servlets aparecieron primero, y cuando solo había servlets, los servlets tenían que procesar la lógica y generar html. Por ejemplo, el método de implementación anterior es muy engorroso y el código es difícil de mantener, por lo que se introduce la tecnología jsp. JSP puede escribir o modificar fácilmente páginas HTML sin tener que enfrentarse a una gran cantidad de sentencias println.

secuencia de comandos jsp

<%java代码%>El código java interno se traduce al interior del método de servicio.

<%=java变量或表达式>Se traducirá al método de servicio internal out.print()

<%!java代码%>se traducirá al contenido de los miembros del servlet

comentarios jsp

Diferentes anotaciones tienen diferentes rangos visibles

Comentarios html: <!--注释内容-->código fuente jsp de rango visible, servlet traducido, código fuente html de visualización de página

comentario de java: //单行注释 /*多行注释*/código fuente jsp de alcance visible, servlet traducido

comentario jsp: <%--注释内容--%>el código fuente jsp de rango visible es visible

Html注释<%--<div></div>--%>java注释
    <%
      //int i=10;
      /*System.out.print(i);*/
    %>jsp注释
    <%--
     int i=10;
      /*System.out.print(i);*/
    --%>

principio de funcionamiento jsp

La esencia de jsp es servlet.Cuando se accede a jsp por primera vez, el contenedor web lo traducirá a servlet y luego lo ejecutará. Proceso: primera visita ---->helloServlet.jsp---->helloServlet_jsp.java---->compilar y ejecutar. El servlet traducido se puede encontrar en el directorio de trabajo de Tomcat.

La asignación se configura en web.xml en tomcat.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

instrucción jsp (3)

El comando de jsp es el comando para guiar la traducción y operación de jsp. jsp incluye tres comandos principales:

1. instrucción de página: la instrucción con la mayoría de los atributos (la instrucción de página predeterminada está bien en el desarrollo real), de acuerdo con diferentes atributos, guía las características de toda la página. Formato: <%@ page 属性名1= "属性值1" 属性名2= "属性值2" ...%>, los atributos comunes son los siguientes:

  • idioma: los tipos de idioma que se pueden incrustar en el script jsp
  • pageEncoding: la codificación del propio archivo jsp actual, que puede contener contentType
  • contentType:respuesta.setContentType(text/html;charset=UTF-8)
  • sesión: si jsp crea automáticamente una sesión al traducir, el valor predeterminado es verdadero
  • importar: importar paquete java
  • errorPage: a qué página saltar cuando la página actual tiene un error
  • isErrorPage: la página actual es una página de manejo de errores
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

2. instrucción de inclusión: la página incluye instrucciones (incluidas estáticamente), que pueden incluir una página jsp en otra página jsp, formato:

<%@ include file="被包含的文件地址"%>

3. instrucción taglib: importar biblioteca de etiquetas (biblioteca de etiquetas jstl, biblioteca de etiquetas struts2) en la página jsp, formato:

<%@ taglib uri="标签库地址" prefix="前缀"%>

jsp incorporado/objetos implícitos (9)

Después de que jsp se traduce a un servlet, hay 9 objetos definidos e inicializados en el método de servicio.Podemos usar estos 9 objetos directamente en el script jsp.
inserte la descripción de la imagen aquí

fuera de objeto

El tipo de salida: JspWriter, la función de salida es enviar contenido al cliente, utilizando out.write(), el búfer de salida es de 8 kb de forma predeterminada y se puede establecer en 0, lo que significa que el búfer de salida está cerrado, y el contenido se escribe directamente en el búfer de respuesta.
inserte la descripción de la imagen aquí
El búfer de salida finalmente se vaciará al búfer de respuesta, por lo que el contenido de response.getWrite().write() se mostrará primero.

objeto pageContext

El objeto de contexto de la página jsp, el objeto de página y el objeto pageContext no son lo mismo, las funciones son las siguientes:

1. pageContext es un objeto de dominio que es válido dentro de la página actual.

setAttribute(String name,Object obj)
getAttribute(String name)
removeAttrbute(String name)

2. pageContext puede acceder a los datos de otros dominios especificados

setAttribute(String name,Object obj,int scope)
getAttribute(String name,int scope)
removeAttrbute(String name,int scope)
findAttribute(String name)

Obtenga atributos del dominio pageContext, el dominio de solicitud, el dominio de sesión y el dominio de aplicación a su vez, y no buscará hacia atrás después de obtenerlos en un dominio determinado.

//使用pageContext向request域存数据
//request.setAttribute("name", "zhangsan");
//pageContext.setAttribute("name", "sunba");
//pageContext.setAttribute("name", "lisi", PageContext.REQUEST_SCOPE);
//pageContext.setAttribute("name", "wangwu", PageContext.SESSION_SCOPE);
//pageContext.setAttribute("name", "tianqi", PageContext.APPLICATION_SCOPE);
<%=request.getAttribute("name") %>
    <%=pageContext.getAttribute("name", PageContext.REQUEST_SCOPE)%>
    
    <!-- findAttribute会从小到大搜索域的范围中的name -->
    <!-- page域<request域<session域<application域 -->
    <%=pageContext.findAttribute("name") %>

3. Puedes obtener otros 8 objetos implícitos

pageContext.getRequest();
pageContext.getOut();

Resumen de los cuatro alcances

  • dominio de página: rango de página jsp actual
  • campo de solicitud: una solicitud
  • dominio de sesión: una sesión
  • dominio de la aplicación: toda la aplicación web

etiqueta jsp (acción)

1) Inclusión de página (inclusión dinámica): <jsp:include page="included page" />, ¿cuál es la diferencia entre inclusión estática e inclusión dinámica?
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Analizar principalmente a partir de los siguientes cinco aspectos (fuente):

  1. Sintaxis:
    Incluye estática: <%@ include file=""%>
    Incluye dinámica: <jsp: include page=""%>

  2. Cuando se incluye estáticamente, el html.head, el cuerpo y otras etiquetas en la página contenedora y la página incluida solo aparecen una vez en total; de lo contrario, se informará un error, mientras que la inclusión dinámica no lo hará.

  3. La inclusión estática no verifica los cambios en los archivos incluidos, pero la inclusión dinámica puede verificar los cambios en los archivos incluidos y puede tomar parámetros.

  4. La inclusión estática consiste en importar primero el contenido del archivo en el archivo incluido, luego compilarlo y finalmente mostrárselo al usuario (incluir primero y luego compilar)

  5. La inclusión dinámica puede distinguir automáticamente si el archivo incluido es estático o dinámico, si es estático, se procesará de la misma manera que la inclusión estática, si es una página dinámica, se puede procesar dinámicamente antes de incluir el resultado
    . (compilar primero y luego incluir)

2) Solicitud de reenvío: <jsp:forward page="Recursos a reenviar" />

Escribir código java en jsp:

<%
            //获得集合List<Product>
            List<Product> productList = (List<Product>)request.getAttribute("productList");
            if(productList!=null){
    
    
                for(Product product : productList){
    
    
                    out.write("<div class='col-md-2' style='height:250px'>");
                    out.write("<a href='product_info.htm'>");
                    out.write("<img src='"+product.getPimage()+"' width='170' height='170' style='display: inline-block;'>");
                    out.write("</a>");
                    out.write("<p><a href='product_info.html' style='color: green'>"+product.getPname()+"</a></p>");
                    out.write("<p><font color='#FF0000'>商城价:¥"+product.getShop_price()+"</font></p>");
                    out.write("</div>");
                }
            }
        %>

tecnología EL

Las expresiones EL (Express Language) se pueden incrustar en páginas jsp para reducir la escritura de scripts jsp. El propósito de EL es reemplazar la escritura de scripts en páginas jsp.

EL obtiene datos del dominio

La función principal de EL es obtener los datos en los cuatro dominios principales, el formato ${EL expresión}

EL obtiene el valor en el campo pageContext: (page Context Scope. key), EL obtiene el valor en el campo de solicitud: (pageContextScope.key), EL obtiene el valor en el campo de solicitud:( p á gina C o n t e x t o Ámbito . clave ) ; _ _ _ _ _ _E L obtiene el valor en el campo de solicitud : (request.key), EL obtiene el
valor en el campo de sesión:( session . key ), EL obtiene el valor en el campo de solicitud : ( session.key ); EL obtiene el valor en el campo de aplicación:( clave de sesión ) ; _ _ _ _ _ _ _ _EL obtiene el valor en el campo aplicación : ( aplicación.clave ); EL
obtiene un valor determinado $(clave) de los cuatro campos; también del campo pageContext
y el campo de solicitud a su vez , dominio de sesión, dominio de aplicación para obtener atributos, después de obtener en un determinado dominio no mirará hacia atrás.

Ejemplo:

  1. EL obtener cadena normal

  2. EL obtiene el valor del objeto Usuario

  3. EL obtiene el valor de List

  4. EL obtiene el valor de List

  5. EL obtiene el valor de Map<String, String>

  6. EL obtiene el valor de Map<String, User>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.itheima.domain.*" %>
<%@ page import="java.util.*" %>
<!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>Insert title here</title>
</head>
<body>
    <!-- 模拟域中的数据 -->
    <%
        pageContext.setAttribute("company", "阿里");
    
        //存储字符串
        request.setAttribute("company", "企鹅");
    
        //存储一个对象
        User user = new User();
        user.setId(1);
        user.setName("zhangsan");
        user.setPassword("123");
        session.setAttribute("user", user);
        
        //存储一个集合
        List<User> list = new ArrayList<User>();
        User user1 = new User();
        user1.setId(2);
        user1.setName("lisi");
        user1.setPassword("123");
        list.add(user1);
        User user2 = new User();
        user2.setId(3);
        user2.setName("wangwu");
        user2.setPassword("123");
        list.add(user2);
        application.setAttribute("list", list);
        
    %>
    
    
    <!-- 脚本法是取出域中的值 -->
    <%=request.getAttribute("company") %>
    <%
        User sessionUser = (User)session.getAttribute("user");
        out.write(sessionUser.getName());
    %>
    <hr/>
    <!-- 使用EL表达式获得域中的值 -->
    ${
    
    requestScope.company }
    ${
    
    sessionScope.user.name }
    ${
    
    applicationScope.list[1].name}
    
    <!-- 使用el表达式 全域查找 -->
    ${
    
    company }
    ${
    
    user.name }
    ${
    
    list[1].name}
    
    <!-- el可以执行表达式运算 -->
    ${
    
    1+1 }
    ${
    
    1==1?true:false }
    <!-- empty 判定某个对象是否是nullnull返回true -->
    ${
    
    empty list}
    
    
</body>
</html>

Objetos incorporados de EL (nueve)

pageScope, requestScope, sessionScope, applicationScope;

Obtener datos en dominio en JSP

Parámetros de recepción: param, paramValues;

Obtener información del encabezado de la solicitud: encabezado, valores de encabezado;

Obtener parámetros de inicialización globales: initParam;

cookie en desarrollo WEB: cookie;

pageContext en desarrollo WEB: pageContext;

ejemplo:

<!-- 获得表单的参数 -->
    <%
        request.getParameter("username");
    %>
    
    <!-- 使用el获得参数 -->
    ${
    
    param.username }
    ${
    
    header["User-Agent"] }
    ${
    
    initParam.aaa }
    ${
    
    cookie.name.value }        ${
    
    cookie.abc.value }
<!-- 通过el表达式获得request对象 --> ${
    
    pageContext.request }与${
    
    requestScope}不同,对象不仅包含域,而且还有其他数据和方法<!--获得WEB应用的名称-->$(pageContext.request.contextPath)相当于<%=pageContext.getRequest().getContextPath%>

Tecnología JSTL

JSTL (Biblioteca de etiquetas estándar JSP), la biblioteca de etiquetas estándar JSP, se puede incrustar en páginas jsp para completar la lógica empresarial y otras funciones en forma de etiquetas. El propósito de jstl es el mismo que el de reemplazar el código del script en la página jsp. La biblioteca de etiquetas estándar estándar JSTL tiene 5 sub-bibliotecas, pero con el desarrollo, su biblioteca principal se usa a menudo en la actualidad.
inserte la descripción de la imagen aquí

Descarga e importación de JSTL

Descarga de JSTL: descargue el paquete JSTL JAR del sitio web de Apache. Vaya a "http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/" para descargar el paquete de instalación de JSTL. jakarta-taglibs-standard-1.1.2.zip, y luego descomprima el paquete de instalación JSTL descargado.En este momento, puede ver dos archivos JAR en el directorio lib, a saber, jstl.jar y standard.jar. Entre ellos, el archivo jstl.jar contiene las interfaces y las clases relacionadas definidas en la especificación JSTL, y el archivo standard.jar contiene los archivos .class utilizados para implementar JSTL y cinco archivos descriptores de biblioteca de etiquetas (TLD) en JSTL.

Importe los dos paquetes jar a la biblioteca de nuestro proyecto e importe:
inserte la descripción de la imagen aquí
3. Etiquetas comunes de la biblioteca central JSTL

1. Etiqueta <c:si>

<!-- 用户没有登录 -->
<c:if test="${empty user}">
    <li><a href="login.jsp">登录</a></li>
    <li><a href="register.jsp">注册</a></li>
</c:if>
<!-- 用户已经登录 -->
<c:if test="${!empty user}">
    <li>${
    
    user.name }</li>
    <li><a href="#">提出</a></li>
</c:if>

2. Etiqueta <c:paraCada>

Hay dos combinaciones de uso:

Método 1:
inserte la descripción de la imagen aquí
Método 2:

<h1>取出strList的数据</h1>
    <c:forEach items="${strList }" var="str">
        ${
    
    str }<br/>
    </c:forEach>
    
    <h1>取出userList的数据</h1>
    <c:forEach items="${userList}" var="user">
        user的name:${
    
    user.name }------user的password:${
    
    user.password }<br/>
    </c:forEach>
    
    <h1>取出strMap的数据</h1>
    <c:forEach items="${strMap }" var="entry">
        ${
    
    entry.key }====${
    
    entry.value }<br/>
    </c:forEach>
    
    <h1>取出userMap的数据</h1>
    <c:forEach items="${userMap }" var="entry">
        ${
    
    entry.key }:${
    
    entry.value.name }--${
    
    entry.value.password }<br/>
    </c:forEach>

Referencias: 1. https://www.cnblogs.com/ginb/p/7231700.html

Supongo que te gusta

Origin blog.csdn.net/weixin_42838061/article/details/121175940
Recomendado
Clasificación