Hilla
信息
Hilla 是一个用于 Java 的全栈 Web 框架。 它可以通过将 Spring Boot 后端与 React 前端相结合来帮助您更快地构建更好的业务应用程序。 此外,它还具有 40 多个 UI 组件,你可以将其用于更专业的应用程序。
快速上手
系统环境
除了常用的设备和工具外,只需要两件基本的东西:
创建项目
使用官方项目生成器
前往 https://start.vaadin.com/ 创建项目。
使用 Spring initializr
前往 https://start.spring.io/ 或使用 IDEA 创建 Spring 项目。 创建项目时注意:
- Project(项目类型):Gradle - Kotlin
- Language(项目语言):Kotlin
- Project Metadata:按需自定。
- Dependencies(项目依赖):
- Spring Boot DevTools
- Spring Configuration Processor
- Hilla
- ...以及其他你需要的依赖项;
选用 Hilla 时通常无需依赖 Spring Web; 也无需依赖 Spring Reactive Web(Vaadin Flow 了解一下?
使用 Hilla CLI
使用 Hilla CLI 创建的项目默认使用 Maven 构建,如果想使用 Gradle 构建,请直接使用 Spring initializr 创建项目
在终端执行以下命令,使用 Hilla CLI 创建新项目:
npx @hilla/cli init my-hilla-app
默认会创建 React 应用,如果想使用 Lit 的话,需要加上 --lit
选项:
npx @hilla/cli init --lit my-hilla-app
也可以加上 --auth
选项来创建具有基本 安全配置 的项目:
npx @hilla/cli init --lit --auth hilla-with-auth
Hilla CLI 帮助
$ npx @hilla/cli init -h
用法: hilla-init [options] <projectName>
选项:
--empty 创建一个没有菜单和一个空视图的项目
--react UI 使用 React(默认)
--lit UI 使用 Lit
--latest 使用最新的主要版本(默认)
--pre 使用最新的预发布版本(如果可用)
--next 使用下一个主要版本的预发布版本(如果可用)
--auth 向应用程序添加身份验证支持
--push 向应用程序添加推送支持/响应端点
--git 初始化项目的 Git 仓库并提交初始文件
--preset <preset> 使用碰巧知道存在的给定预设
--server <server> 仅用于内部测试
-h, --help 显示命令帮助
项目结构
目录 | 说明 |
---|---|
frontend/ | 客户端源代码目录 |
index.html
| HTML 模板 |
index.ts | 前端入口点,包含使用 Hilla Router 的客户端路由设置 |
main-layout.ts | 主布局 Web 组件,包含导航菜单,使用 应用布局 |
views/ | UI 视图和 Web 组件(TypeScript) |
themes/ | 自定义 CSS 样式 |
src/main/java/<groupId>/ | 服务器端源代码目录,包含服务端 Java 视图 |
Application.java | 服务端入口 |
端点
package zone.yue.demo
import com.vaadin.flow.server.auth.AnonymousAllowed
import dev.hilla.Endpoint
@Endpoint
@AnonymousAllowed
class HelloEndpoint {
fun sayHello(name: String) = if (name !== "") "Hello $name" else ""
}
注解
@Nonnull
用于将字段、方法、参数或类型参数标记为不可为 null
的注解。
它被 Typescript 生成器用作类型可空性信息的来源。
此注解的存在只是为了方便起见,因为传统的 jakarta.annotation.Nonnull
注解不适用于类型参数。
安全
使用 Spring Security 进行身份验证
参考:Authentication with Spring Security | Security | Guides | React | Hilla Docs
SecurityConfig.kt
import com.vaadin.flow.spring.security.VaadinWebSecurity
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.invoke
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.core.userdetails.User
import org.springframework.security.provisioning.InMemoryUserDetailsManager
import org.springframework.security.provisioning.UserDetailsManager
@EnableWebSecurity
@Configuration
class SecurityConfig : VaadinWebSecurity() {
override fun configure(http: HttpSecurity) {
// 必须先写自己的配置再调用父类的配置
http {
authorizeHttpRequests {
// 不需要写这个,父类配置里有,写了将导致父类配置全部失效
// authorize(anyRequest, denyAll)
}
formLogin { }
}
// 允许 Hilla 内部请求的默认安全策略
super.configure(http)
}
override fun configure(web: WebSecurity) {
// 让 Spring Security 直接无视该路径,H2 console 自带认证。
web.ignoring().requestMatchers(AntPathRequestMatcher("\h2-console\**"))
super.configure(web)
}
@Bean
fun userDetailsManager(): UserDetailsManager {
// 基于内存的身份校验;请勿在生产环境使用
return InMemoryUserDetailsManager(
User.withUsername("user").password("{noop}user").roles("USER").build(),
User.withUsername("admin").password("{noop}admin").roles("ADMIN", "USER").build(),
)
}
}