Desarrollo JavaWeb - Tecnología JSP

Capítulo Cuatro: Tecnología JSP


Tabla de contenido

1. Introducción a JSP


Introducción a JSP

JSP (nombre completo Java Server Pages) La tecnología de páginas de servidor Java es una especificación técnica bajo la plataforma JavaEE. Permite que se utilicen etiquetas específicas para insertar códigos Java en páginas web HTML para realizar el procesamiento dinámico de páginas, por lo que JSP es un complejo de códigos HTML y Java. La tecnología JSP puede implementar rápidamente el desarrollo de una página, lo que será más fácil que implementar el desarrollo de una página en Servlet.

Técnicas comunes de capa de vista

HTML, JSP, Thymeleaf, etc.

Métodos de desarrollo separados front-end y back-end

En proyectos donde se separan los front-end y back-end, es realmente posible lograr una "especialización en tecnología" (separación de desarrolladores). En el método de desarrollo de separación de front-end y back-end, la página de front-end es desarrollada por un equipo profesional, y la interfaz API del back-end se llama a través de la solicitud de interacción de datos. En el equipo de desarrollo de páginas front-end se debe prestar más atención a tecnologías como: html, CSS, jQuery, Vue, Nodejs y otras tecnologías front-end. Lo que persigue el front end son: rendimiento de la página, fluidez de velocidad, compatibilidad, experiencia de usuario, etc. El equipo de back-end se trata más de la realización específica del negocio. En el equipo de desarrollo de back-end, se debe prestar más atención a tecnologías como: patrones de diseño, arquitectura distribuida, arquitectura de microservicios, operaciones de bases de datos, optimización del rendimiento de Java y tecnologías de optimización de bases de datos. La separación de front-end y back-end se ha convertido en el método de uso estándar de la industria para el desarrollo de proyectos de Internet, especialmente para arquitectura distribuida a gran escala, arquitectura de computación elástica, arquitectura de microservicios, servicios de terminales múltiples (clientes múltiples, como navegadores, terminales de vehículos). , Android, etc.) sientan una base sólida.

Dos, principio operativo JSP

inserte la descripción de la imagen aquí

Características técnicas JSP

JSP y Servlet son esencialmente la misma tecnología. Cuando se solicita un archivo JSP por primera vez, el motor JSP compilará el JSP en un Servlet y ejecutará el Servlet. Si se modifica el archivo JSP, el motor JSP volverá a compilar el JSP.
Cuando el motor JSP compila JSP, generará dos archivos, que son el archivo fuente .java y el archivo .class compilado, y los colocará en el directorio org\apache\jsp en el directorio de host virtual correspondiente a Catalina en el directorio de trabajo de Tomcat. Los nombres de los dos archivos usarán el nombre del JSP más "_jsp". Tales como: index_jsp.java, index_jsp.class

La diferencia entre JSP y Servlet

Los JSP se implementan en el contenedor como archivos de origen. El servlet debe compilarse en un archivo de clase y luego implementarse en el contenedor.
JSP se implementa en el directorio raíz del proyecto web u otros subdirectorios del directorio raíz se encuentran en la misma ubicación que los recursos estáticos. El servlet debe implementarse en el directorio WEB-INF/classes.
El motor JSP colocará el código HTML en el JSP en el método out.write() del Servlet. En Servlet, necesitamos generar una página de respuesta operando en el flujo de salida del flujo de caracteres.
JSP es mejor para mostrar páginas y Servlet es mejor para el control lógico.

Tercero, el uso de etiquetas JSP

inserte la descripción de la imagen aquí

Tres etiquetas originales de JSP

La etiqueta original de JSP se puede utilizar en cualquier versión de JSP.

Etiqueta de declaración <%! %>

Las etiquetas de declaración se utilizan para definir variables miembro y definiciones de métodos en JSP. El contenido de la etiqueta aparecerá en {} de la clase Servlet después de compilar el JSP.
Ejemplo de código:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  Welcome JSP!
  <%!
      int a = 10;
      int add(int a,int b){
    
    
        return a+b;
      }
  %>  //声明标签
  <%
    int c = 20;
  %>
  <%=a %>
  <%=c %>
  </body>
</html>

etiqueta de secuencia de comandos <% %>

Las etiquetas de script se utilizan para escribir la lógica empresarial en JSP. El contenido de la etiqueta aparecerá en el cuerpo del método _jspService del Servlet después de compilar el JSP.

Etiqueta de asignación <%= %>

Las etiquetas de asignación se utilizan para la salida de contenido en JSP. El contenido de la etiqueta aparecerá en los parámetros del método out.print() del método _jspService.
Nota: No es necesario agregar ";" en el código al usar la etiqueta de asignación.

Uso de etiquetas sin formato JSP

Hacer un juicio aleatorio simple

Requisitos: Muestre "Ir a acariciar al gato" con una probabilidad del 20%, "Continúe aprendiendo felizmente" con una probabilidad del 80% y muestre el número aleatorio correspondiente al mismo tiempo.

<%@ page import="java.util.Random" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        int flag = new Random().nextInt(100)+1;
        if(flag <= 20){
    
    
    %>
    去撸猫 <%= flag%>
    <%}else{
    
    %>
        继续快乐学习 <%= flag%>
    <%}%>
</body>
</html>

Etiqueta de instrucción JSP

La función de la etiqueta de instrucción JSP es declarar algunos atributos y acciones de la página JSP.
Formato: <%@nombre de comando atributo = "valor" atributo = "valor 1, valor 2..." %>

Clasificación de las etiquetas de instrucción JSP

inserte la descripción de la imagen aquí

Etiqueta de directiva de página

contentType : establezca el tipo de respuesta y la codificación.

pageEncoding : establece la codificación de la página.

import : importa los paquetes requeridos.

language : El idioma que se puede anidar en la página JSP actual.

sesión : establece si la página JSP obtiene el objeto integrado de la sesión.

buffer : establece el tamaño del búfer del flujo de la página JSP.

autoFlush : si actualizar automáticamente.

exends : Declara que la página JSP actual hereda de esa clase, lo que se debe heredar es httpservlet y sus subclases.

isELIgnored : si se ignoran las expresiones el.

errorPage : la página JSP a la que saltar cuando la página JSP actual es anómala.

isErrorPage : indica si la página JSP actual es una página de error. Si el valor es verdadero, se puede utilizar una excepción de objeto integrado de la página JSP.

Incluir etiqueta directiva

Inclusión estática, puede incluir otro contenido de la página, compilar y ejecutar juntos, y generar un archivo java
Formato: <%@include file="la ruta relativa del JSP incluido" %>

Etiquetas de la directiva Taglib

Importar biblioteca de etiquetas.
Formato: <%@taglib prefijo="prefijo" uri="espacio de nombres" %>

Cuarto, el objeto incorporado de JSP

Un total de 9 de estos objetos están predefinidos en JSP, a saber: solicitud, respuesta, sesión, aplicación, salida, contexto de página, configuración, página, excepción.

El objeto de solicitud
El objeto de solicitud es un objeto de tipo HttpServletRequest.

El objeto de respuesta
El objeto de respuesta es un objeto de tipo HttpServletResponse.

objeto de sesión
El objeto de sesión es un objeto de tipo HttpSession. Solo se puede usar en páginas que contengan session="true".

objeto de aplicación
El objeto de aplicación es un objeto de tipo ServletContext.

objeto de salida
El objeto de salida es un objeto de tipo JspWriter.

El objeto de configuración
El objeto de configuración es un objeto de tipo ServletConfig.

objeto pageContext
El objeto pageContext es un objeto de tipo PageContext. La función es obtener parámetros en cualquier rango, a través de los cuales se pueden obtener objetos como salida, solicitud, respuesta, sesión y aplicación de páginas JSP. La creación e inicialización del objeto pageContext las realiza el contenedor, y el objeto pageContext se puede utilizar directamente en la página JSP.

El objeto de página
El objeto de página representa el propio JSP.

objeto de excepción
La función del objeto de excepción es mostrar información de excepción, que solo se puede usar en la página que contiene isErrorPage="true".

5. Solicitud de reenvío

¿Qué es el reenvío de solicitudes?

El reenvío de solicitudes es un método de solicitud en el lado del servidor, que es equivalente a solicitar directamente un determinado recurso en el lado del servidor.
Ejemplo:
RequestDispatcher dispatcher = request.getRequestDispatcher(“/test.jsp”);
dispatcher.forward(solicitud,respuesta);
abreviatura:
request.getRequestDispatcher(“/test.jsp”).forword(solicitud,respuesta);

inserte la descripción de la imagen aquí

La diferencia entre el reenvío de solicitudes y la redirección

<El reenvío de solicitudes se completa en una solicitud y respuesta para el navegador del cliente, mientras que la redirección se completa en dos solicitudes y dos respuestas.
<El reenvío de solicitudes no cambia el contenido de la barra de direcciones del navegador del cliente. La redirección cambiará el contenido en la barra de direcciones del navegador del cliente.
<El reenvío de solicitudes puede usar el objeto de solicitud para transferir datos, pero la redirección no puede usar el objeto de solicitud para transferir datos.
<Si se trata de una operación DML, se recomienda utilizar el método de redirección para generar una respuesta para el navegador del cliente, lo que puede solucionar el fenómeno del envío repetido de formularios.

caso de solicitud de reenvío

Requisito: obtenga el idioma compatible con el navegador del cliente en el servlet y responda el idioma compatible con el navegador del cliente al navegador del cliente a través de la página JSP.

//Servlet代码
package com.packagename.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * 在Servlet中获取客户端浏览器所支持的语言,
 * 并通过JSP页面将客户端浏览器所支持的语言响应给客户端浏览器。
 */
@WebServlet("/url")
public class LanguageServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //获取请求头中所支持的语言
        String header = req.getHeader("Accept-Language");
        //将数据存放到Request对象中
        req.setAttribute("header",header);
        //使用请求转发跳转到JSP
        req.getRequestDispatcher("jspname.jsp").forward(req,resp);
    }
}

//JSP代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    String header = (String)request.getAttribute("header");
%>
<font color="blue"><%= header%> </font>
</body>
</html>

Seis, los cuatro principales objetos de alcance en JSP

Alcance: "El alcance del intercambio de datos", es decir, hasta qué punto los datos pueden ser válidos.

nombre del objeto Ámbito de acción
solicitud Toda la aplicación funciona
sesión válido para la sesión actual
pedido válido para la solicitud actual
página Válido en la página actual

Siete, biblioteca de etiquetas JSTL

¿Qué es la biblioteca de etiquetas JSTL?

JSTL (biblioteca de etiquetas estándar de páginas de servidor Java, es decir, biblioteca de etiquetas estándar JSP) Las etiquetas JSTL se basan en páginas JSP. Estas etiquetas se pueden insertar en el código JSP. En esencia, JSTL también es un conjunto de etiquetas definidas de antemano. Estas etiquetas encapsulan diferentes funciones. Al llamar a las etiquetas en la página, es equivalente a llamar a las funciones encapsuladas. El objetivo de JSTL es hacer que las páginas JSP sean más legibles, simplificar el diseño de las páginas JSP, realizar la reutilización del código y mejorar la eficiencia.

La biblioteca de etiquetas JSTL es compatible después de la versión JSP2.0. Al usar la biblioteca de etiquetas JSTL, debe agregar la etiqueta de instrucción taglib correspondiente en el JSP.

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

Clasificación de etiquetas JSTL

Según las funciones proporcionadas por las etiquetas JSTL, se pueden dividir en 5 categorías.

etiqueta central

Las etiquetas más utilizadas, más importantes y más básicas

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

inserte la descripción de la imagen aquí

etiquetas de formato

Las etiquetas de formato JSTL se utilizan para formatear y generar texto, fecha, hora y números.

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

inserte la descripción de la imagen aquí

Etiquetas SQL

La biblioteca de etiquetas JSTL SQL proporciona etiquetas para interactuar con bases de datos relacionales (Oracle, MySQL, SQL Server, etc.).

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

inserte la descripción de la imagen aquí

Etiquetas XML

La biblioteca de etiquetas JSTL XML proporciona etiquetas para crear y manipular documentos XML.

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

inserte la descripción de la imagen aquí

Función JSTL

JSTL contiene una serie de funciones estándar, la mayoría de las cuales son funciones de procesamiento de cadenas de propósito general.

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

inserte la descripción de la imagen aquí

Ocho, expresión EL

¿Qué son las expresiones EL?

EL (Expression Language) es un lenguaje de expresión. Es hacer que JSP sea más fácil de escribir, reducir el código Java y hacer que sea muy simple obtener datos almacenados en objetos Java. Las expresiones EL son compatibles después de la versión JSP2.0.

Estructuras gramaticales

${expresión}
${objeto.nombre de propiedad}

Operadores en expresiones EL

operador describir
( ) prioridad
+ agregar
- reducir
* llevar
/ o división eliminar
% o mod modelo
== o equivalente prueba de igualdad
!= o ne ¿La prueba no es igual
< 或 lt Comprueba si es menor que
> o gt Probar si es mayor que
<= o le Pruebas para menor o igual que
>= o ge Pruebas para mayor o igual que
&& 或 y lógica de prueba y
! O no prueba de negación
vacío prueba de nulo

Objetos implícitos para expresiones EL

objeto oculto describir
alcance de página ámbito de la página
solicitudAlcance alcance de la solicitud
ámbito de sesión alcance de la sesión
alcance de la aplicación ámbito de aplicación
solicitud de parámetro parámetro de objeto, cadena
paramValues Los parámetros del objeto Solicitud, una colección de cadenas.
encabezamiento Encabezados HTTP, cadena
valores de encabezado Encabezado de información HTTP, una colección de cadenas
initParams Parámetros de inicialización de contexto
Galleta valor de la galleta
contexto de página el pageContext de la página actual

Use expresiones EL para obtener el valor en el alcance

${pageScope.nombre}

${requestScope.nombre}

${sessionScope.nombre}

${applicationScope.name}

Al obtener los datos en el atributo de alcance, también puede escribir solo el nombre del atributo, y la expresión EL buscará el valor del atributo en el orden de pageScope, requestScope, sessionScope y applicationScope.

${nombre}

Nueve, el uso de la biblioteca de etiquetas JSTL y expresiones EL

Pasos para utilizar la biblioteca de etiquetas JSTL

1. Agregue jstl.jar
2. Agregue la etiqueta de instrucción taglib a la página JSP.

Uso de etiquetas principales JSTL

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

La etiqueta <c:if>
juzga el valor de la expresión y, si el valor de la expresión es verdadero, ejecuta su contenido principal.
Ejemplo:<c:if test="${1==1}"> Hello JSTL! </c:if>

< c:elegir >, < c:cuando >, < c:de lo contrario > La
etiqueta < c:elegir > tiene la misma función que la declaración de cambio de Java y se utiliza para elegir entre muchas opciones.
Hay casos en la sentencia switch y <c:when> en la etiqueta <c:choose>, por defecto en la sentencia switch y <c:otherwise> en la etiqueta <c:choose>.
Ejemplo:

<c:choose>
        <c:when test="${2==1}">
            Hello When 1!
        </c:when>
        <c:when test="${2==1}">
            Hello When 2!
        </c:when>
        <c:otherwise>
            Hello Otherwise!
        </c:otherwise>
    </c:choose>

< c:forEach >

迭代器,用于迭代集合。

属性 描述
items 被迭代的集合
begin 迭代器的起始因子
end 迭代器的结束因子
step 迭代因子的增长数
var 代表当前迭代元素的变量名称
varStatus 代表循环状态的变量名称

varStatus 属性
current: 当前这次迭代的(集合中的)项

index: 当前这次迭代从 0 开始的迭代索引

count: 当前这次迭代从 1 开始的迭代计数

first: 用来表明当前这轮迭代是否为第一次迭代的标志

last: 用来表明当前这轮迭代是否为最后一次迭代的标志

begin: 属性值

end: 属性值

step: 属性值

示例:

<c:forEach begin="0" end="9" step="2" varStatus="suibian">
        ForEach.....${
    
    suibian.count},${
    
    suibian.first},${
    
    suibian.last},${
    
    suibian.index}<br/>
    </c:forEach>

效果图:
inserte la descripción de la imagen aquí

案例:使用ForEach迭代List

需求:

创建Users对象,含有userid,username属性。

创建一个Servlet,在Servlet中创建多个Users对象并放到List集合中,在showUsers.jsp的页面中显示所有的Users对象的信息。

1.Users类

package com.package.pojo;

public class Users {
    
    
    private Integer userid;
    private String username;

    public Users(Integer userid, String username) {
    
    
        this.userid = userid;
        this.username = username;
    }

    public Users() {
    
    
    }

    public Integer getUserid() {
    
    
        return userid;
    }

    public void setUserid(Integer userid) {
    
    
        this.userid = userid;
    }

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }
}

2.Servlet

package com.package.servlet;

import com.package.pojo.Users;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/url")
public class FindUsersServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //创建测试数据
        Users users1 = new Users(1,"海绵宝宝");
        Users users2 = new Users(2,"派大星");

        //实例化List
        List<Users> list = new ArrayList<>();
        list.add(users1);
        list.add(users2);

        //将List添加到request对象中
        req.setAttribute("list",list);

        //通过请求转发方式跳转
        req.getRequestDispatcher("jname.jsp").forward(req,resp);
    }
}

3.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="1" align="center">
    <tr>
        <th>用户ID</th>
        <th>用户姓名</th>
    </tr>
    <c:forEach items="${list}" var="Lname">
        <tr>
            <td>${
    
    Lname.userid}</td>
            <td>${
    
    Lname.username}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

效果图:
inserte la descripción de la imagen aquí

使用ForEach迭代Map

需求:

创建Users对象,含有userid,username属性。

创建一个Servlet,在Servlet中创建多个Users对象并放到Map集合中,在showUsers2.jsp的页面中显示所有的Users对象的信息。

1.Users类

package com.package.pojo;

public class Users {
    
    
    private Integer userid;
    private String username;

    public Users(Integer userid, String username) {
    
    
        this.userid = userid;
        this.username = username;
    }

    public Users() {
    
    
    }

    public Integer getUserid() {
    
    
        return userid;
    }

    public void setUserid(Integer userid) {
    
    
        this.userid = userid;
    }

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }
}

2.Servlet

package com.itbaizhan.servlet;

import com.itbaizhan.pojo.Users;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/url")
public class FindUsers2Servlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //创建测试数据
        Users users1 = new Users(1,"林黛玉");
        Users users2 = new Users(2,"贾宝玉");

        //实例化Map
        Map<String,Users> map = new HashMap<>();
        map.put("users1",users1);
        map.put("users2",users2);


        //将List添加到request对象中
        req.setAttribute("map",map);

        //通过请求转发方式跳转
        req.getRequestDispatcher("jname.jsp").forward(req,resp);
    }
}

3.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="1" align="center">
    <tr>
        <th>MapKey</th>
        <th>用户ID</th>
        <th>用户姓名</th>
    </tr>
    <c:forEach items="${map}" var="Mname">
        <tr>
            <td>${
    
    u.key}</td>
            <td>${
    
    u.value.userid}</td>
            <td>${
    
    u.value.username}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

效果图:
inserte la descripción de la imagen aquí

十、JSTL格式化标签的使用

<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>

对日期的格式化处理

<fmt:formatDate value="${data}" pattern="yyyy-MM-dd"/>

对数字格的式化处理`

<fmt:formatNumber value="${balance}" type="currency"/>

十一、MVC模式

什么是MVC模式

MVC模式:Model、View、Controller即模型、视图、控制器。是软件的一种架构模式(Architecture pattern)。MVC要实现的目标是将软件的用户界面和业务逻辑分离,可提高代码可扩展性、可复用性、可维护性、以及灵活性。

View(视图):用户的操作界面。如:html、jsp。

Modelo (modelo) : modelo de negocio específico y modelo de datos. Tales como: servicio, dao, pojo.

Controlador (control) : procesa la solicitud enviada desde la capa de vista, selecciona el modelo comercial de la capa modelo para completar la implementación comercial de la respuesta y genera una respuesta. Tales como: Servlet.

inserte la descripción de la imagen aquí

La diferencia entre el patrón MVC y la aplicación de capas

El patrón MVC es una forma de arquitectura de software, y la aplicación en capas es una forma de organizar el código. El objetivo del patrón MVC y la aplicación en capas es el mismo: desacoplar y mejorar la reutilización del código.
inserte la descripción de la imagen aquí


Supongo que te gusta

Origin blog.csdn.net/TIpotencial/article/details/123702165
Recomendado
Clasificación