# 代码审查报告 **文件:** `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 ”,业务逻辑应放在控制器或后台 Bean 中;并记得声明 JSTL taglib。 - 🟡 `pmd:LocalVariableCouldBeFinal` L12 第 12 行:局部变量 'name' 可声明为 final。 建议: 将 String name 改为 final String name = request.getParameter("name"); 更推荐移除 scriptlet,使用 输出。 - 🟡 `pmd:NoInlineScript` L17 第 17 行:不要将 JavaScript 内容内联在 JSP/HTML 中。 建议: 将脚本移到独立的 .js 文件,例如 src="js/init.js",然后通过 引入;不要使用内联 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,使用 替代 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 含 等载荷时会被浏览器执行。 建议: 移除 scriptlet,改用 或 OWASP Java Encoder 对输出做 HTML 实体编码,杜绝 XSS。 - 🔴 [AI] [bug] `missing-taglib-declaration` L32 **缺少 JSTL/JSF 标签库声明** 页面第 32-33 行使用了 ,但没有任何 <%@ 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 行 在 JSF 组件中使用了 JSP EL ${}。JSF 的 ValueExpression 应使用 #{} 延迟求值,否则可能被当作普通字符串/文本解析,或无法正确解析 c:forEach 暴露的变量。 建议: 改为 ;若配合修复 DontNestJsfInJstlIteration,把外层 c:forEach 替换为 Facelets 的 ui:repeat。 - 🔵 [AI] [design] `incomplete-html5-document` L5 **HTML5 文档缺少 DOCTYPE 与 lang 属性** 没有前置 ,也没有 lang 属性,可能导致浏览器以怪癖模式渲染,同时影响屏幕阅读器/SEO 对页面语言的识别。 建议: 在 前添加 ,并设置 (按实际内容语言调整)。