day31-33 对于e.target的使用要小心

这篇博客展示了如何使用JavaScript为HTML元素添加onclick事件,动态生成带有全选和单选功能的复选框。通过e.target获取触发事件的对象,并根据用户选择更新其他复选框的状态,实现全选和单选的联动交互。代码中详细解释了事件处理函数内的逻辑判断,以及如何通过DOM操作来选取和修改相关元素。

对于onclick事件,每一次的e.target所获得的对象取决于onclick的地方。与变量不同。
实例代码:

<html>
  <body>
    <div id="region-radio-wrapper"></div>
    <div id="product-radio-wrapper"></div>
    <div id="table-wrapper"></div>
    <script>
      var checkboxDiv1 = document.querySelector("#region-radio-wrapper");
      var checkboxDiv2 = document.querySelector("#product-radio-wrapper");

      var checkboxOption1 = [
        {
          value: 1,
          text: "华东",
        },
        {
          value: 2,
          text: "华北",
        },
        {
          value: 3,
          text: "华南",
        },
      ];
      var checkboxOption2 = [
        {
          value: 1,
          text: "手机",
        },
        {
          value: 2,
          text: "笔记本",
        },
        {
          value: 3,
          text: "智能音箱",
        },
      ];
      function generate(checkboxDiv, checkboxOption) {
        var span1 = document.createElement("span");
        checkboxDiv.appendChild(span1);
        var inputAll = document.createElement("input");
        span1.textContent = "全选:";
        span1.appendChild(inputAll);
        inputAll.setAttribute("checkbox-type", "all");
        inputAll.type = "checkbox";
        for (i = 0; i < checkboxOption.length; i++) {
          var span = document.createElement("span");
          checkboxDiv.appendChild(span);
          var input = document.createElement("input");
          span.textContent = " " + checkboxOption[i]["text"] + ":";
          span.appendChild(input);
          input.setAttribute("checkbox-type", "one");
          input.type = "checkbox";
        }
        checkboxDiv.onclick = function (e) {
          var source = e.target;
          if (source.type == "checkbox") {
            var customA = source.getAttribute("checkbox-type");
            var input2 = source.parentNode.parentNode
              .querySelector("span:nth-of-type(2)")
              .querySelector("input");
            var input3 = source.parentNode.parentNode
              .querySelector("span:nth-of-type(3)")
              .querySelector("input");
            var input4 = source.parentNode.parentNode
              .querySelector("span:nth-of-type(4)")
              .querySelector("input");
            if (customA == "all") {
              if (source.checked == true) {
                if (
                  //有一个不是true
                  input2.checked != true ||
                  input3.checked != true ||
                  input4.checked != true
                ) {
                  source.checked = true;
                  input2.checked = true;
                  input3.checked = true;
                  input4.checked = true;
                }
              } else {
                e.preventDefault();
              }
            } else {
              if (
                //全是true
                input2.checked == true &&
                input3.checked == true &&
                input4.checked == true
              ) {
                inputAll.checked = true;
              }
              if (inputAll.checked == true) {
                if (
                  input2.checked != true ||
                  input3.checked != true ||
                  input4.checked != true
                ) {
                  inputAll.checked = false;//我曾经把这里写错了写成了source.checked
                }
              }
            }
          }
        };
      }
      generate(checkboxDiv1, checkboxOption1);
      generate(checkboxDiv2, checkboxOption2);
    </script>
  </body>
</html>

D:\BaiduNetdiskDownload\tomcat\apache-tomcat-8.5.31-windows-x64\apache-tomcat-8.5.31\bin\catalina.bat run [2025-09-08 09:27:02,880] Artifact day16_request__response:war exploded: Waiting for server connection to start artifact deployment... Using CATALINA_BASE: "C:\Users\28395\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\9c3fb1b9-ebbb-42cb-94dd-c90ba23f9216" Using CATALINA_HOME: "D:\BaiduNetdiskDownload\tomcat\apache-tomcat-8.5.31-windows-x64\apache-tomcat-8.5.31" Using CATALINA_TMPDIR: "D:\BaiduNetdiskDownload\tomcat\apache-tomcat-8.5.31-windows-x64\apache-tomcat-8.5.31\temp" Using JRE_HOME: "D:\Java" Using CLASSPATH: "D:\BaiduNetdiskDownload\tomcat\apache-tomcat-8.5.31-windows-x64\apache-tomcat-8.5.31\bin\bootstrap.jar;D:\BaiduNetdiskDownload\tomcat\apache-tomcat-8.5.31-windows-x64\apache-tomcat-8.5.31\bin\tomcat-juli.jar" NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED Connected to the target VM, address: '127.0.0.1:61406', transport: 'socket' 08-Sep-2025 21:27:04.179 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.5.31 08-Sep-2025 21:27:04.182 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Apr 27 2018 20:24:25 UTC 08-Sep-2025 21:27:04.182 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 8.5.31.0 08-Sep-2025 21:27:04.182 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Windows 11 08-Sep-2025 21:27:04.182 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 10.0 08-Sep-2025 21:27:04.182 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64 08-Sep-2025 21:27:04.182 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: D:\Java 08-Sep-2025 21:27:04.182 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 17.0.5+9-LTS-191 08-Sep-2025 21:27:04.183 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation 08-Sep-2025 21:27:04.183 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\28395\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\9c3fb1b9-ebbb-42cb-94dd-c90ba23f9216 08-Sep-2025 21:27:04.183 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\BaiduNetdiskDownload\tomcat\apache-tomcat-8.5.31-windows-x64\apache-tomcat-8.5.31 08-Sep-2025 21:27:04.184 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED 08-Sep-2025 21:27:04.184 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED 08-Sep-2025 21:27:04.185 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 08-Sep-2025 21:27:04.185 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=C:\Users\28395\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\9c3fb1b9-ebbb-42cb-94dd-c90ba23f9216\conf\logging.properties 08-Sep-2025 21:27:04.185 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 08-Sep-2025 21:27:04.185 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:61406,suspend=y,server=n 08-Sep-2025 21:27:04.185 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -javaagent:C:\Users\28395\AppData\Local\JetBrains\IntelliJIdea2022.2\captureAgent\debugger-agent.jar 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote= 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.port=1099 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.ssl=false 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.password.file=C:\Users\28395\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\9c3fb1b9-ebbb-42cb-94dd-c90ba23f9216\jmxremote.password 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.access.file=C:\Users\28395\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\9c3fb1b9-ebbb-42cb-94dd-c90ba23f9216\jmxremote.access 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.rmi.server.hostname=127.0.0.1 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs= 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=C:\Users\28395\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\9c3fb1b9-ebbb-42cb-94dd-c90ba23f9216 08-Sep-2025 21:27:04.186 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=D:\BaiduNetdiskDownload\tomcat\apache-tomcat-8.5.31-windows-x64\apache-tomcat-8.5.31 08-Sep-2025 21:27:04.187 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=D:\BaiduNetdiskDownload\tomcat\apache-tomcat-8.5.31-windows-x64\apache-tomcat-8.5.31\temp 08-Sep-2025 21:27:04.187 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Native library [1.2.16] using APR version [1.6.3]. 08-Sep-2025 21:27:04.187 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true]. 08-Sep-2025 21:27:04.187 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true] 08-Sep-2025 21:27:05.091 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.0.2m 2 Nov 2017] 08-Sep-2025 21:27:05.129 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"] 08-Sep-2025 21:27:05.170 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 08-Sep-2025 21:27:05.175 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"] 08-Sep-2025 21:27:05.178 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 08-Sep-2025 21:27:05.179 信息 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1269 ms 08-Sep-2025 21:27:05.209 信息 [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] 08-Sep-2025 21:27:05.209 信息 [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.31 08-Sep-2025 21:27:05.217 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] 08-Sep-2025 21:27:05.225 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"] 08-Sep-2025 21:27:05.230 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 50 ms Connected to server [2025-09-08 09:27:05,586] Artifact day16_request__response:war exploded: Artifact is being deployed, please wait... 08-Sep-2025 21:27:05.805 警告 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [5.0]. Default version will be used. 08-Sep-2025 21:27:05.912 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/day16]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1736) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:814) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:814) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310) at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1412) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.IllegalArgumentException: The servlets named [com.example.day16_request__response.c_http_request_03.RequestDemo05Servlet] and [com.example.day16_request__response.c_http_request_03.RequestDemo06Servlet] are both mapped to the url-pattern [/RequestDemo05Servlet] which is not permitted at org.apache.tomcat.util.descriptor.web.WebXml.addServletMappingDecoded(WebXml.java:326) at org.apache.tomcat.util.descriptor.web.WebXml.addServletMapping(WebXml.java:319) at org.apache.catalina.startup.ContextConfig.processAnnotationWebServlet(ContextConfig.java:2379) at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2056) at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1942) at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1936) at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1936) at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1936) at org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource(ContextConfig.java:1936) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1143) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:765) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5154) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 43 more 08-Sep-2025 21:27:05.917 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method manageApp java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/day16]] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:758) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1736) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:814) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:814) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310) at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1412) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) 08-Sep-2025 21:27:05.929 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method createStandardContext javax.management.RuntimeOperationsException: Exception invoking method manageApp at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:308) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:814) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:482) at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:431) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:814) at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:802) at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1472) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1310) at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1412) at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200) at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197) at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196) at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587) [2025-09-08 09:27:05,946] Artifact day16_request__response:war exploded: Error during artifact deployment. See server log for details. at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/day16]] at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:758) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1736) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) ... 34 more 错误原因
09-09
from turtledemo.penrose import start import numpy as np import torch import time import math torch.set_printoptions(8) def gelu(x): """ Task: Use the torch API to implement the approximate calculation formula of the `GELU` activation function. The formula is as follows (you need to paste it into the latex online conversion website) Website: https://www.latexlive.com/ Input: Tensor Output: Tensor """ return 0.5*x*(1+torch.tanh(math.sqrt(2/math.pi)*(x+0.044715*torch.pow(x,3)))) def softmax(x,dim=-1): """ Task: Use torch API to implement `softmax` function, search the specific formula by yourself Input: Tensor Output: Tensor """ x_max=torch.max(x,dim=dim,keepdim=True).values x_stable=x-x_max exp_x=torch.exp(x_stable) return exp_x/torch.sum(exp_x,dim=dim,keepdim=True) def layer_norm(x, g_b, eps:float = 1e-5): """ Task: Use torch API to implement `layernorm` function, search `layernorm` by yourself Input: x: Tensor g_b: dictionary that load from gpt2 weight. g-gamma and b-bias are the keys Output: Tensor """ """ if torch.isnan(x).any(): print("Nan\n") assert(0)""" g, b = torch.Tensor(g_b['g']), torch.Tensor(g_b['b']) x = x.clone().detach().to(torch.float32) g=g.to(x.device) b=b.to(x.device) normalized_shape=g.shape dims=list(range(-len(normalized_shape),0)) #warning # if not isinstance(x, torch.Tensor): # x = torch.tensor(x, dtype=torch.float32) x = x.float() # print(x,"/n") mean=x.mean(dim=-1,keepdim=True) var=x.var(dim=-1,keepdim=True) x_=(x-mean)/torch.sqrt(var+eps) #print(x_*g+b,"/n") return x_*g+b def linear(x, w_b): # [m, in], [in, out], [out] -> [m, out] """ Task: implement linear layer Input: x: Tensor w_b: dictionary that load from gpt2 weight. w-weight and b-bias are the keys Output: Tensor """ w, b = torch.Tensor(w_b['w']), torch.Tensor(w_b['b']) w,b=w.to(x.device),b.to(x.device) # print(torch.matmul(x,w)+b) return torch.matmul(x,w)+b #warning def ffn(x, mlp): # [n_seq, n_embd] -> [n_seq, n_embd] """ Task: use `gelu` `linear` to implement ffn Notes: x --linear--> --gelu--> --linear--> output Input: x: Tensor mlp: dictionary that load from gpt2 weight. w_b1 and w_b2 are the params of two linear layer Output: Tensor """ w_b1, w_b2 = mlp['c_fc'], mlp['c_proj'] # print(x,"\n") x=linear(x,w_b1) x=gelu(x) x=linear(x,w_b2) return x def attention(q, k, v, mask,past_kv=None): # [n_q, d_k], [n_k, d_k], [n_k, d_v], [n_q, n_k] -> [n_q, d_v] """ Task: use torch API to implement attention computation according to formula(1) of the following paper where d_k account for the last dimension of `k` Paper: https://arxiv.org/abs/1706.03762 Input: q: Tensor k: Tensor v: Tensor mask: Tensor mlp: dictionary that load from gpt2 weight. w_b1 and w_b2 are the params of two linear layer Output: Tensor """ if past_kv is not None: past_key,past_value= past_kv k=torch.cat([past_key,k],dim=0) v=torch.cat([past_value,v],dim=0) current_k=(k,v) atten_score=torch.matmul(q,k.transpose(-2,-1)) d_k=k.size(-1) atten_score=atten_score/torch.sqrt(torch.tensor(d_k,dtype=atten_score.dtype)) if mask is not None: if past_kv is not None: seq_len=k.size(0) #warning causal_mask=torch.triu(torch.ones(seq_len,seq_len)*-1e9,diagonal=1) causal_mask=causal_mask[-q.size(0):] else: causal_mask=mask atten_score=atten_score.masked_fill_(causal_mask==0,-1e9) atten_weights=softmax(atten_score) output=torch.matmul(atten_weights,v) return output,current_k def mha(x, attn, n_head,past_kv=None): # [n_seq, n_embd] -> [n_seq, n_embd] """ Task: Complete the code of the multi-head attention Input: x: Tensor attn: dictionary that load from gpt2 weight. c_attn and c_proj are the params of two linear layer n_head: number of head Output: Tensorying multi-head attention and linear transformation, shape [n_seq, n_embd]. """ c_attn, c_proj = attn['c_attn'], attn['c_proj'] # qkv projection #print(x,"/n") x = linear(x, c_attn) # [n_seq, n_embd] -> [n_seq, 3*n_embd] #print(x,"/n") # Split into qkv """ Task: Split the q,k,v matrix from the tensor x Notes: [n_seq, 3*n_embd] -> 3 * [n_seq, n_embd] """ n_seq,n_embd=x.shape n_embd_total=n_embd//3 q,k,v=torch.split(x,n_embd_total,dim=-1) qkv =[q,k,v] # need to modify #warning4 # Split into heads qkv_heads = [qkv_part.chunk(n_head, dim=-1) for qkv_part in qkv] # 3 * [n_seq, n_embd] -> 3 * n_head * [n_seq, n_embd/n_head] qkv_heads = list(zip(*qkv_heads)) # [3, n_head, n_seq, n_embd/n_head] # Causal mask to hide future inputs from being attended to """ Task: Construct mask matrix Notes: | 0 -inf -inf ... -inf | | 0 0 -inf ... -inf | | 0 0 0 ... -inf | |... ... ... ... ... | | 0 0 0 ... 0 | Mask is a tensor whose dimension is [n_seq, n_seq] """ if past_kv is None: past_kv_per_head = [None] * n_head else: past_kv_per_head = past_kv if past_kv is None: causal_mask = torch.triu(torch.ones(n_seq, n_seq) * -1e9, diagonal=1) else: causal_mask = None causal_mask = torch.triu(torch.ones(n_seq, n_seq)*-1e9, diagonal=1)#warning3 # need to modify out_heads=[] new_kv_per_head=[] for i,(q,k,v) in enumerate(qkv_heads):#warning out_head,new_kv=attention(q,k,v,causal_mask,past_kv_per_head[i]) out_heads.append(out_head) new_kv_per_head.append(new_kv) # Perform attention over each head # Merge heads """ Task: merge multi-heads results Notes: n_head * [n_seq, n_embd/n_head] --> [n_seq, n_embd] """ # print(x,"/n") x = torch.cat(out_heads,dim=-1) # need to modify # # Out projection x = linear(x, c_proj) # [n_seq, n_embd] -> [n_seq, n_embd] #print(x,"/n") return x,new_kv_per_head def transformer_block(x, block, n_head,past_kv=None): # [n_seq, n_embd] -> [n_seq, n_embd] mlp, attn, ln_1, ln_2 = block['mlp'], block['attn'], block['ln_1'], block['ln_2'] # print(x,"/n") # multi-head causal self attention #print(x,"/n") attn_out,new_kv=mha(layer_norm(x,ln_1),attn,n_head,past_kv) x = x + attn_out # [n_seq, n_embd] -> [n_seq, n_embd] #problem A!!!! #print(x,"/n") # position-wise feed forward network x = x + ffn(layer_norm(x, ln_2), mlp) # [n_seq, n_embd] -> [n_seq, n_embd] return x,new_kv def gpt2(inputs, params, n_head,past_kvs=None): # [n_seq] -> [n_seq, n_vocab] wte, wpe, blocks, ln_f = params['wte'], params['wpe'], params['blocks'], params['ln_f'] # token + positional embeddings wte=torch.Tensor(wte) wpe=torch.Tensor(wpe) if past_kvs is None: x = wte[inputs] + wpe[range(len(inputs))] # [n_seq] -> [n_seq, n_embd] start_pos=0 else: x=wte[inputs[-1:]]+wpe[[len(inputs)-1]] start_pos=len(inputs)-1 # print(x.shape,params,n_head,"1/n") # x = transformer_block(x, blocks, n_head=n_head) #print(x.shape,"2/n") #print(x,"/n") # forward pass through n_layer transformer blocks x=torch.Tensor(x) new_past_kvs=[] for i,block in enumerate(blocks): past_kv=past_kvs[i] if past_kvs is not None else None #warning x ,new_kv= transformer_block(x, block, n_head=n_head,past_kv=past_kv) # [n_seq, n_embd] -> [n_seq, n_embd] new_past_kvs.append(new_kv) # projection to vocab # print(x,"/n") x = layer_norm(x, ln_f) # [n_seq, n_embd] -> [n_seq, n_embd] return x @ wte.T,new_past_kvs # [n_seq, n_embd] -> [n_seq, n_vocab] def apply_repetition_penalty(logits, generated_tokens, penalty=1.2): for token in set(generated_tokens[-20:]): if token < len(logits): logits[token] = logits[token] / penalty return logits def generate(inputs, params, n_head, n_tokens_to_generate,temperature=0.8, repetition_penalty=1.2): from tqdm import tqdm past_kvs = None generated=inputs.copy() for _ in tqdm(range(n_tokens_to_generate), "generating"): # auto-regressive decode loop logits ,past_kvs= gpt2(generated, params, n_head,past_kvs) # model forward pass # next_id = np.argmax(logits[-1]) # greedy sampling #warning # print(logits,"/n") # inputs.append(int(next_id)) # append prediction to input last_logits=logits[-1] last_logits=apply_repetition_penalty(last_logits, generated, repetition_penalty) if temperature>0: last_logits=last_logits/temperature probs=softmax(last_logits,dim=-1) next_id=torch.multinomial(probs,num_samples=1).item() else:next_id=torch.argmax(last_logits).item() generated.append(next_id) return generated[len(inputs):] # only return generated ids def greedy_speculative_generate(inputs, draft_params, target_params, hparams_draft, hparams_target, n_tokens_to_generate, K): """ Task: Load 124M and 1558M models at the same time, use greedy sampling, and complete speculative decoding Inputs: inputs (list): The initial list of token IDs from the prompt. draft_params, target_params: Model weights for the draft and target models. hparams_draft, hparams_target: Hyperparameters for both models. n_tokens_to_generate (int): The number of new tokens to generate. K (int): The number of tokens the draft model speculates at each step (e.g., 4). Returns: list: A list of newly generated token IDs. """ draft_past_kvs=None target_past_kvs=None generated_ids = [] current_inputs = list(inputs) while len(generated_ids) < n_tokens_to_generate: draft_tokens=[] draft_inputs=list(current_inputs) draft_current_past_kvs=draft_past_kvs for _ in range(K): if len(generated_ids)+len(draft_tokens)>=n_tokens_to_generate: break logits=gpt2(draft_inputs,draft_params,hparams_draft['n_head'],past_kvs=draft_current_past_kvs) #warning5 next_id=np.argmax(logits[-1]) draft_tokens.append(next_id) draft_inputs.append(next_id) if not draft_tokens: break # warning6 target_input=current_inputs+draft_tokens target_current_past_kvs=target_past_kvs target_logits,target_current_past_kvs=gpt2(target_input,target_params,hparams_target['n_head'],target_current_past_kvs) # warning 7 accepted_token=[] for i, draft_token in enumerate(draft_tokens): target_position=len(current_inputs)+i target_token=np.argmax(target_logits[target_position].detach().numpy()) if draft_token==target_token: accepted_token.append(draft_token) else: accepted_token.append(target_token) break #print(accepted_token,"/n") if len(accepted_token)==len(draft_tokens): draft_past_kvs=draft_current_past_kvs target_past_kvs=target_current_past_kvs else: draft_past_kvs=None generated_ids.extend(accepted_token) current_inputs.extend(accepted_token) return generated_ids def main(prompt: str, n_tokens_to_generate: int = 5, model_size: str = "124M", models_dir: str = "models"): from utils import load_encoder_hparams_and_params # load encoder, hparams, and params from the released open-ai gpt-2 files encoder, hparams, params = load_encoder_hparams_and_params(model_size, models_dir) # encode the input string using the BPE tokenizer input_ids = encoder.encode(prompt) # make sure we are not surpassing the max sequence length of our model assert len(input_ids) + n_tokens_to_generate < hparams["n_ctx"] # generate output ids start = time.time() output_ids = generate(input_ids, params, hparams["n_head"], n_tokens_to_generate,temperature=0.7,repetition_penalty=1.2) end = time.time() print(f"Time taken to generate {n_tokens_to_generate} tokens: {end - start:.2f}s") # print("/n output_ids/n",output_ids) # decode the ids back into a string output_text = encoder.decode(output_ids) # print(output_text) return output_text if __name__ == "__main__": import fire fire.Fire(main)这个大模型的输出是 that become become become one day become one day one day become one day one one day one day one day one one one one one one one one one one one one one one one one one one one预计输出是the most powerful machine on the planet,怎么修改得到正确结果
最新发布
10-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值