EL et JSTL

Introduction à la boîte à outils EL

Un package jar développé par la technologie Java

Rôle: réduire l'intensité du développement de commandes Java pendant le développement de fichiers JSP

Le serveur Tomcat lui-même est livré avec la boîte à outils EL ( adresse d'installation Tomcat / lib / el-api.jar )

Connaissances relatives à JSP Il y a une introduction relative à la spécification JSP dans cet article

Expression EL

 1. Format de commande: $ {alias d'objet de portée. Données partagées}
 2. Fonction de commande:
       1) L'expression EL est un format de commande spécial fourni par la boîte à outils EL [Format de commande d'expression]
       2) Expression EL sur le fichier JSP Utilisation
       3) Quand exécution, lire le contenu des [données partagées] spécifiées à partir de l '[objet d'étendue] spécifié et l'écrire automatiquement dans le corps de la réponse

Alias ​​d'objet d'étendue d'expression EL

1. Objets de portée pouvant être utilisés par les fichiers JSP

    1) Application ServletContext: objet de portée globale

    2) Session HttpSession: objet de portée de session

    3) Demande HttpServletRequest: objet d'étendue de demande

    4) PageContext pageContext: objet d'étendue de la page actuelle

    Il s'agit d' un objet de portée unique aux fichiers JSP . N'existe pas dans le servlet

    Les données partagées stockées dans l'objet scope de la page actuelle ne peuvent être utilisées que dans le fichier JSP actuel et ne peuvent pas être partagées avec d'autres servlets ou d'autres fichiers JSP

Véritable processus de développement, principalement utilisé pour le partage de données entre les balises JSTL et les fichiers JSP

    JSTL -------> pageContext ----> JSP

2. L'expression EL fournit un alias d'objet de portée

          Expression JSP EL

      application $ {applicationScope. Nom des données partagées}

      session $ {sessionScope. Nom des données partagées}

      request $ {requestScope. Nom des données partagées}

      pageContext $ {pageScope. Nom des données partagées}

Le code suivant illustre l'utilisation du code java et des expressions EL pour implémenter la lecture de données partagées dans JSP

Servlet

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //分别将共享数据添加到作用域对象
        //全局作用域对象
        ServletContext application=request.getServletContext();
        //会话作用域对象
        HttpSession session=request.getSession();

        application.setAttribute("sId",10);
        session.setAttribute("sName","mike");
        request.setAttribute("home","北京");
        //通过请求转发的方式调用index_1.jsp,由index_1.jsp负责将作用域对象共享数据读取并写入响应体中
        request.getRequestDispatcher("/index_1.jsp").forward(request,response);
    }
}

Utilisez le code Java pour lire les données partagées

<%
    //读取全局作用域对象中的共享数据
    Integer sId=(Integer) application.getAttribute("sId");
    //读取会话作用域对象中的共享数据
    String sName=(String)session.getAttribute("sName");
    //读取请求作用域对象中的共享数据
    String home=(String)request.getAttribute("home");
%>
sId:<%=sId%><br/>
sName:<%=sName%><br/>
home:<%=home%><br/>

Utiliser des expressions EL

学员Id:${applicationScope.sId}<br/>
学员姓名:${sessionScope.sName}<br/>
学员地址:${requestScope.home}<br/>

L'expression EL simplifie évidemment les étapes de lecture des données partagées dans les fichiers JSP

L'expression EL écrit les propriétés de l'objet de référence dans le corps de la réponse

1. Format de commande: $ {alias d'objet de portée. Nom de données partagées. Nom d'attribut}
2. Fonction de commande: lire la valeur d'attribut de l'objet de référence associé aux données partagées spécifiées à partir de l'objet de portée. Et écrivez automatiquement le résultat de l'attribut dans le corps de la réponse
3. Nom de l'attribut: assurez-vous de faire référence au type Le nom de l'attribut est exactement le même (cas)
4. L'expression EL ne fournit pas de méthode pour parcourir la collection, donc la collection le contenu ne peut pas être lu à partir de l'objet d'étendue Sortie

Créez d'abord une classe d'étudiants

public class Student {
    private Integer sId;
    private String sName;

    public Student() {
    }

    public Student(Integer sId, String sName) {
        this.sId = sId;
        this.sName = sName;
    }

    public Integer getsId() {
        return sId;
    }

    public void setsId(Integer sId) {
        this.sId = sId;
    }

    public String getsName() {
        return sName;
    }

    public void setsName(String sName) {
        this.sName = sName;
    }
}

Créer un servlet

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建一个引用类型实例对象
        Student student=new Student(10,"mike");
        //将引用类型对象存入请求作用域对象
        request.setAttribute("student",student);
        //请求转发,向Tomcat申请调用index_1.jsp
        request.getRequestDispatcher("/index_1.jsp").forward(request,response);
    }
}

index_1.jsp

学生编号:${requestScope.student.sId}<br/>
学生姓名:${requestScope.student.sName}<br/>

Version simplifiée de l'expression EL

1. Format de la commande: $ {shared data name}

2. Fonction de commande: l'expression EL permet aux développeurs d'omettre les alias d'objet de portée pendant le développement

3. Principe de fonctionnement:

   Étant donné que la version simplifiée de l'expression EL ne spécifie pas la portée de l'objet, elle utilise l' algorithme [guess] lors de l'exécution

  Accédez d'abord à [pageContext] pour localiser les données partagées, si elles existent, lisez directement la sortie et terminez l'exécution

  Si le positionnement échoue dans [pageContext], accédez à [request] pour localiser les données partagées, si elles existent, lisez directement la sortie et terminez l'exécution

  Si le positionnement échoue dans [demande], allez dans [session] pour localiser les données partagées, si elles existent, lisez directement la sortie et terminez l'exécution

  Si le positionnement échoue dans [session], allez dans [application] pour localiser les données partagées, si elles existent, lisez directement la sortie et terminez l'exécution

  Si le positionnement échoue dans [application], renvoie null

  pageContext ---> request ---> session ---> application

4. Il y a des dangers cachés:

             Facile à ralentir la vitesse d’exécution du programme [Au contraire]

             Conduit facilement à des erreurs de positionnement des données

5. Scénarios d'application:

              Le but de la conception est de simplifier la difficulté de lecture et de sortie des données partagées à partir de pageContext

               La conception initiale de la version simplifiée consiste à lire et à générer des données à partir de l'objet d'étendue de page en cours. Par conséquent, vous devez éviter d'utiliser la version simplifiée lors de la lecture et de la sortie de données à partir d'une requête, d'une session et d'une application.

6. Bien qu'il existe de nombreux dangers cachés dans la version simplifiée des expressions EL, dans le processus de développement proprement dit, pour gagner du temps, les développeurs utilisent généralement

  Version simplifiée, refuser d'utiliser la version standard

Servlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向当前用户session添加一个共享数据
        HttpSession session=request.getSession();
        session.setAttribute("key","hehe");

        //向当前请求作用域对象中添加一个共享数据
        request.setAttribute("key","haha");

        //通过请求转发方式,申请调用index_1.jsp
        request.getRequestDispatcher("/index_1.jsp").forward(request,response);
    }
}

index_1.jsp

标准版EL表达式输出session中的key值:${sessionScope.key}<br/>
简化版EL表达式输出session中的key值:${key}

L'expression EL prend en charge les expressions arithmétiques

1. Prérequis: il est parfois nécessaire de lire les données partagées pour certains calculs dans le fichier JSP, puis d'écrire les résultats du calcul dans le corps de la réponse.

2. Expression d'opération:

   1) Opérations mathématiques

   2) Opérations relationnelles:>> = == << =! = Gt ge eq lt le! =

   3) Opération logique: && ||!

Démontrer des opérations mathématiques

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("key1","100");
        request.setAttribute("key2",200);
        //通过请求转发的方式调用index_1.jsp 并将结果写入到响应体中
        request.getRequestDispatcher("index_1.jsp").forward(request,response);
    }
}
<!--将作用域对象中共享数据读取出来相加,将相加的结果写入到响应体中-->
<%
    String num1=(String)request.getAttribute("key1");
    Integer num2=(Integer)request.getAttribute("key2");
    int sum=Integer.valueOf(num1)+num2;
%>
传统的java命令计算后的结果:<%=sum%>
<hr/>
EL表达式计算后的结果:${requestScope.key1+requestScope.key2}

Démontrer des opérations relationnelles

public class TwoServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("age",25);
        request.getRequestDispatcher("index_2.jsp").forward(request,response);
    }
}
<!--传统Java命令实现关系运算的输出-->
<%
    Integer age=(Integer)request.getAttribute("age");
%>
<%
    if (age>18){
%>
欢迎光临<br/>
<%
    }else {
%>
谢绝入内<br/>
<%
    }
%>
EL表达式输出关系运算
${age>18?"欢迎光临":"谢绝入内"}

Objets intégrés fournis par les expressions EL

le terme

                  définition

               param

Mappez le nom du paramètre de demande sur une seule valeur de paramètre de chaîne (obtenue en appelant ServletRequest.getParameter (String name)). La méthode getParameter (String) renvoie un paramètre avec un nom spécifique. L'expression $ {param. Name} est équivalente à request.getParameter (name).

              paramValues

Mappez le nom du paramètre de demande sur un tableau numérique (obtenu en appelant ServletRequest.getParameter (String name)). Il est très similaire à l'objet implicite param, mais il récupère un tableau de chaînes au lieu d'une seule valeur. L'expression $ {paramvalues. Name} est équivalente à request.getParamterValues ​​(name).

             entête

Mappez le nom de l'en-tête de la demande sur une seule valeur d'en-tête de chaîne (obtenue en appelant ServletRequest.getHeader (String name)). L'expression $ {header. Name} est équivalente à request.getHeader (name).

            headerValues

Mappez le nom de l'en-tête de la demande sur un tableau numérique (obtenu en appelant ServletRequest.getHeaders (String)). Il est très similaire à l'objet implicite head. L'expression $ {headerValues. Name} est équivalente à request.getHeaderValues ​​(name).

           biscuit

Mappez le nom du cookie sur un seul objet cookie. La demande du client au serveur peut obtenir un ou plusieurs cookies. L'expression $ {cookie. Name .value} renvoie la première valeur de cookie avec un nom spécifique. Si la requête contient plusieurs cookies du même nom, l'expression $ {headerValues. Name} doit être utilisée

           initParam

Mappez le nom du paramètre d'initialisation du contexte sur une valeur unique (obtenue en appelant ServletContext.getInitparameter (String name)).

param

Équivalent à request.getParameter () en code java;

1. Format de la commande: $ {param. Nom du paramètre de la requête}

2. Fonction de commande: lire le contenu du paramètre de demande dans le paquet de demande actuel via l'objet de demande et écrire le contenu du paramètre de demande dans le corps de la réponse.

3. Commande alternative: index.jsp

    Envoyer la demande: Http: // localhost: 8080 / myWeb / index_1.jsp? UserName = mike & password = 123

        <%

        Chaîne userName = request.getParameter ("userName");

        String password = request.getParameter ("password");

      %>

     <% = nom_utilisateur%>

     <% = mot de passe%>

paramValues

Équivalent à request.getParameterValues ​​() en code java;

1. Format de la commande: $ {paramValues. Demander le nom du paramètre [indice]}

2. Fonction de commande:

    Si le paramètre de requête envoyé par le navigateur est [un paramètre de requête est associé à plusieurs valeurs]

    À ce stade, vous pouvez lire la valeur de la position spécifiée sous le paramètre de requête via paramValues ​​et l'écrire dans le corps de la réponse

3. 代替 命令: http: // localhost: 8080 / monWeb / index_2.jsp? PageNo = 1 & pageNo = 2 & pageNo = 3

    À ce stade, le paramètre de requête pageNo existe sous la forme d'un tableau dans le paquet de requête

    pageNo: [1,2,3]

    <%

        Tableau de chaînes [] = request.getParameterValues ​​("pageNo");

    %>

    La première valeur: <% = array [0]%>

    La deuxième valeur: <% = array [1]%>

pageContexte

Nom de classe Java complet correspondant: javax.servlet.jsp.PageContext

L'objet implicite correspondant à cet objet intégré dans l'expression EL est: PageContext

Utilisez l'objet intégré pageScope dans l'expression EL lors de la récupération de données à partir de la portée pageContext à l'aide de l'expression EL

Si vous souhaitez appeler la méthode de l'objet intégré pageContext, vous devez utiliser l'objet intégré pageContext de l'expression EL

Exemple: utilisez l'expression EL pour obtenir le chemin de base

使用java代码获取base路径
<%
    String path=request.getScheme()+"://"+request.getServerName()+request.getServerPort()+"/"+request.getContextPath();
%>
<%=path%>
<br/>
使用EL表达式内置对象PageContext
${pageContext.request.scheme}://${pageContext.request.serverName}${pageContext.request.serverPort}/${pageContext.request.contextPath}
<br/>

Utiliser des expressions EL pour lire les données de la collection Map

<%
        Map<String,Emp> empMap=new HashMap<>();
        empMap.put("e1",e1);
        empMap.put("e2",e2);
        request.setAttribute("empMap",empMap);
 %>
    员工1:${empMap.get("e1").ename}
    员工1编号:${empMap.get("e1").eno}
    员工2:${empMap.get("e1").ename}
    员工2编号:${empMap.get("e1").eno}

Utiliser des expressions EL pour lire les données de la collection List

<%
    List<Emp> empList=new ArrayList<Emp>();
    empList.add(e1);
    empList.add(e2);
    request.setAttribute("empList",empList);
%>
${empList[0]}
${empList[1]}
${empList[0].ename}
${empList[1].ename}

Exception exclusive de l'expression EL

javax.el.PropertyNotFoundException : Le type [xxxx] n'existe pas [nom de la propriété] et la propriété correspondante est introuvable dans une certaine classe

JSTL

(JSP Standard Tag Libary) Bibliothèque de balises JSP standard (maîtrisez la balise core tag c)

Utilisez des balises au lieu du code java. Le standard est développé par Sun et implémenté par Apache (inclus par Sun)

Étapes pour utiliser JSTL:

        * Importez le package jar jstl.jar standard.jar

        * Utilisez l'instruction taglib pour introduire la bibliothèque de balises sur la page jsp qui doit utiliser le montant de la balise

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

        * Vous pouvez utiliser l'étiquette directement là où vous devez utiliser l'étiquette

Expliquez l'étiquette

<tag>
   <description></description>                                                         标签的描述
   <name>if</name>                                                                     标签的名字
   <tag-class>org.apache.taglibs.standard.tag.rt.core.IfTag</tag-class>                标签对应的需要执行的类
   <body-content>JSP</body-content>                                                    标签体中的内容类型
   <attribute>                                                                         标签中可以出现的属性
       <description></description>                                                     对属性的描述
       <name>test</name>                                                               属性的名字
       <required>true</required>                                                       该属性是否是必须的 true是必须的
       <rtexprvalue>true</rtexprvalue>                                                 该属性是否可以接收EL表达式  true表示支持接收EL表达式
	<type>boolean</type>                                                                该属性的数据类型
   </attribute>
   <attribute>
       <description></description>
       <name>var</name>
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
   </attribute>
   <attribute>
       <description></description>
       <name>scope</name>
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
   </attribute>
 </tag>

Étiquettes fréquemment utilisées

<%--模拟if...else--%>
<c:choose>
    <c:when test="${param.age<5}">
        婴幼儿
    </c:when>
    <c:when test="${param.age<18}">
        少年
    </c:when>
    <c:when test="${param.age<35}">
        青年
    </c:when>
    <c:otherwise>
        老年
    </c:otherwise>
</c:choose>
<hr/>
<%--循环foreach--%>
<c:forEach begin="1" end="10" step="1" var="i">
    ${i}
</c:forEach>
<br/>
<%--java代码--%>
<%
    for(int i=1;i<=10;i++){
    pageContext.setAttribute("i",i);
%>
${i}
<%
}
%>
<hr/>
<%--循环获取List集合--%>
<%
    List<Emp> empList=new ArrayList<Emp>();
    Emp e1=new Emp(110,"张三");
    Emp e2=new Emp(111,"李四");
    Emp e3=new Emp(112,"王五");
    empList.add(e1);
    empList.add(e2);
    empList.add(e3);
    pageContext.setAttribute("empList",empList);
%>
<c:forEach items="${empList}" var="emp" varStatus="empStatus">
    ${empStatus.count}、${emp.eno}、${emp.ename}<br/>
</c:forEach>
<br/>
<%--使用java代码--%>
<%
    for(Emp e:empList){
        pageContext.setAttribute("e",empList);
%>
<%=e.getEno()%>、<%=e.getEname()%><br/>
<%
    }
%>
<hr/>
<%--可以切割字符串--%>
<%--127.0.0.1,192.168.1.100,192.168.1.3,192.168.8.4--%>
<c:forTokens items="${initParam.ips}" delims="," var="ip">
    ${ip}<br/>
</c:forTokens>

une fonction

1. Function est un complément à l'expression EL, function fait partie de JSTL et le fichier de configuration correspondant est: fn.tld file in stander.jar

2. La fonction est également une expression EL conjointe et remplace le code Java dans jsp

3. Points de fonction: fonctions intégrées, fonctions personnalisées

4. Étapes pour utiliser les fonctions intégrées

    * Importer le package jar (jstl.jar, standard.jar)

    * Utilisez l'instruction taglab pour importer la bibliothèque de fonctions

    * Utilisez-le là où vous devez utiliser la fonction

5. Fonction détaillée

<function>                                                                                          函数描述
    <description></description>                                                                     函数名
    <name>contains</name>                                                                           函数对应的类
    <function-class>org.apache.taglibs.standard.functions.Functions</function-class>                函数对应的类中需要执行的方法
    <function-signature>boolean contains(java.lang.String, java.lang.String)</function-signature>
    <example>
      &lt;c:if test="${fn:contains(name, searchString)}">                                           例子
    </example>
  </function>

6. Comment utiliser l'étiquette EL, comment utiliser la fonction

7. Étapes de personnalisation de l'étiquette

    * Créez un nouveau fichier egov.tld dans le répertoire WEB-INF et copiez le modèle à partir du fichier fn.tld

    * Ecrire une classe, écrire une méthode dans la classe, la méthode doit être publique et doit être statique

    * Il suffit d'utiliser

Je suppose que tu aimes

Origine blog.csdn.net/qq_45796208/article/details/108851273
conseillé
Classement