精华内容
下载资源
问答
  • 蜜蜂el编辑器

    热门讨论 2014-07-09 23:18:04
    编辑赤壁完美等el的原件,还是挺有用的东西
  • OS X 10.11 El Capitan VMware镜像种子

    千次下载 热门讨论 2015-10-14 10:02:32
    OS X 10.11 El Capitan VMware虚拟机镜像,下载大小8.4G+。解压密码是:xBytez。亲测可用(Win10 x64企业版 + VMWare 12.0 Pro)。
  • EL表达式详解

    万次阅读 多人点赞 2018-04-08 12:27:28
    该篇博客主要关于EL表达式,废话不多说=-=进入正题 博客目录 1、EL表达式介绍 2、EL获取数据 3、EL中的内置对象 4、EL访问Bean的属性 5、EL访问数组中的数据 6、EL获取list中数据 7、EL访问...

    该篇博客主要关于EL表达式,废话不多说=-=进入正题

    博客目录

    1、EL表达式介绍
    2、EL获取数据
    3、EL中的内置对象
    4、EL访问Bean的属性
    5、EL访问数组中的数据
    6、EL获取list中数据
    7、EL访问Map
    8、EL中的运算符(empty)
    9、自定义EL函数
    10、总结

    一、EL表达式介绍

    • Expression Language表达式语言
    • 是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
    • 在JSP2.0开始引入概念

    语法格式

    在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的值


    二、EL获取数据(从四大域中获取属性)

    • EL只能从四大域中获取属性

    1、如果没有使用EL的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值

    - pageContext<request<session<application
    
            <%@ page language="java" contentType="text/html; charset=UTF-8"
                pageEncoding="UTF-8"%>
            <!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("name", "linjie");
                    request.setAttribute("name", "lucy");
                    session.setAttribute("name", "king");
                    application.setAttribute("name", "bilibili");
                %>
                name=${name }
            </body>
            </html>
    

    这里写图片描述

    可以看出没有使用EL内置对象时查找顺序是由小到大,所以最先显示的是pageContext域中的

    2、使用EL内置对象,从指定域中获取数据,提高了查找效率

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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("name", "linjie");
            request.setAttribute("name", "lucy");
            session.setAttribute("name", "king");
            application.setAttribute("name", "bilibili");
        %>
        name=${applicationScope.name }
    </body>
    </html>
    

    这里写图片描述

    可以看出,使用applicationScope即可指定application域中的name输出,当然其他域也是类似,下文会说这四大域属性相关的内置对象


    三、EL中的内置对象

    EL有11个内置对象,这里主要讲域属性相关的4个和其他4个
    EL的11个内置对象,除了pageContext以外,其他10个内置对象的类型都是java.util.Map类型

    1、域属性相关(4个)

    1. pageScope:从page范围域属性空间中查找指定的key
    2. requestScope:从request范围域属性空间中查找指定的key
    3. sessionScope:从session范围域属性空间中查找指定的key
    4. applicationScope:从application范围域属性空间中查找指定的key

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!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("name", "linjie");
              request.setAttribute("name", "lucy");
              session.setAttribute("name", "king");
              application.setAttribute("name", "bilibili");
          %>
      
          name=${applicationScope.name }<br>
          name=${pageScope.name }<br>
          name=${sessionScope.name }<br>
          name=${requestScope.name }<br>
      </body>
      </html>
      

    这里写图片描述


    2、其他重要内置对象(4个)

    1、pageContext

    该pageContext与JSP内置对象pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象注意:这些对象在EL里不是内置对象,这些对象只能通过pageContext获取

    • 在EL中直接${pageContext.request}即可获取request对象,其底层调用的是pageContext.getRequest()方法。同理,也可以通过类似方法获取其他对象

    重点:其中最常用的:${pageContext.request.contextPath },代表web应用下的根,可以看出下面action中的路径可读性更强了

    Regster.java

    package linjie.com;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class Regster extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().append("Served at: ").append(request.getContextPath());
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
    

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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.request.contextPath }代表web应用的根 --%>
        <form action="${pageContext.request.contextPath }/regster" method="POST">
            xxx<input type="text" name="name"/><br>
            yyy<input type="text" name="age"/><br>
            <input type="submit" value="点击">
        </form>
    </body>
    </html>
    

    这里写图片描述

    2、param(获取请求中的指定参数)
    • 其底层实际调用request.getParameter()

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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.request.contextPath }代表web应用的根 --%>
        <form action="${pageContext.request.contextPath }/show.jsp" method="POST">
            xxx<input type="text" name="name"/><br>
            yyy<input type="text" name="age"/><br>
            <input type="submit" value="点击">
        </form>
    </body>
    </html>
    

    show.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>
        name=${param.name }<br>
        age=${param.age }<br>
    </body>
    </html>
    

    客户浏览器访问结果

    这里写图片描述

    这里写图片描述

    3、paramValues

    获取请求中的指定参数的所以值,其底层实际调用request.getParameterValues()


    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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.request.contextPath }代表web应用的根 --%>
        <form action="${pageContext.request.contextPath }/show.jsp" method="POST">
            xxx<input type="text" name="name"/><br>
            yyy<input type="text" name="age"/><br>
    
            爱好:
            <input type="checkbox" name="hobby" value="sleep">睡觉
            <input type="checkbox" name="hobby" value="play">玩
            <input type="checkbox" name="hobby" value="eat">吃
            <input type="submit" value="点击">
        </form>
    </body>
    </html>
    

    show.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>
        name=${param.name }<br>
        age=${param.age }<br>
    
    
        hobby[0]=${paramValues.hobby[0] }<br>
        hobby[1]=${paramValues.hobby[1] }<br>
    </body>
    </html>
    

    客户浏览器显示结果

    这里写图片描述

    这里写图片描述

    4、initParam

    获取初始化参数,其底层调用的是ServletContext.getInitParameter()


    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>07eltttt</display-name>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    
    <!--初始化参数 -->
      <context-param>
        <param-name>name</param-name>
        <param-value>林杰</param-value>
      </context-param>
    
    
      <servlet>
        <display-name>Regster</display-name>
        <servlet-name>Regster</servlet-name>
        <servlet-class>linjie.com.Regster</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Regster</servlet-name>
        <url-pattern>/regster</url-pattern>
      </servlet-mapping>
    </web-app>
    

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>
        name=${initParam.name }
    </body>
    </html>
    

    客户浏览器显示结果

    这里写图片描述


    四、EL访问Bean的属性

    1、什么是java Bean

    JavaBean是公共Java类,但是为了编辑工具识别

    需要满足至少三个条件

    • 有一个public默认构造器(例如无参构造器)
    • 属性使用public 的get,set方法访问,也就是说设置成private同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){},N大写。
    • 需要序列化。这个是框架,工具跨平台反映状态必须的

    2、EL访问Bean属性

    EL可以通过${key.属性}的方式获取到指定值,其底层实际调用的是该对象的相应属性的get方法


    Demo.java

    package linjie.com;
    /*
     *Bean 
     */
    public class Demo {
        private String name;
        private int age;
        public Demo(String name,int age){
            this.name=name;
            this.age=age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return super.toString();
        }
    
    }
    

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        import="linjie.com.Demo"
        pageEncoding="UTF-8"%>
    <!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>
        <%
            Demo test=new Demo("linjie",12);
            request.setAttribute("ELttt", test);
        %>
        name=${requestScope.ELttt.name }<br>
        age=${requestScope.ELttt.age }<br>
    
        <!-- 若访问为null的对象的属性,EL是不会抛出空指针异常的,只是不显示而已 -->
        names=${requestScope.ELtttxx.name }<br>
    
    </body>
    </html>
    

    客户浏览器显示结果

    这里写图片描述


    五、EL访问数组中的数据

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>
        <%
            String[] names={"xlj","lucy","king"};
            pageContext.setAttribute("names", names);
        %>
        name[1]=${names[1] }<br>
    
        <!-- 若访问的数组元素下标超出了数组下标上限,EL不会抛出越界异常,只是不显示 -->
        names[5]=${names[5] }<br>
    </body>
    </html>
    

    下面是访问类的数组

    Stu.java

    package linjie.com;
    /*
     *Bean 
     */
    public class Stu {
        private String sname;
        private String address;
        public Stu() {
            super();
        }
    
        public Stu(String sname, String address) {
            super();
            this.sname = sname;
            this.address = address;
        }
    
        public String getSname() {
            return sname;
        }
    
        public void setSname(String sname) {
            this.sname = sname;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return super.toString();
        }
    
    
    }
    

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        import="linjie.com.*"
        pageEncoding="UTF-8"%>
    <!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>
    
        <%
            Stu[] stus=new Stu[3];
            stus[0]=new Stu("xlj","A");
            stus[1]=new Stu("lucy","B");
            stus[2]=new Stu("kingA","C");
            pageContext.setAttribute("stus",stus);
        %>
        stus[1].Sname=${stus[1].sname }
    </body>
    </html>
    

    客户浏览器显示结果

    这里写图片描述


    六、EL获取list中数据

    <%@page import="java.util.*"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>
        <%
            List<String> names=new ArrayList<String>();
            names.add("xlj");
            names.add("lucy");
            pageContext.setAttribute("names", names);
        %>
    
        <!-- 因为List底层是数组,所以可以这样写 -->
        names[1]=${names[1] }<br>
    </body>
    </html>
    

    客户浏览器显示结果

    这里写图片描述

    注意:

    EL可以通过索引访问List,但无法访问Set。因为Set中没有索引概念


    七、EL访问Map

    <%@page import="java.util.*"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>
        <%
            Map<String,Object> map=new HashMap<String,Object>();
            map.put("age", 20);
            map.put("name", "xlj");
            pageContext.setAttribute("map", map);
        %>
        name=${map.name }<br>
        age=${map.age }<br>
    </body>
    </html>
    

    客户浏览器显示结果

    这里写图片描述


    八、EL中的运算符(empty)

    1、先说说几个常用运算符

    • 算术运算符:+、-、*、/、%(不支持++、–)
    • 关系运算符:==、!=、>、>=、<、<=
    • 逻辑运算符:!、&&、||、not、and、or
    • 条件运算符:?:
    • 取值运算符:[]、点号

    2、empty运算符

    用法为${empty 变量},结果为布尔值

    <%@page import="java.util.*"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>
        <%
            String name1=null;
            String name2="";
            List<String> name3=new ArrayList<String>();
    
            pageContext.setAttribute("name1", name1);
            pageContext.setAttribute("name2", name2);
            pageContext.setAttribute("name3", name3);
        %>
        empty对于没有定义的变量,运算结果为true:
        empty namex=${empty namex }<br>
    
        empty对于null的引用,运算结果为true:
        empty name1=${empty name1 }<br>
    
        empty对于为空串的String引用,运算结果为true:
        empty name2=${empty name2 }<br>
    
        empty对于没有元素的数组或集合,运算结果为true:
        empty name3=${empty name3 }<br>
    </body>
    </html>
    

    客户浏览器显示结果

    这里写图片描述


    九、自定义EL函数

    因为EL本身不具有处理字符串能力,所以可以自定义EL函数
    - 定义函数(新建MyEL.java类)
    - 注册:先找到jsp2-example-taglib.tld,将头部以及注册函数复制到自己创建的.tld文件中(.tld放在WEB-INF下)
    - 在index.jsp中使用,使用时需要<%@ taglib uri=”http://tomcat.apache.org/jsp2-example-taglib” prefix=”MyEL” %>

    1、定义函数MyEL.java

    package linjie.com;
    
    
    //自定义函数
    //该类及其函数,需要在扩展名为.tld的xml文件中注册
    //tld:tag library definition(标签库定义)
    //xml文件是需要约束的,即需要配置文件头部。这个头部约束可以从一下文件中进行复制
    //在Tomcat安装目录下:webapps\examples\WEB-INF\jsp2
    //文件为:jsp2-example-taglib.tld
    
    //这个.tld的xml文件,需要定义在当前web项目的WEB-INF目录下,在此目录下创建以.tld结尾的xml文件
    //将jsp2-example-taglib.tld中头部复制到创建的xml文件中
    
    //再将函数注册,还是在jsp2-example-taglib.tld底部中复制
    public class MyEL {
        private static MyEL instance;
        public static MyEL getInstance() {
            if(instance==null)
            {
                instance=new MyEL();
            }
            return instance;
        }
    
        //字符串小写变大写
        public static String LowerToUpper(String str) {
            return str.toUpperCase();
        }
    }
    

    2、将jsp2-example-taglib.tld中头部部分以及底部的注册函数部分复制到自己创建的tld(在WEB-INF下)文件中

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    MyEL.tld

    <?xml version="1.0" encoding="UTF-8"?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
    
        <!-- 定义标签库信息 -->
        <description>A tag library exercising SimpleTag handlers.</description>
        <tlib-version>1.0</tlib-version>
        <short-name>MyEL</short-name><!-- 标签库名称,一般定义成和文件名一样 -->
        <uri>http://tomcat.apache.org/jsp2-example-taglib</uri>
    
       <!--  注册函数 -->
         <function>
            <name>MyLowerToUpper</name>
            <function-class>linjie.com.MyEL</function-class><!-- 方法得类 -->
            <function-signature>java.lang.String LowerToUpper( java.lang.String )</function-signature><!-- 方法签名 :需要返回值以及方法名、参数-->
        </function>
    </taglib>
    

    3、在index.jsp中使用,使用时需要<%@ taglib uri=”http://tomcat.apache.org/jsp2-example-taglib” prefix=”MyEL” %>

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="http://tomcat.apache.org/jsp2-example-taglib" prefix="MyEL" %><!-- tld中的uri和short-name -->
    <!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>
        <!-- 这个方法名是在tld注册时的name -->
        ${MyEL:MyLowerToUpper("sasas") }<br>
    
    
        <!-- EL函数只能处理四大域中的属性值及String常量 -->
        <%
            String name="xlj";
            pageContext.setAttribute("name", name);
        %>
        ${MyEL:MyLowerToUpper(name) }<br>
    
    </body>
    </html>
    

    客户浏览器显示结果

    这里写图片描述


    十、EL总结

    • EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分
    • EL只能从四大域属性空间中获取数据(pageContext、request、session、application)
    • EL不会抛出空指针异常,只会不显示
    • EL不会抛出数组越界异常,只会不显示
    • EL不具有对字符串进行处理的能力(可以使用JSTL的EL或者自定义EL函数)
    展开全文
  • element-ui el-table与el-form同用,并校验

    万次阅读 多人点赞 2019-08-28 00:03:10
    文章目录基本结构添加校验自己写校验方法其他校验 基本结构 <template> <div> <el-form ref="form" :model="form">...el-table ref="table" :data="form.tableData" empty-text='暂无数据...el-ta...

    基本结构

    在这里插入图片描述

    <template>
      <div>
        <el-form ref="form" :model="form">
          <el-table  ref="table" :data="form.tableData" empty-text='暂无数据'>
            <el-table-column label="姓名">
              <template slot-scope="scope">
                <el-form-item >
                  <el-input v-model="scope.row.name"></el-input>
                </el-form-item>
              </template>
            </el-table-column>
            <el-table-column label="年龄">
              <template slot-scope="scope">
                <el-form-item >
                  <el-input v-model.number="scope.row.age" type="number"></el-input>
                </el-form-item>
              </template>
            </el-table-column>
            <el-table-column  label="操作">
              <template slot-scope="scope">
                <el-button type="danger" size="mini" @click="del(scope.$index)" icon='el-icon-delete'></el-button>
                <el-button type="primary" size="mini" @click="add" icon='el-icon-plus'></el-button>
              </template>
            </el-table-column>
          </el-table>
        </el-form>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          form: {
            tableData: [
              {
                name: "aaa",
                age: 11
              },
              {
                name: "",
                age: ''
              }
            ]
          }
        };
      },
      methods:{
          add(){
              this.form.tableData.push({
                  name: "",
                  age: ''
              })
          },
          del(index){
              this.form.tableData.splice(index,1);
          }
      }
    };
    </script>
    

    el-table 数据是数组 , el-form 数据是 对象

    添加校验

    Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可。

    方法1:

    <el-form :rules='rules'  ...>
    
    <el-form-item :prop=" 'tableData.' + scope.$index + '.name' " :rules='rules.name'>
    
    data(){
    	return {
        	rules: {
    	        name: [
    	          { required: true, message: '名字不能为空', trigger: 'blur' }
    	        ]
    	      }
        }
    }
    

    方法2:
    <el-form-item :prop=" 'tableData.' + scope.$index + '.name' " :rules="{ required: true, message: '名字不能为空', trigger: 'blur' }">

     <el-table-column label="姓名">
       <template slot-scope="scope">
         <el-form-item :prop=" 'tableData.' + scope.$index + '.name' " 
            :rules="{ required: true, message: '名字不能为空', trigger: 'blur' }">
           <el-input v-model="scope.row.name"></el-input>
         </el-form-item>
       </template>
     </el-table-column>
    

    自己写校验方法

    方法1 : 对应上面的方法1,校验犯法写在data中.

    data() {
          var checkAge = (rule, value, callback) => {
            if (!value) {
              return callback(new Error('年龄不能为空'));
            }else if(!Number.isInteger(value) ){
                callback(new Error('请输入数字值'));
            }else if(value < 18){
                callback(new Error('必须年满18岁'));
            }else if(value >50){
                callback(new Error('小于50岁'));
            }else{
                callback();
            }
          };
          var checkName = (rule, value, callback) => {
              let regName =/^[\u4e00-\u9fa5]{2,4}$/;
            if (!value) {
              return callback(new Error('姓名不能为空'));
            }else if(!regName.test(value)){
                callback(new Error('请输入正确的姓名'));
            }else{
                callback();
            }
          };
        return {
          form: {
            tableData: [
              {
                name: "",
                age: ''
              }
            ]
          },
          rules: {
            name: [
              { required: true, trigger: 'blur' ,validator: checkName}
            ],
            age: [
              { required: true, trigger: 'blur', validator: checkAge}
            ],
          }
        };
      },
    

    方法2: 对应上面的方法2,校验犯法写在methods中.

    <el-form-item :prop=" 'tableData.' + scope.$index + '.name' " :rules=" { required: true, trigger: 'blur' ,validator: checkName}">
    
    <el-form-item :prop=" 'tableData.' + scope.$index + '.age' " :rules=" { required: true, trigger: 'blur' ,validator: checkAge}">
    
    methods:{
          checkAge  (rule, value, callback)  {
            if (!value) {
              return callback(new Error('年龄不能为空'));
            }else if(!Number.isInteger(value) ){
                callback(new Error('请输入数字值'));
            }else if(value < 18){
                callback(new Error('必须年满18岁'));
            }else if(value >50){
                callback(new Error('小于50岁'));
            }else{
                callback();
            }
          },
          checkName (rule, value, callback) {
            let regName =/^[\u4e00-\u9fa5]{2,4}$/;
            if (!value) {
              return callback(new Error('姓名不能为空'));
            }else if(!regName.test(value)){
                callback(new Error('请输入正确的姓名'));
            }else{
                callback();
            }
          }
      }
    

    同table中,某字段不能重复


    8.27 更新

    之前写了一个同table中,不能写相同的电话号码的校验,但是并不好。修改后如下

    <el-table-column label="电话号码">
       <template slot-scope="scope">
         <el-form-item
           :prop=" 'tableData.' + scope.$index + '.tel' "
           :rules=" { required: true, trigger: 'blur' ,validator: checkTel}"
         >
           <el-input
             v-model.number="scope.row.tel"
             type="number"
             @blur="telequalCheckblur(scope.$index,scope.row.tel)"
           ></el-input>
         </el-form-item>
       </template>
     </el-table-column>
    
    methods:{
    	checkTel(rule, value, callback) {
          let regTel = /^(((1[3456789][0-9]{1})|(15[0-9]{1}))+\d{8})$/;
          let index = rule.field.split(".")[1];
          if (!value) {
            return callback(new Error("电话号码不能为空"));
          } else if (!regTel.test(value)) {
            callback(new Error("请输入正确的电话号码"));
          } else if (this.telequalCheck(index, value)) {
            callback(new Error("电话号码重复,请重新填写"));
          } else {
            callback();
          }
        },
        //相等判断
        telequalCheck(index, value) {
          return this.form.tableData.some(({ tel }, i) => {
            console.log(i, index, i == index);
            return i == index ? false : tel === value;
          });
        },
    }
    

    9.14更新

    必填*显示

    1. 输入框前加*

    正常来说,在el-form中,使用rules的required: true,就能显示*了.
    因为是在表格中,所以表单就不使用label了,所以这时必填选项的*没有了.
    在这里插入图片描述
    注意:这里面label=' '必须有空格,否则还是没有*
    在这里插入图片描述


    9.17更新

    2. 表头加*

    1.el-table>添加 header-cell-class-name='required'

    参数说明类型可选值默认值
    header-cell-class-name表头单元格的 className 的回调方法,也可以使用字符串为所有表头单元格设置一个固定的 className。Function({row, column, rowIndex, columnIndex})/String

    在这里插入图片描述
    2. elment 有默认的样式,如果不想要,就换个class名字
    header-cell-class-name='requiredclass'

    <style>
    .requiredclass>div.cell::before{
      content: "*";
      color: #f56c6c;
      margin-right: 4px;
    }
    </style>
    

    在这里插入图片描述
    3. 只加某几个
    :header-cell-class-name='addHeaderCellClassName'

    addHeaderCellClassName({row, column, rowIndex, columnIndex}){
          if(columnIndex===0 || columnIndex===1){
            return 'requiredclass'
          }
        }
    

    在这里插入图片描述

    1. 自定义表头

    在需要添加*的位置添加自定义表头

    在这里插入图片描述

    .requiredclass::before{
      content: "*";
      color: #f56c6c;
      margin-right: 4px;
    }
    

    删除某行,同时删除这行的校验结果

    问题: 删除某行时,这行的校验结果不随着删除
    观察图片,删除第三行,第三行的校验结果,还在.
    在这里插入图片描述
    解决方法

    1. 删除时,对表单进行校验
    del(index) {
      this.form.tableData.splice(index, 1);
      this.$refs.form.validate()
    },
    
    1. row-key

    绑定row-key,绑定的值要保证存在且唯一

     <el-form ref="form" :model="form" label-width="20px">
          <el-table
            ref="table"
            :data="form.tableData"
            empty-text="暂无数据"
            header-cell-class-name="requiredclass"
            row-key='id'
          >
          ...
    
    
     form: {
        tableData: [
          {
            name: "张一",
            age: 19,
            id:'1',
            tel: 13333333332
          },
        ]
      }
    

    代码及展示地址

    展开全文
  • ftp-0.17-54.el6.x86_64.rpm

    热门讨论 2014-10-22 23:48:46
    linux el6 ftp 安装包,安装完成后,可以在服务器上使用客户端ftp命令 比如 ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 2.2.2) Name (127.0.0.1:root): 331 Please specify the password. ...
  • EL(表达式语言)

    万次阅读 2019-03-17 17:58:14
    EL(Expression Language,表达式语言)是JSP2.0中引入的一个新内容。通过EL可以简化在JSP开发中对对象的引用,从而规范页面代码,增加程序的可读性及维护性。EL为不熟悉Java语言页面开发的人员提供了一个开发Java ...

    EL(Expression Language,表达式语言)是JSP2.0中引入的一个新内容。通过EL可以简化在JSP开发中对对象的引用,从而规范页面代码,增加程序的可读性及维护性。EL为不熟悉Java语言页面开发的人员提供了一个开发Java Web应用的新途径。

    1、EL的基本语法

    EL表达式语法很简单,它以“${”开头,以“}”结束,中间为合法的表达式,具体的语法格式如下:

    ${expression}

    参数说明:

    expression:用于指定要输出的内容,可以是字符串,也可以是由EL运算符组成的表达式。

    技巧:由于EL表达式的语法以“${”开头,所以如果在JSP页面中要显示“${”字符串,必须在前面加上“\”符号,即“\${”,或者写成“$ {'${'}”,也就是用表达式来输出“${”符号。

    1.1 通过EL输出字符串

    在EL表达式中要输出一个字符串,可以将此字符串放在一对单引号或双引号内。

    示例:使用EL表达式输出字符串内容。

    ${'pan_junbiao的博客'}
    ${"pan_junbiao的博客"}

    1.2 通过EL访问数据

    通过EL提供的“[ ]”和“.”运算符可以访问数据。通常情况下,“[ ]”和“.”运算符是等价的,可以相互代替。

    访问JavaBean对象userInfo的id属性,可以写成以下两种形式:

    ${userInfo.id}
    ${userInfo["id"]}

    (1)点号操作符

    在使用EL时,EL表达式一般由两部分组成,如 ${userInfo.id},其中,“.”被称作点号操作符,在点号操作符左边可以是一个JavaBean对象,也可以是EL隐式对象,点号右边可以是JavaBean属性,也可以是一个映射键。

    (2)[ ]操作符

    如果使用EL操作数据组,则使用“.”操作符就不能进行有效的操作,这时应该使用“[ ]”,如 ${ list[0] }。但是这并不代表“[ ]”只能操作数组,“.”操作符可以操作的对象,都可以使用“[ ]”来进行操作,如 ${userInfo["id"]} ,注意使用“[ ]”操作符时,“[ ]”中必须包含有 " " 双引号(操作数组也可以写成${ list["0"] },等价于${ list[0] })。

    但是也不是所有情况都可以相互替代,例如,当对象的属性名中包括一些特殊的符号(-或.)时,就只能使用“[ ]”运算符来访问对象的属性。例如,${userInfo["user-id"]} 是正确的,而 ${userInfo.user-id} 则是错误的。另外,EL的“[ ]”运算符还有一个用途,就是用来获取数组或者List集合中的数据。

    示例:使用EL表达式访问人员信息数据。

    (1)创建名称为UserInfo的类,将其放置于com.pjb.bean包中,实现对人员信息的封装。

    package com.pjb.bean;
    
    /**
     * 人员信息类
     * 
     * @author pan_junbiao
     *
     */
    public class UserInfo
    {
    	private String name; // 用户姓名
    	private String blog; // 博客地址
    	private String[] interests; // 兴趣爱好
    
    	public String getName()
    	{
    		return name;
    	}
    
    	public void setName(String name)
    	{
    		this.name = name;
    	}
    
    	public String getBlog()
    	{
    		return blog;
    	}
    
    	public void setBlog(String blog)
    	{
    		this.blog = blog;
    	}
    
    	public String[] getInterests()
    	{
    		return interests;
    	}
    
    	public void setInterests(String[] interests)
    	{
    		this.interests = interests;
    	}
    }
    

    (2)创建ELShowUser.jsp页面,通过EL表达式显示人员信息。

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <jsp:useBean id="user" class="com.pjb.bean.UserInfo">
    	<jsp:setProperty name="user" property="name" value="pan_junbiao的博客" />
    	<jsp:setProperty name="user" property="blog" value="https://blog.csdn.net/pan_junbiao" />
    </jsp:useBean>
    <%
    	String[] interests = {"篮球","游泳","羽毛球"};
    	user.setInterests(interests);
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>通过EL访问数据</title>
    </head>
    <body>
    	用户姓名:${user.name} <br/>    <!-- 使用点操作符 -->
    	博客地址:${user["blog"]} <br/> <!-- 使用[]操作符 -->
    	兴趣爱好:${user.interests[0]}、${user.interests[1]}、${user.interests[2]} <br/>
    </body>
    </html>

    执行结果:

     

    2、EL的特点

    EL除了具有语法简单、使用方便的特点,还具有以下特点。

    (1)EL可以与JSTL结合使用,也可以与JavaScript语句结合使用。

    (2)EL中会自动进行类型转换。如果想通过EL输入两个字符串型数值(例如,number1和number2)的和,可以直接通过+号进行连接(例如,${number1+number2})。

    (3)EL不仅可以访问一般变量,而且还可以访问JavaBean中的属性以及嵌套属性和集合对象。

    (4)在EL中可以执行算术运算、逻辑运算、关系运算和条件运算等。

    (5)在EL中可以获得命名空间(PageContext对象,它是页面中所有其它内置对象的最大范围的集成对象,通过它可以访问其它内置对象)。

    (6)在使用EL进行除法运算时,如果0作为除数,则返回无穷大Infinity,而不返回错误。

    (7)在EL中可以访问JSP的作用域(request、session、application以及page)。

    (8)扩展函数可以与Java类的静态方法进行映射。

     

    3、与低版本的环境兼容——禁用EL

    如今EL已经是一项成熟、标准的技术,只要安装的Web服务器能够支持Servlet 2.4/JSP 2.0,就可以在JSP页面中直接使用EL。由于在JSP2.0以前版本中没有EL,所以JSP为了和以前的规范兼容,还提供了禁用EL的方法。JSP中提供了3种禁用EL的方法。

    如果在使用EL时,其内容没有被正确解析,而是直接将EL内容原样显示到页面中,包括$和{},则说明Web服务器不支持EL,那么就需要检查一下EL有没有被禁用。

    3.1 使用斜杠“\”符号

    使用斜杠符号是一种比较简单的禁用EL的方法。该方法只需要在EL的起始标记“${”前加上“\”符号,具体的语法如下:

    \${expression}

    说明:该语法适合只是禁用页面的一个或几个EL表达式的情况。

    3.2 使用page指令

    使用JSP的page指令也可以禁用EL表达式,其具体的语法格式如下:

    <%@ page isELIgnored="布尔值" %>

    参数说明:

    isELIgnored属性:用于指定是否禁用页面中的EL,如果属性值为true,则忽略页面中的EL,否则将解析页面中的EL。

    示例:如果要忽略页面中的EL,可以在页面的顶部添加一下代码:

    <%@ page isELIgnored="true" %>

    说明:该方法适合禁用一个JSP页面中的EL。

    3.3 在web.xml文件中配置<el-ignored>元素

    在web.xml文件中配置<el-ignored>元素可以实现禁用服务器中的EL。

    示例:在web.xml文件中配置<el-ignored>元素的具体代码如下:

    <jsp-config>
    	<jsp-property-group>
    		<url-pattern>*.jsp</url-pattern>
    		<el-ignored>true</el-ignored>	<!--将此处的值设置为false,表示使用EL-->
    	</jsp-property-group>
    </jsp-config>

    说明:该方法适用于禁用Web应用中的所有JSP页面中的EL。

     

    4、保留的关键字

    同Java一样,EL也有自己的保留关键字,在为变量命名时,应该避免使用这些关键字,包括在使用EL输出已经保存在作用域范围内的变量,也不能使用关键字,如果已经定义了,那么需要修改为其它的变量名。EL的保留关键字如下表所示。

    andeqgt
    instanceofdivor
    lefalseempty
    notltge

     

    5、EL的运算符

    EL可以访问数据运算符、算术运算符、关系运算符、逻辑运算符、条件运算符及empty运算符等。

    5.1 在EL中进行算术运算

    在EL中,也可以进行算术运算,同Java语言一样,EL提供了加、减、乘、除和求余5种算术运算符,各运算符及其用法,如下表所示。

    运算符功能示例结果
    +${19+1}20
    -${66-30}36
    *${52.1*10}521.0
    /或div${5/2}或${5 div 2}2.5
    ${9/0}或${9 div 0}Infinity
    %或mod求余${17%3}或${17 mod 3}2
    ${15%0}或${15 mod 0}将抛出异常:java.lang.ArithmeticException: / by zero

    5.2 在EL中判断对象是否为空

    在EL中,判断对象是否为空,可以通过empty运算符实现,该运算符是一个前缀(prefix)运算符,即empty运算符位于操作数前方,用来确定一个对象或变量是否为null或空。empty运算符的格式如下:

    ${empty expression}

    参数说明如下:

    expression:用于指定要判断的变量或对象。

    示例:定义两个request范围内的变量user1和user2,分别设置值为null和“”,然后通过empty运算符判断是否为空。

    <%
        request.setAttribute("user1", null);
        request.setAttribute("user2", "");
    %>
    
    ${empty user1}  <!-- 返回值:true -->
    ${empty user2}  <!-- 返回值:true -->

    另外,empty运算符也可以与not运算符结合使用,用于判断一个对象或变量是否非空。

    示例:判断request范围中的变量user1和user2是否为非空。

    <%
        request.setAttribute("user1", null);
        request.setAttribute("user2", "");
    %>
    
    ${not empty user1}  <!-- 返回值:false  -->
    ${not empty user2}  <!-- 返回值:false  -->

    5.3 在EL中进行逻辑关系运算

    在EL中,通过逻辑运算符和关系运算符可以实现逻辑关系运算。关系运算符用于实现对两个表达式的比较,进行比较的表达式可以是数值型,也可以是字符串型。而逻辑运算符,则常用于对boolean型数据进行操作。逻辑运算符和关系运算符经常一同使用。

    5.3.1 关系运算符

    在EL中,提供了6种关系运算符。这6种关系运算符不仅可以用来比较整数和浮点数,还可以用来比较字符串。关系运算符的使用格式如下:

    ${表达式1 关系运算符 表达式2}

    EL中提供的关系运算符如下表:

    5.3.2 逻辑运算符

    在进行比较运算时,如果涉及两个或两个以上的判断条件时,就需要应用逻辑运算符。EL的逻辑运算符如下表:

    示例:使用EL关系运算符和逻辑运算符。

    <%
        request.setAttribute("userName","pan_junbiao的博客");   //定义request范围内的变量userName
        request.setAttribute("age","30");		           //定义request范围内的变量age
    %>
    
    userName=${userName}<br>	<!-- 输入变量userName -->
    age=${age}<br>			<!-- 输入变量age -->
    \${userName!="" and (userName=="pan_junbiao的博客") }: <!-- 将EL原样输出 -->
    ${userName!="" and userName=="pan_junbiao的博客" }<br>  <!-- 输出由关系和逻辑运算符组成的表达式的值 -->
    \${userName=="pan_junbiao的博客" and age=="30" }:      <!-- 将EL原样输出 -->
    ${userName=="pan_junbiao的博客" and age=="30" }	       <!-- 输出由关系和逻辑运算符组成的表达式的值 -->

    执行结果:

    5.4 在EL中进行条件运算

    在EL中进行简单的条件运算,可以通过条件运算符实现。EL的条件运算符唯一的优点在于其非常简单和方便,和Java语言里的用法完全一致。其语法格式如下:

    ${条件表达式 ? 表达式1 : 表达式2}

    参数说明如下:

    条件表达式:用于指定一个条件表达式,该表达式的值为boolean型。可以由关系运算符、逻辑运算符和empty运算符组成。

    表达式1:用于指定当条件表达式的值为true时,将要返回的值。

    表达式2:用于指定当条件表达式的值为false时,将要返回的值。

    示例:使用条件运算符。

    <%
        request.setAttribute("userName","pan_junbiao的博客"); 
    %>
    
    ${empty userName ? "为空" : "非空" }  <!-- 返回值为:非空  -->

    说明:通常情况下,条件运算符可以用JSTL中的条件标签 <c:if> 或 <c:choose> 替代。

     

    6、EL的隐含对象

    为了能够获得Web应用程序中的相关数据,EL提供了11个隐含对象,这些对象类似于JSP的内置对象,也是直接通过对象名进行操作。在EL的隐含对象中,除pageContext是JavaBean对象,对应于 javax.servlet.jsp.PageContext类型外,其他的隐含对象都对应于 java.util.Map 类型。这些隐含对象可以分为页面上下文对象、访问作用域范围的隐含对象和访问环境信息的隐含对象3种。

    EL提供了11个隐含对象:

    隐含对象说明
    pageContext页面上下文对象为pageContext,用于访问JSP内置对象(例如request、response、out、session、exception和page等,但不能用于获取application、config和pageContext对象)和servletContext。在获取到这些内置对象后,就可以获取其属性值。
    pageScope用于返回包括 page(页面)范围内的属性值的集合,返回值为 java.util.Map 对象。
    requestScope用于返回包括 request(请求)范围内的属性值的集合,返回值为 java.util.Map 对象。
    sessionScope用于返回包括 session(会话)范围内的属性值的集合,返回值为 java.util.Map 对象。
    applicationScope用于返回包括 application(应用)范围内的属性值的集合,返回值为 java.util.Map 对象。
    param用于获取请求参数的值,应用在参数值只有一个的情况。在应用param隐含对象时,返回结果为字符串。
    paramValues用于当请求参数名对应多个值时获取参数的结果,在应用paramValues隐含对象时,返回结果为数组。
    header用于获取HTTP请求的一个具体的header的值。
    headerValues用于获取HTTP请求的一个具体的header的值,但是在有些情况下,可能存在同一个header拥有多个不同的值的情况,这时就必须使用headerValues隐含对象。
    initParam用于获取Web应用初始化参数的值。
    cookie用于获取cookie对象,如果在cookie中已经设置一个名为username的值,那么可以使用 ${cookie.username} 来获取该cookie对象。但是如果要获取cookie中的值,需要使用cookie对象的value属性。

    6.1 页面上下文对象

    页面上下文对象为pageContext,用于访问JSP内置对象(例如request、response、out、session、exception和page等,但不能用于获取application、config和pageContext对象)和servletContext。在获取到这些内置对象后,就可以获取其属性值。这些属性与对象的getXXX()方法相对应,在使用时,去掉方法名中的get,并将首字母改为小字即可。

    6.1.1 访问request对象

    通过pageContext获取JSP内置对象中的request对象,可以使用下面语句:

    ${pageContext.request}

    获取到request对象后,就可以通过该对象获取与客户端相关的信息。例如,HTTP报头信息、客户信息提交方式、客户端主机IP地址和端口号等。

    示例:访问getServerPort()方法,获取收到请求的端口号。

    ${pageContext.request.serverPort}

    这句代码将返回端口号:8080

    注意:不可以通过pageContext对象获取保存到request范围内的变量。如果需要获取,可以通过request对象范围内的变量名称,如下代码:

    <%
        request.setAttribute("userName","pan_junbiao的博客"); 
    %>
    
    ${userName}

    页面输出结果:pan_junbiao的博客

    6.1.2 访问response对象

    通过pageContext获取JSP内置对象中的response对象,可以使用下面语句:

    ${pageContext.response}

    获取到response对象后,就可以通过该对象获取与响应相关的信息。

    示例:获取响应的内容类型。

    ${pageContext.response.contentType}

    这句代码将返回响应的内容类型:text/html;charset=UTF-8

    6.1.3 访问out对象

    通过pageContext获取JSP内置对象中的out对象,可以使用下面语句:

    ${pageContext.out}

    获取到out对象后,就可以通过该对象获取与输出相关的信息。

    示例:输出缓冲区的大小。

    ${pageContext.out.bufferSize}

    这句代码将返回输出缓冲区的大小:8192

    6.1.4 访问session对象

    通过pageContext获取JSP内置对象中的session对象,可以使用下面语句:

    ${pageContext.session}

    获取到session对象后,就可以通过该对象获取与session相关信息。

    示例:获取session的有效时间。

    ${pageContext.session.maxInactiveInterval}

    这句代码将返回session的有效时间:1800秒,即30分钟。

    6.1.5 访问exception对象

    通过pageContext获取JSP内置对象中的exception对象,可以使用下面语句:

    ${pageContext.exception}

    获取到exception对象后,就可以通过该对象获取JSP页面的异常信息。

    示例:获取异常信息字符串。

    ${pageContext.exception.message}

    说明:在使用该对象时,也需要在可能出现错误的页面中指定错误处理页面,并且在错误处理页面中指定page指令的 isErrorPage 属性值为true,然后再使用上面的EL输出异常信息。

    6.1.6 访问page对象

    通过pageContext获取JSP内置对象中的page对象,可以使用下面语句:

    ${pageContext.page}

    获取到page对象后,就可以通过该对象获取当前页面的类文件。

    示例:获取到page对象后,就可以通过该对象获取当前页面的类文件。

    ${pageContext.page.class}

    6.1.7 访问servletContext对象

    通过pageContext获取JSP内置对象中的servletContext对象,可以使用下面语句:

    ${pageContext.servletContext}

    获取到servletContext对象后,就可以通过该对象获取servlet上下文信息。

    示例:获取上下文路径。

    ${pageContext.servletContext.contextPath}

    这句代码将返回当前页面的上下文路径:/firstweb

     

    6.2 访问作用域范围的隐含对象

    在EL中提供了4个用于访问作用域范围的隐含对象,即pageScope、requestScope、sessionScope和applicationScope。应用这4个隐含对象指定所要查找的标识符的作用域后,系统将不再按照默认的顺序(page、request、session及application)来查找相应的标识符。它们与JSP中的page、request、session及application内置对象类似。只不过这4个隐含对象只能用来取得指定范围内的属性值,而不能取得其他相关信息。

    6.2.1 pageScope隐含对象

    pageScope隐含对象用于返回包括 page(页面)范围内的属性值的集合,返回值为 java.util.Map 对象。

    示例:通过pageScope隐含对象读取page范围内的JavaBean的属性值。

    (1)创建一个名称为UserInfo的JavaBean对象,并将其保存到 com.pjb.bean 包中。

    package com.pjb.bean;
    
    /**
     * 人员信息类
     * 
     * @author pan_junbiao
     *
     */
    public class UserInfo
    {
    	private String name; // 用户姓名
    
    	public String getName()
    	{
    		return name;
    	}
    
    	public void setName(String name)
    	{
    		this.name = name;
    	}
    }

    (2)编写index.jsp页面,在该页面中使用<jsp:useBean>动作标签,创建一个page范围内的JavaBean实例,并设置name属性的值。

    <jsp:useBean id = "user" scope="page" class="com.pjb.bean.UserInfo">
    	<jsp:setProperty name = "user" property="name" value="pan_junbiao的博客"/>
    </jsp:useBean>

    (3)在index.jsp页面中的<body>标记中,使用pageScope隐含对象获取该JavaBean实例的name属性值。

    ${pageScope.user.name}

    运行本示例,将在显示:pan_junbiao的博客

    6.2.2 requestScope隐含对象

    requestScope隐含对象用于返回包括 request(请求)范围内的属性值的集合,返回值为 java.util.Map 对象。

    示例:获取保存在request范围内的变量值。

    <%
        request.setAttribute("userName", "pan_junbiao的博客");
    %>
    
    ${requestScope.userName}

    6.2.3 sessionScope隐含对象

    sessionScope隐含对象用于返回包括 session(会话)范围内的属性值的集合,返回值为 java.util.Map 对象。

    示例:获取保存在session范围内的变量值。

    <%
        session.setAttribute("userName", "pan_junbiao的博客");
    %>
    
    ${sessionScope.userName}

    6.2.4 applicationScope隐含对象

    applicationScope隐含对象用于返回包括 application(应用)范围内的属性值的集合,返回值为 java.util.Map 对象。

    示例:获取保存在application范围内的变量值。

    <%
        application.setAttribute("userName", "pan_junbiao的博客");
    %>
    
    ${applicationScope.userName}

     

    6.3 访问环境信息的隐含对象

    在EL中,提供了6个访问环境信息的隐含对象。下面将对这6个隐含对象进行详细介绍。

    6.3.1 param隐含对象

    param隐含对象用于获取请求参数的值,应用在参数值只有一个的情况。在应用param隐含对象时,返回结果为字符串。

    示例:使用param隐含对象获取请求参数的值。

    (1)在JSP页面中,<form>表单中放置一个名称为name的文本框。

    <input type="text" name="name"/>

    (2)当表单提交后,获取name文本框的值。

    ${param.name}

    6.3.2 paramValues隐含对象

    paramValues隐含对象用于当请求参数名对应多个值时获取参数的结果,在应用paramValues隐含对象时,返回结果为数组。

    示例:使用paramValues隐含对象获取请求参数名对应多个值。

    (1)在JSP页面中,<form>表单中放置一个名称为interests的复选框组。

    <input type="checkbox" name="interests" value="足球"  />足球
    <input type="checkbox" name="interests" value="篮球"  />篮球
    <input type="checkbox" name="interests" value="羽毛球"  />羽毛球
    <input type="checkbox" name="interests" value="乒乓球"  />乒乓球

    当表单提交后,获取interests复选框组的值。

    <%request.setCharacterEncoding("UTF-8"); %>
    ${paramValues.interests[0]}
    ${paramValues.interests[1]}
    ${paramValues.interests[2]}
    ${paramValues.interests[3]}

    注意:在应用param和paramValues隐含对象时,如果指定的参数不存在,则返回空字符串,而不是返回null。

    6.3.3 header和headerValues隐含对象

    header隐含对象用于获取HTTP请求的一个具体的header的值,但是在有些情况下,可能存在同一个header拥有多个不同的值的情况,这时就必须使用headerValues隐含对象。

    示例:获取HTTP请求的header的connection(是否需要持久连接)属性。

    ${header.connection} 或者 ${header["connection"]}

    输出结果:Keep-Alive 或者 Keep-Alive

    但是,如果要获取HTTP请求的header的user-agent属性,则必须使用以下EL表达式:

    ${header["user-agent"]}

    输出结果:Mozilla/5.0 (Windows NT 6.2; Win64; x64; Trident/7.0; rv:11.0) like Gecko

    6.3.4 initParam隐含对象

    initParam隐含对象用于获取Web应用初始化参数的值。

    示例:使用initParam隐含对象获取Web应用初始化参数的值。

    (1)在Web应用的 web.xml 文件中设置一个初始化参数author,用于指定作者。

    <context-param>
    	<param-name>author</param-name>
    	<param-value>pan_junbiao的博客</param-value>
    </context-param>

    (2)使用initParam隐含对象获取初始化参数author的值。

    作者:${initParam.author}

    输出结果:作者:pan_junbiao的博客

    6.3.5 cookie隐含对象

    虽然在EL中并没有提供向cookie中保存值的方法,但是它提供了访问有请求设置的cookie的方法,这可以通过cookie隐含对象实现。如果在cookie中已经设置一个名为username的值,那么可以使用 ${cookie.username} 来获取该cookie对象。但是如果要获取cookie中的值,需要使用cookie对象的value属性。

    示例:使用response对象设置一个请求有效的cookie对象,然后再使用EL获取该cookie对象的值。

    <%
    	Cookie cookie = new Cookie("user","pan_junbiao的博客");
    	response.addCookie(cookie);
    %>
    
    cookie对象中保存的值:${cookie.user.value}

    输出结果:cookie对象中保存的值:pan_junbiao的博客

    说明:所谓的cookie是一个文本文件,它是以key、value的方法将用户会话信息记录在这个文本文件内,并将其暂时存放在客户端浏览器中。

     

    7、定义和使用EL的函数

    在EL中,允许定义和使用函数。下面将介绍如何定义和使用EL函数。

    7.1 定义和使用函数

    函数的定义和使用可以分为以下3个步骤。

    (1)编写一个Java类,并在该类中编写公用的静态方法,用于实现自定义EL函数的具体功能。

    (2)编写标签库描述文件,对函数进行声明。该文件的扩展名为.tld,被保存到Web应用的WEB-INF文件夹下。

    (3)在JSP页面中引用标签库,并调用定义的EL函数,实现相应的功能。

    示例:定义EL函数处理字符串中的回车换行符和空格符。

    (1)编写一个Java类,名称为StringDeal,将其保存在com.pjb.el包中,在该类中添加一个公共静态方法shiftEnter(),在该方法中替换输入字符串中的回车换行符为<br>,空格符为“&nbsp;”,最后返回新替换后的字符串。

    package com.pjb.el;
    
    /**
     * 字符串公共处理类
     * 
     * @author pan_junbiao
     *
     */
    public class StringDeal
    {
    	/**
    	 * 定义公用的静态方法:替换字符串中的回车换行符
    	 * 
    	 * @param str 字符串内容
    	 * @return
    	 */
    	public static String shiftEnter(String str)
    	{
    		String newStr = str.replaceAll("\r\n", "<br>"); // 替换回车换行符
    		newStr = newStr.replaceAll(" ", "&nbsp;");// 替换空格符
    		return newStr;
    	}
    }

    (2)编写标签库描述文件,名称为 stringDeal.tld,并将其保存到 WEB-INF 文件夹下。

    <?xml version="1.0" encoding="UTF-8"?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    	web-jsptaglibrary_2_0.xsd"
    	version="2.0">
    	<tlib-version>1.0</tlib-version>
    	<uri>/stringDeal</uri>
    	<function>
    		<name>shiftEnter</name>
    		<function-class>com.pjb.el.StringDeal</function-class>
    		<function-signature>java.lang.String shiftEnter(java.lang.String)</function-signature>
    	</function>
    </taglib>

    参数说明:

    <uri>标记:用于指定tld文件的映射路径。在应用EL函数时,需要使用该标记指定的内容。

    <name>标记:用于指定EL函数所对应方法的方法名,通常与Java文件中的方法名相同。

    <function-class>标记:用于指定EL函数所对应的Java文件,这里需要包括包名和类名。

    <function-signature>标记:用于指定EL函数所对应的静态方法,这里包括返回值的类型和入口参数的类型。在指定这些类型时,需要使用完整的类型名。

    (3)编写index.jsp页面,在该页面中添加一个表单及表单元素,用于收集内容信息。

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>定义EL函数处理字符串中的回车换行符和空格符</title>
    </head>
    <body>
    	<form name="form1" method="post" action="deal.jsp">
    		<textarea name="content" cols="50" rows="5"></textarea>
    		<br>
    		<input type="submit" name="Button" value="提交" >
    	</form>
    </body>
    </html>

    (4)编写表单的处理页面deal.jsp页面,在该页面中应用上面定义的EL函数,对获取到的内容信息进行处理后显示到页面中。

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib uri="/stringDeal" prefix="strDeal" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>显示结果</title>
    </head>
    <body>
    	内容为:<br>
    	${strDeal:shiftEnter(param.content)}
    </body>
    </html>

    执行结果:

    (1)输入文本的index.jsp页面。

    (2)点击“提交”后,显示处理结果的deal.jsp页面。

     

    展开全文
  • element的el-form和el-table嵌套使用

    千次阅读 2020-08-24 09:12:31
    <template> <div> <el-form :model="addJsonForm" ref="addJsonForm" :rules="addJsonForm.addJsonRules" :inline="true" ...el-table :data="addJsonForm.params" style="width: 10

    一、element的el-form和el-table嵌套使用

    要点:

    1. :model="addJsonForm" 给表单绑定数据,addJsonForm 是传入表单的数据对象
    2. 注意表单数据对象 addJsonForm 的定义:属性 params (可按需求命名)为表单内嵌套的表格的显示数据,数组类型; 属性 addJsonRules ,为表单绑定的验证规则。
    3. el-table 采用自定义列模板,可自定义表头, el-form 表单项绑定对应的字段名和校验规则
    4. :prop="'params.' + scope.$index + '.name'" 绑定传入Form 组件的 model 中对应的字段 name
    5. :rules="addJsonForm.addJsonRules.name" 绑定表单验证规则
    <template>
      <div>
        <el-form
          :model="addJsonForm"
          ref="addJsonForm"
          :rules="addJsonForm.addJsonRules"
          :inline="true"
          label-width="108px"
        >
          <el-table :data="addJsonForm.params" style="width: 100%" border>
            <el-table-column type="selection" width="55" align="center">
            </el-table-column>
    
            <el-table-column align="center">
              <template slot="header" slot-scope="scope">
                <span style="color:#2d65dc;">成员名称</span>
                <i style="color:#F56C6C;">*</i>
              </template>
              <template slot-scope="scope">
                <el-form-item
                  :prop="'params.' + scope.$index + '.name'"
                  :rules="addJsonForm.addJsonRules.name"
                >
                  <el-input
                    type="text"
                    v-model="scope.row.name"
                    autocomplete="off"
                  ></el-input>
                </el-form-item>
              </template>
            </el-table-column>
            <el-table-column align="center">
              <template slot="header" slot-scope="scope">
                <span style="color:#2d65dc;">成员值</span>
                <i style="color:#F56C6C;">*</i>
              </template>
              <template slot-scope="scope">
                <el-form-item
                  :prop="'params.' + scope.$index + '.value'"
                  :rules="addJsonForm.addJsonRules.value"
                >
                  <el-input
                    type="text"
                    v-model="scope.row.value"
                    autocomplete="off"
                  ></el-input>
                </el-form-item>
              </template>
            </el-table-column>
          </el-table>
        </el-form>
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          addJsonForm: {
            params: [
              {
                name: "",
                value: ""
              }
            ],
            addJsonRules: {
              name: [
                { required: true, message: "请输入成员名称", trigger: "blur" }
              ],
              value: [
                { required: true, message: "成员值不能为空", trigger: "blur" }
              ]
            }
          }
        };
      }
    };
    </script>
    

    在这里插入图片描述

    二、应用实例

    点击添加的时候,动态增加表格的行数,点击删除的时候,删除表格的行数据。

    在这里插入图片描述
    近期更新: 因评论区问到后续如何用 Form 表单的 resetFields 方法,这里就新加一个重置功能。

    <template>
      <div>
        <el-button @click="showPopup">点击显示弹框</el-button>
        <h3>
          dataSourceJson: <span>{{ FormInAddPopup.dataSourceJson }}</span>
        </h3>
        <el-dialog
          class="comn_dialog"
          title="添加数据"
          :visible.sync="addJsonVisible"
          width="415px"
          top="23vh"
        >
          <el-button @click="addTableItem">添加</el-button>
          <el-button @click="delTableItem">删除</el-button>
          /* 近期更新 */
          <el-button @click="resetForm('myForm')">重置</el-button> 
          <el-form
            :model="addJsonForm"
            ref="addJsonForm"
            :rules="addJsonForm.addJsonRules"
            :inline="true"
            label-width="108px"
          >
            <el-table
              :data="addJsonForm.params"
              style="width: 100%"
              border
              @selection-change="addJsonSelectionChange"
            >
              <el-table-column type="selection" width="55" align="center">
              </el-table-column>
    
              <el-table-column align="center">
                <template slot="header" slot-scope="scope">
                  <span style="color:#2d65dc;">成员名称</span>
                  <i style="color:#F56C6C;">*</i>
                </template>
                <template slot-scope="scope">
                  <el-form-item
                    :prop="'params.' + scope.$index + '.name'"
                    :rules="addJsonForm.addJsonRules.name"
                  >
                    <el-input
                      type="text"
                      v-model="scope.row.name"
                      autocomplete="off"
                    ></el-input>
                  </el-form-item>
                </template>
              </el-table-column>
              <el-table-column align="center">
                <template slot="header" slot-scope="scope">
                  <span style="color:#2d65dc;">成员值</span>
                  <i style="color:#F56C6C;">*</i>
                </template>
                <template slot-scope="scope">
                  <el-form-item
                    :prop="'params.' + scope.$index + '.value'"
                    :rules="addJsonForm.addJsonRules.value"
                  >
                    <el-input
                      type="text"
                      v-model="scope.row.value"
                      autocomplete="off"
                    ></el-input>
                  </el-form-item>
                </template>
              </el-table-column>
            </el-table>
          </el-form>
          <span slot="footer" class="dialog-footer">
            <el-button @click="resetAddJsonPopup">取 消</el-button>
            <el-button type="primary" @click="submitAddJsonPopup">确定</el-button>
          </span>
        </el-dialog>
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          addJsonVisible: false,
          addJsonMultiple: [],
          FormInAddPopup: {
            dataSourceJson: "" // 获取到的dataJson,显示为 [{name:"",value:""},{name:"",value:""}] 的格式
          },
          tabItemId: 1, // 表格数据的 id
          addJsonForm: {
            params: [
              {
                name: "",
                value: "",
                tabItemId: 1 // 弹框中,删除空行的唯一标志,默认从1开始
              }
            ],
            addJsonRules: {
              name: [
                { required: true, message: "请输入成员名称", trigger: "blur" }
              ],
              value: [
                { required: true, message: "成员值不能为空", trigger: "blur" }
              ]
            }
          }
        };
      },
      methods: {
      // 近期更新
        resetForm(formName) {
          this.$refs[formName].resetFields();
       },
        RndNum(n) {
          // 生成随机数
          let rdmNum = "";
          for (let i = 0; i < n; i++) {
            rdmNum += Math.floor(Math.random() * 10); // [0,10)的整数
          }
          return rdmNum;
        },
        showPopup() {
          
          this.addJsonVisible = true;
        },
        addJsonSelectionChange(val) {
          this.addJsonMultiple = val;
        },
        resetAddJsonPopup() {
          //关闭 固定值弹窗
          this.$set(this.addJsonForm, "params", []);
          this.addJsonVisible = false;
        },
        submitAddJsonPopup() {
          //保存 固定值
          if (this.addJsonMultiple.length > 0) {
            this.$refs["addJsonForm"].validate(valid => {
              if (valid) {
                let result = [];
                this.addJsonMultiple.map(val => {
                  this.$delete(val, "tabItemId"); // 删除tabItemId属性
                  result.push(val);
                });
                result.length ? (result = JSON.stringify(result)) : (result = "");
                this.FormInAddPopup.dataSourceJson = result;
                this.addJsonVisible = false;
              } else {
                return false;
              }
            });
          } else {
            this.$message.warning("请选择要保存的数据");
          }
        },
        addTableItem() {
          this.tabItemId = "T" + this.RndNum(6); //生成以T开头的七位随机数
          this.addJsonForm.params.push({
            name: "",
            value: "",
            tabItemId: this.tabItemId
          });
        },
    
        delTableItem() {
          // 确认删除
          if (this.addJsonMultiple.length > 0) {
            let arrs = [];
            let ids = this.addJsonMultiple.map(val => val.tabItemId); //拿到选中的数据id,
            this.addJsonForm.params.forEach(item => {
              if (!ids.includes(item.tabItemId)) {
                // 当id在params中,表示数据被选中,该将其删除,即将不被选中的保留
                arrs.push(item);
              }
            });
            this.addJsonForm.params = arrs;
          } else {
            this.$message.warning("请选择要删除的数据");
          }
        }
      }
    };
    </script>
    
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • el-select的选择以后返回对象实现方法郁闷的开始 郁闷的开始 人一旦出现死脑筋,就会非常累。今天我就出奇的郁闷,上次遗留的一个问题,周末正好有时间,想好好看看解决掉他,打开代码,各种尝试,调试,就是没好转...
  • Element el-row el-col 布局组件详解

    万次阅读 多人点赞 2021-01-27 10:18:12
    1. 背景 element的布局方式与bootstrap...el-row>标签标识,然后每行内的列使用<el-col>标识,至于每列整行的宽度比例,则使用:span属性进行设置。 如下代码,即为将1行等分为2列,为了便于区分列,我们为列
  • 目录简介el-form表单的实现及非空验证el-upload,只允许上传一张图片的实现步骤el-form中,实现el-upload的验证 简介 目前在做一个商城后台管理系统,在实现表单的过程中需要上传商品图片、二维码、头像等,每次只能...
  • 蜜蜂EL编辑器V3.6

    热门讨论 2012-11-18 02:54:30
    蜜蜂EL编辑器V3.6
  • Element el-radio 单选框详解

    千次阅读 2021-01-29 15:43:26
    1. 用途 单选框使用的场景非常普遍,用于列出多个选项,供用户选择其中一个。 注意Select选择器也可以从多个选项中选择一个,单选框的优势是可以在界面上同时显示所有选项,缺点是选项多时占用...el-radio v-model=
  • 在vue项目中,el-tabs在页面的右侧显示,切换面板,下面的内容是正常显示的 效果如下: 代码如下: 父组件 <el-card> <span>数据信息</span> <el-tabs class="tabRight" v-model=...
  • 文章目录简介使用安装对 ...简介 element-ui 的 el-select 与 el-tree 组件的功能组合。 在线实例:https://yujinpan.github.io/el-select-tree/ 使用 安装 npm install --save el-select-tree 对 element-ui 的...
  • el-table使用与样式修改大全

    千次阅读 2019-11-14 09:08:50
    Element-UI,el-table样式修改大全 开篇:修改element的样式的时候style标签不能加上scoped所以为了防止修改的样式影响到别的页面,建议在当前页面加一个id,修改时带上id,或者在样式前面加上 /deep/ ,控制修改的...
  • gd-devel-2.0.35-11.el6.x86_64.rpm

    热门讨论 2014-01-09 13:44:38
    redhat 6.4 安装nginx可能会报错./configure: error: the HTTP image filter module requires the GD library. You can either do not enable the module or install the...rpm -ivh gd-devel-2.0.35-11.el6.x86_64.rpm
  • element-UI 下拉框el-select组件el-option的v-for问题 我的代码: &lt;template&gt; &lt;div id="htmlWrap"&gt; &lt;!--header--&gt; &lt;div class="bg545C64"...
  • el-api.jar

    热门讨论 2012-03-06 16:51:52
    有javax.el.FunctionMapper类
  • 动态渲染 Element UI el-menu 组件

    万次阅读 2019-01-08 22:23:16
    相信大家在使用 Element UI 中 el-menu 组件的时候,都碰到过如何通过数据动态渲染的问题,而官方的文档却没有这个实例,网上找的一些博客大部分人都实现了 el-menu 的垂直模式,而水平模式却没有,并且垂直模式的 ...
  • Element el-input 输入框详解

    万次阅读 2021-02-02 10:15:56
    1. 用途 ...Element提供了功能和样式丰富的输入框,本篇就来了解下。 2. 输入框 输入框为el-input,其编译后生成的HTML元素为input,样式class中包含el-input,所以我们首先设定下统一样式,...el-input v-model="input1
  • src/views/oms/print/label/Index.vue   ...el-card&gt; &lt;div slot="header" class="clearfix"&gt; &lt;span&gt;标签&lt;/span&g
  • EL编辑器v3.3.0+终结版

    热门讨论 2013-02-13 22:06:39
    诛仙422EL编辑器!想要的拿走,不要钱了!!我晕死还要超过20个字这个网站真恶心!!!!
  • vue el-table 实现行内编辑

    千次阅读 2019-09-20 15:37:14
    vue el-table 实现行内编辑
  • 页面效果 html代码:弹框:表单中包含图片上传的组件el-upload ... <!-- 弹框 --> <div class="dialog">...el-dialog :title="formTitle" :visible.sync="dialogFormVisible">...el-form :model...
  • element-ui中el-container容器与div布局区分

    万次阅读 热门讨论 2019-04-09 18:03:29
    el-container:外层容器。当子元素中包含 或 时,全部子元素会垂直上下排列,否则会水平左右排列。 el-header:顶栏容器。 el-aside:侧边栏容器。 el-main:主要区域容器。 el-footer:底栏容器。 以上组件...
  • el-dialog 及其封装、使用

    万次阅读 2019-02-12 17:50:09
    el-diolog弹框: src/views/oms/pickAddress/DialogAddress.vue &lt;template&gt; &lt;el-dialog center :title="title" :visible.sync="innerVisible" width...
  • el-select 示例: 代码: <el-select v-model="doc.zhic" placeholder="请选择"> <el-option v-for="(item,index) in zhicdata" :key="index" :l...
  • EL表达式语法

    千次阅读 2018-12-25 21:01:01
    EL(是Expression Language的缩写),使用EL对JSP输出进行优化,可以使得页面结构更加清晰,代码可读性高,也更加便于维护。 使用EL表达式的目的:从作用域中获取指定属性名的共享数据 <%@ page isELIgnored=...
  • el-form表单验证

    千次阅读 2020-12-08 21:18:48
    el-form 上,model绑定的数据是json对象格式 el-form-item 上,prop绑定的值必须可以通过 . 的方式从el-form上的model绑定的对象中找到(即prop值和el-form-item中model的名字一致) 例如设置某动态表单 <!--表...
  • Element el-button 按钮组件详解

    万次阅读 2021-01-27 16:07:45
    el-button按钮的分类基本是靠颜色区分的,另外还有一种文本按钮type="text",文本按钮由于比较小,比较适合用于表格每行的操作栏部分。 按钮分类: <el-button>默认</el-button> <el-button type=...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 651,951
精华内容 260,780
关键字:

el