全新发布 Java · Spring Boot

FineUI.Java

「AI 写得快 · 人类看得懂」的 Java 企业级全栈 UI 框架,基于 Spring Boot。

官方项目的 FineUI 页面默认启用 nonce 脚本防护,表格、表单与回发照常工作。

社区版通过 Maven Central 安装;示例、空项目、快速入门与 AppBox 源码在 GitHub 公开。

为什么选择 FineUI.Java?

同一个登录功能,八款同类产品——十项能力横评,FineUI.Java 项项满足。

特性 FineUI.Java Vaadin JSF/PF Wicket ZK Tapestry HTMX GWT/GXT
声明式标签 ✓ ✗ ✓ ◐ ✓ ✓ ◐ ✗
事件直达服务端 ✓ ✓ ✓ ✓ ✓ ✓ ◐ ✗
属性回写、UI 自动更新 ✓ ✓ ✓ ✓ ✓ ✓ ✗ ✗
业务侧几乎零 JavaScript ✓ ✓ ✓ ✓ ✓ ✓ ◐ ✗
企业级数据表格 ✓ ✓ ✓ ◐ ✓ ◐ ✗ ✓
内置表单校验 ✓ ✓ ✓ ◐ ◐ ◐ ✗ ◐
默认无刷新回发 ✓ ✓ ◐ ◐ ✓ ◐ ✓ ✓
服务端无状态、易水平扩展 ✓ ✗ ✗ ✗ ✗ ◐ ✓ ✓
CSP 脚本策略:无 unsafe-inline / unsafe-eval ✓ ◐ ◐ ✓ ✗ ✗ ◐ ✗
一行依赖接入、零配置 ✓ ◐ ◐ ◐ ◐ ◐ ✓ ◐

✓ 支持 ◐ 部分支持 ✗ 不支持

看逐框架代码对照与脚注 →

用严格 CSP 保护你的页面

FineUI.Java 每次请求生成新的 nonce,自动授权可信模板脚本。按钮、Grid 和服务端回发照常工作,script-src 无需放开 unsafe-inline 或 unsafe-eval。

官方示例、QuickStart、空项目和 AppBox 的 FineUI 页面已默认启用这套脚本策略。

全局配置与模板脚本

application.properties:为 FineUI 页面全局开启脚本 CSP

fineui.csp-scripts=true
fineui.csp-allow-self=true
fineui.csp-allow-nonce=true

模板照常写具名点击函数,无需手写 nonce

<f:button id="btnSave" text="保存" click-handler="onSaveClick" />
<script>
  function onSaveClick(event) {
    F.notify('已保存');
  }
</script>
运行中的 FineUI.Java Grid 页面及从该请求读取的 Content-Security-Policy 响应头

范围:经 FineUI 页面控制器渲染的页面。旧版第三方编辑器示例有例外;这里介绍的是脚本策略,不代表静态页面或站点其他资源均已受 CSP 约束。

页面写标签,后台写事件

一个标签一个控件,一个属性一个功能;控件状态在前后端自动往返,事件直达 Java 方法。

界面 · Thymeleaf 模板

标签声明界面

<!-- 一个标签一个控件 -->
<f:window title="登录">
  <f:simple-form>
    <f:text-box id="tbxUser" label="用户名" required="true"/>
    <f:text-box id="tbxPwd" label="密码" text-mode="Password"/>
  </f:simple-form>
  <f:button id="btnLogin" text="登录" on-click="btnLogin_Click"/>
</f:window>

业务 · Java 页面模型

后台事件处理业务

// 控件按字段名自动注入,无需设计时代码
@FineUIPage("basic/login")
public class Login extends FineUIPageBase {

    TextBox tbxUser;   // 字段名 == 控件 id
    TextBox tbxPwd;

    // 点「登录」触发的服务端事件
    public void btnLogin_Click(Object sender, EventArgs e) {
        String user = tbxUser.getValue();   // 读控件状态
        showNotify("你好," + user);        // 写状态 → 自动回传
    }
}

整页不刷新,服务端不存 session —— 大多数页面里,JavaScript 的用量是零。 阅读开发指南 →

开箱即用的核心能力

从标签声明、后台事件,到数据表格、声明式校验与默认安全——企业级全栈开发所需的一切。

No JavaScript · No CSS

控件自带交互逻辑与样式,换肤只切主题。写业务几乎不碰 JavaScript、不手写 CSS——FineUI 十八年的老招牌。

标签声明界面

界面由控件拼装:<f:window>、<f:text-box>、<f:button>……你写的是「有什么」,不是「怎么画」。

后台事件处理业务

on-click 把客户端动作接到一个 Java 方法上;方法体里面对的就是控件实例本身,读它、改它,像操作普通对象一样。

无刷新回发

每次点击只发一个 AJAX 请求,服务端返回纯 JSON,由客户端就地把变化打到 DOM。用户看到的是局部更新,不是整页刷新或白屏等待。

注解式校验

在 Java 模型字段上用 @NotBlank、@Size 等注解声明校验:一次声明,前端即时提示、后端权威复核。

企业级数据表格

排序、分页、行内编辑、树形表格、锁定列、分组汇总……企业报表里的重活,用标签声明就能扛,配套 1000+ 在线示例。

服务端无状态

控件树不常驻服务端内存,每次回发从客户端状态重建。不需要 session、不需要粘性会话,天然支持水平扩展。

默认安全

控件文本默认 HTML 编码,表单只绑定声明字段;官方项目的 FineUI 页面默认启用 nonce 脚本策略,可信模板脚本自动授权。

阅读脚本策略的配置与边界 →

开始使用

全新发布
  1. 前往 在线示例 点几下,直观感受标签式与有状态开发。
  2. 从 GitHub 空项目 起步,依赖由 Maven Central 恢复。
  3. 照着 开发指南 写出你的第一个页面。
  4. 需要企业版?,我们把企业版试用包和开发授权文件发到你邮箱。
Maven Central 在线示例 ↗
AI 友好

AI 生成,人类审查

2020 年以来,业界明显出现「薄前端、状态回归服务端」的回潮(HTML over the wire),在企业管理系统、内部工具这类场景里尤其顺势。

而 2026 年,越来越多代码由 AI 生成、人类转为审查者——声明式标签恰恰是对审查最友好的形态:AI 吐出一行 <f:text-box label="用户名" required="true"/>,你一眼就能看懂它是什么、对不对,胜过审阅数百行夹缠着状态与副作用的前端代码。

标签式、有状态、事件驱动,让人和 AI 用同一套词汇表描述界面。这就是 FineUI.Java 想做的事。