Files
2026Technology-Competition/data/demo-pmd/reports/DemoJsp-review.md
T

5.3 KiB

代码审查报告

文件: data\demo-pmd\src\jsp\DemoJsp.jsp 语言: html 耗时: 239.9s 分析工具: jsp


总计: 17 | 错误: 6 | 警告: 10 | 建议: 1

静态分析 · 12 个问题

  • 🔴 eslint:no-unused-vars L18 第 18 行:'init' 已定义但从未使用。 建议: 若该函数用于页面初始化,应显式绑定 window.addEventListener('load', init); 否则删除整个 init 函数。
  • 🔴 eslint:no-var L19 第 19 行:不允许使用 var,请改用 let 或 const。 建议: x 声明后未再被赋值,应使用 const x = 1; 代替 var x = 1;。
  • 🔴 eslint:no-undef L20 第 20 行:'alert' 未定义。 建议: 在浏览器环境应使用 window.alert(x); 更明确;也可以添加 /* global alert */ 注释作为全局声明。
  • 🔴 pmd:NoClassAttribute L37 第 37 行:不要使用名为 class 的属性。 建议: 将 class="highlight" 改为 id="highlight"(并确保页面内 id 唯一),在外部 CSS 中使用 #highlight 定义样式。
  • 🟡 pmd:NoScriptlets L11 第 11 行:JSP 文件中应避免使用 scriptlet(Java 脚本片段)。 建议: 将脚本片段改为 JSTL/EL 表达式,例如输出“Hello <c:out value="${param.name}"/>”,业务逻辑应放在控制器或后台 Bean 中;并记得声明 JSTL taglib。
  • 🟡 pmd:LocalVariableCouldBeFinal L12 第 12 行:局部变量 'name' 可声明为 final。 建议: 将 String name 改为 final String name = request.getParameter("name"); 更推荐移除 scriptlet,使用 <c:out value="${param.name}"/> 输出。
  • 🟡 pmd:NoInlineScript L17 第 17 行:不要将 JavaScript 内容内联在 JSP/HTML 中。 建议: 将脚本移到独立的 .js 文件,例如 src="js/init.js",然后通过 <script src="js/init.js"></script> 引入;不要使用内联 script 块。
  • 🟡 pmd:NoInlineStyleInformation L25 第 25 行:避免在 JSP 文件中包含样式信息(

    )。 建议: 移除 align 属性,改用外部 CSS,例如

    ,并在 CSS 中定义 #center-aligned { text-align: center; }。

  • 🟡 pmd:NoInlineStyleInformation L25 第 25 行:避免在 JSP 文件中包含样式信息( 加粗标签)。 建议: 用语义化的 Bold inline style 代替 ,或使用 CSS font-weight 设置加粗。
  • 🟡 pmd:NoInlineStyleInformation L25 第 25 行:避免在 JSP 文件中包含样式信息()。 建议: 将颜色样式移到外部 CSS,例如改为 Font inline style,并在 CSS 中定义 #font-inline-style-demo { color: red; }。
  • 🟡 pmd:DontNestJsfInJstlIteration L33 第 33 行:不要在会遍历 body 的 JSTL 迭代标签内嵌套 JSF 组件。 建议: 若迁移到 Facelets,使用 <ui:repeat value="#{items}" var="item"> 替代 c:forEach;否则请避免在 JSP 中混用 JSF 组件与 JSTL 迭代生命周期。
  • 🟡 pmd:DuplicateJspImports L42 第 42 行:java.util.List 被重复导入。 建议: 删除其中一个重复的 <%@ page import="java.util.List" %>,只保留一条导入语句。

AI 审查 · 5 条建议

  • 🔴 [AI] [security] reflected-xss L13 反射型 XSS:用户参数未编码直接输出 request.getParameter("name") 由用户控制,脚本中通过 out.println("Hello " + name) 直接拼入 HTML;当 name 含 <script>alert(document.cookie)</script> 等载荷时会被浏览器执行。 建议: 移除 scriptlet,改用 <c:out value="${param.name}"/> 或 OWASP Java Encoder 对输出做 HTML 实体编码,杜绝 XSS。
  • 🔴 [AI] [bug] missing-taglib-declaration L32 缺少 JSTL/JSF 标签库声明 页面第 32-33 行使用了 <c:forEach> 与 <h:outputText>,但没有任何 <%@ taglib %> 指令声明 c 和 h 前缀;JSP 容器无法解析这些标签,会导致编译失败或运行时错误。 建议: 在页面顶部增加 JSTL Core 和 JSF HTML 标签库的 taglib 指令,命名空间 URI 根据实际 JSTL/JSF 版本调整。
  • 🟡 [AI] [style] inline-style-attribute L26 第 26 行存在未标记的内联样式属性
    将样式写在 JSP 页面中,虽然 PMD 结果只标记了第 25 行的样式,但第 26 行同样违反内联样式外置的原则,也会增加维护成本。 建议: 移除 style 属性,将颜色样式写到外部 CSS 文件,例如
    Inline style
    ,并在 CSS 中定义 #inline-style-demo { color: red; }。
  • 🟡 [AI] [bug] jsf-el-value-expression L33 JSF 组件值表达式应使用 #{} 而不是 ${} 第 33 行 <h:outputText value="${item}"/> 在 JSF 组件中使用了 JSP EL ${}。JSF 的 ValueExpression 应使用 #{} 延迟求值,否则可能被当作普通字符串/文本解析,或无法正确解析 c:forEach 暴露的变量。 建议: 改为 <h:outputText value="#{item}"/>;若配合修复 DontNestJsfInJstlIteration,把外层 c:forEach 替换为 Facelets 的 ui:repeat。
  • 🔵 [AI] [design] incomplete-html5-document L5 HTML5 文档缺少 DOCTYPE 与 lang 属性 <html> 没有前置 ,也没有 lang 属性,可能导致浏览器以怪癖模式渲染,同时影响屏幕阅读器/SEO 对页面语言的识别。 建议: 在 <html> 前添加 ,并设置 <html lang="zh-CN">(按实际内容语言调整)。