尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
JavaWeb图书管理系统:Eclipse+Tomcat环境搭建与排错
第二天的工作说白了就一件事让 JavaWeb 图书管理系统在 Eclipse 里真正跑起来Tomcat 能启动、页面能打开、控制台不报红。头一天把需求和表结构理顺了代码一行没写第二天一上来就要面对环境配置这一关很多人就是卡在这里放弃的——工程建好了右键 Run on Server浏览器弹出来一个 404然后开始怀疑人生。我这些年带过不少刚接触 Web 开发的同学第二天的翻车率其实比写业务代码那天还高因为环境问题给出的报错信息往往极其含糊一个 404 背后可能是路径、部署、注解、版本四种原因。这篇就把第二天的完整流程拆开讲从版本对齐、Eclipse 挂 Tomcat、建工程、写第一个 Servlet、部署访问到各类报错的排查路径全部是能直接照着复现的操作也把那些文档里不写、只有踩过才知道的细节一并交代清楚。1. 第二天到底要交付什么先把目标钉死1.1 头一天留下的半成品还缺哪几块第一天的产出通常是一堆文档需求清单、表结构、页面草图外加一份图书表、读者表、借阅记录表的字段设计。这些东西在纸面上是完整的但在工程层面等于零。第二天的验收标准我一般定得非常具体打开 Eclipse工程结构正确Tomcat 能在 Server 视图里启动浏览器输入一个地址能看到图书列表这四个字加两条假数据控制台没有任何红色堆栈。就这么点事但它串起了整条链路链路通了后面写 DAO、写 JSP 只是往这个骨架里填肉。为什么要把标准定得这么死因为 Web 开发最容易出现局部正确、整体不通的状态。你的 Servlet 代码写得再漂亮如果类没编译进build/classes或者WEB-INF/lib里缺了驱动包容器一样给你 500。第二天的核心价值不是产出多少代码而是把代码到容器到浏览器这条通路验证一遍后面每加一个功能都能立刻看到效果反馈循环就建立起来了。反过来通路没打通就闷头写三天业务第四天集中调试那才是灾难。我在实际操作里会给自己定一个最小可运行切片一个 Servlet硬编码两条图书记录输出一段 HTML。不连数据库不引任何第三方包。这样任何报错都只可能来自环境本身排查范围极小。等这个切片跑通再加 JDBC再加连接池出问题就能立刻定位到是新加的东西引入的而不是在二十个变量里猜。1.2 为什么这套老组合还在被拿来练手现在新项目很少这么起了但教学和练手场景里Eclipse 加 Tomcat 依然是最合适的组合之一。原因不复杂Tomcat 是一个纯粹的 Servlet 容器不做太多魔法你写的 Servlet 怎么被加载、web.xml怎么被解析、WEB-INF为什么不能被浏览器直接访问这些机制它都摆在明面上。用重量级框架起步这些东西全被封装掉了出了问题只能靠猜。图书管理系统这种规模的练手项目正好需要你把请求进来、容器分发、Servlet 处理、响应回去这条链走一遍走通了后面理解任何框架的过滤器、拦截器、路由都有底子。另一个现实原因是可控性。Tomcat 的目录结构简单到你能手动改配置文件、手动扔 war 包、手动看日志logs目录下的catalina.out和localhost.log里写得明明白白。我在排查部署问题时最常用的手段就是直接去看wtpwebapps下面到底有没有我的 class 文件这个动作在封装程度高的环境里根本做不了。所以第二天坚持用这套组合把地基打牢我认为是划算的哪怕后面要换。1.3 三个版本号必须对得上这是后面所有问题的源头新手最容易忽略的就是版本。我这里说的不是越新越好而是三者之间的兼容关系。Servlet 规范在 Tomcat 10 做了一次大迁移包名从javax.servlet换成了jakarta.servlet这个变化意味着你在网上抄的任何一段import javax.servlet.http.HttpServlet;在 Tomcat 10 上都会直接编译不过。很多人第二天的第一个 500 就是这么来的。下面这张表是我自己整理的对齐关系照着选基本不会出问题组件推荐版本关键约束踩坑说明JDK8 或 11与 Tomcat 大版本匹配编译级别一致JDK 17 配 Tomcat 8.5 会出现反射相关告警甚至启动失败Tomcat9.0.x使用javax.servlet包名生态资料最多教程基本都基于它Tomcat10.1.x使用jakarta.servlet包名抄旧代码必改 importweb.xml命名空间也要换Eclipse带 Enterprise Java and Web 的版本必须含 WTP 插件标准版没有 Dynamic Web Project 选项Servlet 规范4.0配 Tomcat 9与web.xml的version属性对应版本写错会导致注解扫描失效我的建议很直接练手阶段就用 JDK 8 或 11 加 Tomcat 9。不是因为新版本不好而是因为你在搜索框里敲进去的每一个报错九成以上的答案都基于这个组合能省掉大量辨别成本。等你把整条链路摸透了再迁移到新版本那时候你已经有能力自己看官方迁移说明了。2. 环境搭建把 Eclipse 和 Tomcat 接上2.1 安装路径的选择比想象中重要装 JDK 和 Tomcat 的时候路径里不要有空格不要有中文不要有括号。这条规则听起来像是老生常谈但它是真实存在的故障源。Program Files带空格某些脚本和启动参数在拼接时会被截断中文路径在某些编码环境下会变成乱码目录名导致 Tomcat 找不到CATALINA_HOME。我自己的习惯是统一放在一个短路径下比如D:\dev\jdk和D:\dev\tomcat9一眼就能看清。环境变量按老规矩配JAVA_HOME指向 JDK 根目录不是binCATALINA_HOME指向 Tomcat 根目录然后把%JAVA_HOME%\bin和%CATALINA_HOME%\bin加进Path。配完必须验证不能想当然java -version javac -version两个命令输出的版本号必须一致。我见过太多次java -version显示 1.8 而javac -version显示 17 的情况原因是机器上装了两套 JDKPath里顺序错了。这种状态下 Eclipse 编译用的是 17Tomcat 运行用的是 8出现的错误会非常诡异比如编译通过但运行时报UnsupportedClassVersionError。这一类问题只要一开始花两分钟验证后面能省几个小时。顺手把 Tomcat 单独启动一次不通过 Eclipse直接双击bin\startup.bat。窗口里刷出一堆日志最后停在Server startup in xxx ms浏览器打开http://localhost:8080能看到默认页说明 Tomcat 本身没问题。这一步的意义在于把Tomcat 能不能跑和Eclipse 配得对不对两个问题拆开出问题时你能立刻判断是哪一层的锅。看完记得用shutdown.bat关掉否则后面 Eclipse 启动时会报端口占用。2.2 在 Eclipse 里挂载运行时环境打开 Eclipse先确认视图里有 Server 面板。没有的话从Window Show View Other里搜 Servers 调出来。然后在面板空白处右键New Server展开目录选 Tomcat 对应的版本下一步会让你指定 Tomcat 的安装目录选到D:\dev\tomcat9这一层JRE 选你配好的那套 JDK。Eclipse 会自动识别CATALINA_HOME下的配置点 Finish。这一步有两个细节值得说。第一Server 面板里创建的这个服务器实例本质上是 Eclipse 在 workspace 的.metadata目录下复制了一份 Tomcat 配置它是一个虚拟的服务器定义不是你磁盘上那个 Tomcat 目录的实时映射。第二双击这个服务器实例会打开一个配置页面里面有个Server Locations区域默认选的是Use workspace metadata部署路径指向.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps。这个路径记住了后面排查部署问题全靠它。如果项目跑起来发现改了代码不生效或者想直接看容器里到底有什么把这里改成Use Tomcat installation部署路径就变成 Tomcat 安装目录下的webapps所见即所得。反过来用 metadata 模式的好处是多个工程互不干扰也不会污染 Tomcat 本体。我个人的用法是开发阶段保持默认遇到明明改了却没生效的怪问题时临时切过去看一眼看完再切回来。还有一点配置页面里的Ports部分能看到 HTTP/1.1 端口默认 8080。如果这台机器上已经有别的东西占了 8080开发机上太常见了在这里改成 8081 就行改完记得访问地址也跟着换。别去手动改 Tomcat 目录下的server.xml因为 Eclipse 用的是它自己那份副本改原文件不生效很多人在这上面浪费过时间。2.3 目录结构与编译输出路径必须心里有数工程建好之后Package Explorer 里会看到这么几个节点src、JRE System Library、Java Resources、WebContent新版本 Eclipse 里叫src/main/webapp或者直接显示为Deployment Descriptor附近的WebContent。这里最容易混淆的是源码在哪和编译产物在哪。标准的 Dynamic Web Project 结构是这样的Java 源码放在src编译后输出到build/classesJSP、HTML、CSS 这些静态和动态页面放在WebContent下第三方 jar 包放WebContent/WEB-INF/libWebContent/WEB-INF/web.xml是部署描述文件。关键点在于WebContent下的东西会被原样拷贝到部署目录而src下的.java文件会被编译成.class后放进WEB-INF/classes源码本身不会进部署目录。这个映射关系决定了三个高频故障。一是类找不到WebContent/WEB-INF/classes下没有对应的 class 文件说明没编译成功去看 Problems 视图或者build/classes目录是不是空的。二是jar 包不生效你把 jar 拖到了工程根目录而不是WEB-INF/lib编译期能识别但运行期容器找不到因为容器的类加载器只扫WEB-INF/lib和WEB-INF/classes。三是页面 404HTML 放错了位置放到WEB-INF里面去了那个目录是受保护的浏览器永远访问不到。提示WEB-INF目录是容器的保护区域里面的任何资源都不能通过 URL 直接访问只能由服务端转发。JSP 放在这里反而是一种安全实践但静态页面放进去就等着 404 吧。顺便把源码编码固定下来。Window Preferences General Workspace里的 Text file encoding 设成 UTF-8Java Compiler里的编译级别和 JRE 版本对齐。这一步现在花两分钟能避免后面大量的中文乱码问题具体原因在第 5 节展开。3. 建工程从 Dynamic Web Project 到第一个 Servlet3.1 创建工程时那几个勾选项的真正含义File New Dynamic Web Project第一页填工程名比如BookManagerTarget runtime 选刚才挂的 Tomcat 9Dynamic web module version 选 4.0。这个版本号不是随便选的它对应web.xml里的version属性也决定了容器怎么解析配置。选 3.1 和选 4.0 在功能上差别不大但两者与 Tomcat 9 的匹配度都很好如果误选了 5.0而 Tomcat 是 9就会在部署时报规范不支持的警告。第二页的 Source folders 和 Context root 值得看一眼。Context root 默认等于工程名这意味着你的访问地址前缀是/BookManager。我建议保持默认别改成一个看不出所以然的名字因为后面所有路径拼接都要用到它改错一次就是一连串 404。Content directory 默认WebContent保持。点 Finish 之后如果弹出问你要不要生成web.xml一定要选生成。虽然 Servlet 3.0 之后可以用WebServlet注解代替配置但初学阶段把web.xml留着你能直观看到 URL 是怎么映射到类的出问题时也有一个明确的排查入口。生成的web.xml大概是这个样子?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 display-nameBookManager/display-name /web-app如果这个文件打开是空白的或者报 schema 相关错误说明网络环境拿不到 xsd 校验不影响运行可以忽略但 XML 头部声明一定要完整否则容器解析时可能直接抛异常。3.2 web.xml 配置与注解方式先弄清各自的适用场景图书管理系统的第二天我一般会让两种方式都跑一遍目的是建立直观认知。web.xml方式长这样servlet servlet-nameBookListServlet/servlet-name servlet-classcom.demo.book.web.BookListServlet/servlet-class /servlet servlet-mapping servlet-nameBookListServlet/servlet-name url-pattern/book/list/url-pattern /servlet-mapping注解方式则把这两段揉进类上WebServlet(name bookList, urlPatterns /book/list) public class BookListServlet extends HttpServlet { // ... }两种方式有个必须知道的冲突规则如果同一个 Servlet 既在web.xml里配置了类上又加了注解注解会被忽略以配置文件为准这一行为在不同容器版本上略有差异稳妥做法是只用一种。我见过有同学改了半天注解里的路径不生效最后发现web.xml里还留着一段旧配置两个url-pattern打架。实际选型上我倾向用注解理由是可维护性好改路径不用在两个文件之间跳。但有一种情况必须用web.xml需要配置welcome-file-list、filter的顺序、error-page这些全局元素的时候。图书管理系统后面大概率要做登录拦截、字符编码过滤器那时候web.xml还是要回来改的所以两种都熟悉一下没坏处。3.3 第一个 Servlet 与图书列表页的实操在src下建包com.demo.book.web新建一个类继承HttpServlet重写doGet。这个阶段先不连数据库把数据硬编码在内存里目的只有一个验证请求能进来、响应能出去。代码大概是这样package com.demo.book.web; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; WebServlet(/book/list) public class BookListServlet extends HttpServlet { private static final long serialVersionUID 1L; Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType(text/html;charsetUTF-8); req.setCharacterEncoding(UTF-8); ListString[] books Arrays.asList( new String[]{1, 深入理解计算机系统, 技术类, 在架}, new String[]{2, 长日将尽, 文学类, 借出} ); PrintWriter out resp.getWriter(); out.println(!DOCTYPE htmlhtmlheadmeta charsetUTF-8); out.println(title图书列表/title/headbody); out.println(h2图书列表共 books.size() 条/h2); out.println(table border1 cellpadding8); out.println(trth编号/thth书名/thth分类/thth状态/th/tr); for (String[] b : books) { out.println(tr); for (String cell : b) { out.println(td cell /td); } out.println(/tr); } out.println(/table/body/html); out.flush(); } }几个地方值得单独说。resp.setContentType(text/html;charsetUTF-8)必须写在getWriter()之前因为一旦拿到 Writer响应头就锁定了后面再设字符集不生效中文就成问号。serialVersionUID不写虽然能跑但编译器会给黄色警告养成写上的习惯。包名里带web是为了以后和dao、service分层第二天就把分层骨架立起来比后面重构省事。还有一种写法是用 JSP 做展示、Servlet 只负责取数据然后forward。图书管理系统最终肯定走这条路但第二天我建议先用PrintWriter直出一次你能清楚看到响应体的每一个字节是怎么产生的理解Servlet 就是一个输出流的包装这件事。等这个通了再换成 JSP你会立刻明白 JSP 本质上是容器帮你把 Servlet 写好了。页面能出来之后可以再往下走一小步建一个Book实体类把String[]换掉。这一步改动很小但能让后面的 DAO 层有个明确的类型不用对着下标的b[1]猜哪个字段是书名。第二天的进度到这里我觉得就够满了再往下就该连数据库了。4. 部署与访问路径最容易翻车的一段4.1 Server 视图的部署流程与三种启动方式工程建好了代码写了真正把它送进Tomcat 有两种方式。第一种是拖拽在 Servers 视图里右键服务器实例选Add and Remove把工程挪到右侧的 Configured 列表里。第二种是直接右键工程Run As Run on ServerEclipse 自动帮你完成添加和部署。新手用第二种更快但第一种你能清楚看到哪些工程被部署了多工程场景下更好管理。启动服务器有三种状态要分清Start 是正常启动会加载所有已配置的工程Debug 是以调试模式启动可以打断点、看变量步骤和 Start 一样只是多了 JPDA 监听Start 旁边的Restart和Publish则用于重新发布。我踩过最多的坑是改了代码之后不重启也不重新发布直接刷新浏览器然后惊讶地发现没生效。原因是 Eclipse 的自动发布有延迟而且某些改动比如web.xml、注解路径必须重启服务器才生效热替换只对方法体内部的改动有效。判断有没有发布成功最快的办法是去部署目录看一眼。前面说过路径在.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps进去应该能看到一个以BookManager命名的文件夹里面有WEB-INF、META-INFWEB-INF下又有classes\com\demo\book\web\BookListServlet.class。如果classes是空的或者不存在那说明编译都没过问题在 Java Build Path不在部署。4.2 URL 怎么拼一个字符都不能错这是第二天 404 的头号成因。完整的访问地址由三段组成http://localhost:8080 / 上下文路径 / Servlet 映射路径 http://localhost:8080 / BookManager / book/list三段里任何一段错一个字符就是 404。上下文路径默认等于工程名BookManager大小写敏感Servlet 映射路径是注解里写的/book/list开头必须有斜杠末尾不能有多余斜杠。我见过写成book/list少斜杠、/book/list/多斜杠、/BookManager/book/list重复拼接的各种版本。更隐蔽的一种是工程名改了但 Server 里还挂着旧的部署声明导致上下文路径和你想的不一样。排查这类问题的标准动作是直接访问http://localhost:8080/BookManager/看能不能出来欢迎页。如果这一步就 404说明上下文路径不对或者工程没部署如果这一步正常只有具体路径 404说明是 Servlet 映射的问题。把问题二分效率立刻上来了。再补一个容易忽略的点web.xml里如果配了welcome-file-list指向index.jsp但你把index.jsp建在了WEB-INF下那么访问根路径也会 404因为容器找不到可用的欢迎文件且受保护目录不能被直接请求。欢迎文件的位置必须在WebContent根下。4.3 什么时候该 Clean什么时候不用Project Clean这个动作在 Eclipse 里被滥用了很多人一遇到问题就先 Clean。它实际做的事是删掉build目录重新编译所有源码代价是几秒到几十秒的等待。真正需要 Clean 的场景其实有限删除过源文件但build/classes里还残留旧 class、改了包名目录结构却没有同步、第三方 jar 换版本后编译缓存不对。不需要 Clean 的场景刚改了一个方法内部的逻辑只需要重启服务器刚改了一个 JSP只需要刷新浏览器JSP 会被容器重新编译刚改了web.xml重启服务器即可。频繁 Clean 除了浪费时间没别的效果而且如果编译真有错误Clean 只会让你多等一遍再看到同样的红叉。我自己的习惯是改代码之后先看 Problems 视图有没有红叉没有就直接重启服务器验证。连续两次不生效才去看部署目录里的 class 时间戳对不对最后才考虑 Clean。这个顺序能覆盖绝大多数情况也比无脑 Clean 快得多。5. 报错排查实录第二天最常撞上的几堵墙5.1 启动阶段端口被占和 JVM 参数服务器起不来控制台第一行经常是Port 8080 required by Tomcat v9.0 Server at localhost is already in use。原因可能是上一次的 Tomcat 没关干净也可能是别的程序占了端口。排查命令netstat -ano | findstr :8080拿到最后一列的 PID再执行taskkill /F /PID 12345杀完再启动。如果不想杀就在 Server 配置页把端口改成 8081访问地址同步改。另一种情况是 Eclipse 自己的进程卡死了任务管理器里能看到残留的javaw.exe直接结束进程比在 Eclipse 里反复重启更干脆。还有一类启动报错跟 JVM 有关比如java.lang.OutOfMemoryError: Metaspace说明类加载的元空间不够。在 Server 配置页打开Open launch configuration切到 Arguments 标签在 VM arguments 里加-Xms256m -Xmx512m -XX:MaxMetaspaceSize256m。这几个参数的含义分别是堆初始值、堆最大值、元空间上限。开发阶段给这么大完全够用不要一上来就设成几个 G机器扛不住还拖慢启动。5.2 访问阶段404 与 500 的区分思路这两种错误性质完全不同但新手常常混为一谈。404 是找不到资源说明请求根本没打到你的 Servlet 上问题在路径层500 是服务器内部错误说明请求打到了代码执行过程中抛了异常问题在代码层。判断方法很简单看控制台有没有堆栈。有堆栈就是 500没堆栈就是 404。404 的排查顺序我固定按这个来先确认服务器确实起来了浏览器访问http://localhost:8080再确认工程部署了Add and Remove里在右侧列表再确认上下文路径默认等于工程名区分大小写最后确认映射路径注解或web.xml里的url-pattern。四级下来基本能定位。500 的排查主要看堆栈的第一行Caused by。常见的几个NullPointerException一般是某个对象没初始化比如req.getParameter()拿到 null 就直接调方法ClassNotFoundException多半是 jar 没放进WEB-INF/libNoSuchMethodError是 jar 版本冲突同一个类的不同版本被同时加载了。5.3 中文乱码三种位置三种治法乱码在图书管理系统里几乎必然出现因为书名全是中文。这里要分清乱码出现在哪一层控制台输出乱码、页面显示乱码、数据库存取乱码。三种的成因完全不同。控制台乱码通常是 Eclipse 的 Console 编码和 JVM 的输出编码不一致。改法在Run Configurations Common Encoding设成 UTF-8或者在 VM arguments 里加-Dfile.encodingUTF-8。注意这是控制台显示问题数据本身可能是对的。页面乱码要检查两处Servlet 里resp.setContentType(text/html;charsetUTF-8)有没有写在getWriter()之前以及 HTML 的meta charsetUTF-8有没有。这两处任意一处缺失都会让浏览器用错误的编码解析字节流。如果是 POST 提交的中文参数变乱码还要加req.setCharacterEncoding(UTF-8)而且这行必须写在第一次调用getParameter之前否则无效。数据库乱码是第三层涉及连接串里的characterEncoding参数和表的字符集。这一块第二天还没碰到但提前说一句建库建表时统一用utf8mb4连接串里带上useUnicodetruecharacterEncodingUTF-8能省掉后面九成的麻烦。5.4 一张速查表出问题先对一遍下面这张表是我这几年攒下来的第二天遇到问题我基本先扫一眼这里现象最可能的原因快速验证处理方式启动报端口占用8080 被旧进程占用netstat -ano查 PID结束进程或改端口没有 Dynamic Web Project 选项Eclipse 是标准版缺 WTP看 New 菜单有没有 Web 分类换企业版或装插件访问根路径 404工程未部署或上下文路径不符看Add and Remove右侧列表重新添加工程访问 Servlet 路径 404映射路径拼错对照注解和地址栏逐字符核对注意斜杠页面 500 且堆栈含 ClassNotFoundjar 位置放错看WEB-INF/lib有无该 jar移到 lib 下并重新发布500 且堆栈含 NullPointer参数或对象未判空看堆栈行号对应的变量加判空和默认值中文显示为问号响应头字符集缺失看响应头 Content-Type在 getWriter 前设置POST 参数乱码请求编码未设打印参数原始字节首行加 setCharacterEncoding改了代码不生效未重新发布或未重启看部署目录 class 时间戳重启服务器或 Publish控制台中文乱码控制台编码非 UTF-8其他英文输出是否正常改 Run Configuration 编码注意表里的快速验证一列是重点。排查的核心不是猜原因而是用最小成本把可能性砍掉一半。养成先验证再动手的习惯比记住一百个结论都有用。6. 几个只有踩过才知道的细节工作空间的路径不要放在中文目录或者带空格的路径下这一点前面提过但它引发的问题往往不是直接报错而是某些资源加载失败后给出莫名其妙的提示。我遇到过一次web.xml明明存在却提示找不到最后发现是工程所在路径里有中文容器解析路径时截断了。挪到纯英文短路径下立刻正常。这种问题排查起来极其耗时因为报错信息完全指向错误的方向。工程拷贝这件事也值得说。把别人的BookManager整个文件夹拷到自己 workspace 里直接Import Existing Projects into Workspace经常会遇到唐突的红叉原因是.project和.classpath里记录的还是对方的 Tomcat 运行时名称和 JDK 版本。稳妥做法是新建一个同名工程把src、WebContent、web.xml手工搬过去让 Eclipse 重新生成元数据。多花五分钟少折腾两小时。另外养成看logs目录的习惯。Eclipse 的 Console 视图只显示一部分输出容器完整的启动日志、部署日志、异常堆栈在 Tomcat 的logs目录下localhost.yyyy-mm-dd.log里通常能找到 Console 里被截断的关键信息。我在排查部署失败时第一反应就是去翻这个文件比在 Console 里翻滚动条快得多。最后说一个心态上的事。第二天的环境搭建确实枯燥而且反馈来得慢——你敲了一堆命令、点了十几个对话框最后只是看到一个表格页面。但这一天的投入产出比其实是最高的因为后面每一行代码的调试都依赖这条通路。我的建议是通路上任何一步不确定就停下来验证清楚再往下走不要带着应该没问题吧的假设继续。Web 开发里没有应该只有我验证过了。
RELATED

相关推荐

VB 2012随书源码实战:从编译运行到二次开发全解析

VB 2012随书源码实战:从编译运行到二次开发全解析

简介:《Visual Basic 2012入门经典(第7版中文版)》随书源码是一套面向VB初学者的配套示例工程,帮助读者对照书籍亲手实践书中案例与项目。压缩包为zip格式,大小约10.15MB,内容涵盖基础语法、面向对象编程、…

📅 2026/10/23 11:53:34
Micro-LED量产线MES在巨量转移这一段,该管到多细

Micro-LED量产线MES在巨量转移这一段,该管到多细

Micro-LED 这条线上,益普科技跟几家做中试和量产的团队交流时,被问得最多的一类问题是颗粒度:MES 要不要管到单颗芯片。这个问题放到传统封测里几乎不用想,一颗芯片一颗身份,天然如此。到了 Micro-LED,一片…

📅 2026/10/23 11:48:33
如何在没有 Microsoft Store 的 Win10 电脑上安装 ChatGPT 桌面版

如何在没有 Microsoft Store 的 Win10 电脑上安装 ChatGPT 桌面版

我们公司电脑上没有 Microsoft Store,Windows 更新也被禁用了,导致装不了 ChatGPT 桌面版。 但其实 OpenAI 在企业部署文档里提供了官方的离线安装包。 遂写下这篇文章,记录详细步骤和坑点,供大家(包括我自己&#xff…

📅 2026/10/23 11:48:33
MORE NEWS

更多资讯

📰

LLMs for Legal Subsumption in German Employment Contracts

文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)评估德国雇佣合同条款的合法性,旨在解决法律工作中文本密集、资源消耗大的问题。研究通过与法律专家合作扩展现有数据集,测试了不同LLMs在三种法律上下文(无法律上下文、完整法律文本及判例、提炼的审查指南)下将条款…

📰

Java房屋租赁管理系统源码:Spring Boot+MySQL实现房源合同账单

简介:这份房屋租赁管理系统面向学习Java Web与传统SSH框架的在校学生和初中级开发者,提供一套可直接参考的租房业务实现,涵盖房源信息、用户管理与租赁记录等常见模块,适合课程设计、毕业设计或框架入门练习。压缩包共104个文件&a…

📰

北斗B1I基带信号MATLAB仿真:从信号生成到捕获跟踪的完整工程实践

简介:这份资源是面向卫星导航、通信工程及信号处理方向学习者与科研人员的北斗基带信号MATLAB仿真代码包,聚焦解决北斗B1I频点C/A码生成、采样与基带信号合成的建模问题,适合具备一定MATLAB基础、希望动手复现北斗信号链路的中高级读者。压缩…

📰

Winform HTTP POST JSON 接口联调与响应回显实践

简介:面向 .NET 桌面开发者的 Winform HTTP POST JSON 通信示例工程,适合需要让客户端向服务端提交结构化数据并读取返回结果的初学者与中级开发者参考。工程围绕 HttpClient 发起异步 POST 请求、使用 Json.NET 完成对象序列化与返回内容反序列化、设置…

📰

GitLab跳版本升级后通用设置保存报500:迁移与缓存排查实战

GitLab 跨大版本升级后,点开后台“通用设置”随便改一个字段再点保存,结果直接甩一个 500 页面出来,这种事在运维圈真不算少见。尤其你这边的路径是 12.3.9 直接跳到 14.4.5,中间隔了 12、13、14 三个大版本线,风险点不…

📰

nRF52840 USB Dongle:OpenThread与FIDO2双协议栈实战指南

简介:这是一套面向物联网嵌入式开发者与开源硬件爱好者的nRF52840微型开发平台资源,聚焦低功耗多协议无线通信实践,特别适用于蓝牙5、Thread、IEEE 802.15.4及FIDO2安全认证等IoT场景快速原型验证。资源以ZIP格式封装,共含多个固件…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬