自定义Vaadin HTML模板

本周,我在Twitter上遇到了一个有趣的问题:“您如何在Vaadin中html元素添加lang属性?”,如下所示:

<htmllang="fr">

尽管在页面上自定义各个组件非常容易,但外部html标签不在我们的控制范围内。 在本文中,我将描述该问题的可能解决方案。 请注意,我认为这对于morevaadin.com来说太专业了。 但是,对于Vaadin来说,这仍然应该是我的参考网站。

我的第一个(错误的)想法是html元素是由UI小部件客户端生成的。 并非如此-因为没有这样的小部件。 为了找到答案,我必须了解框架的工作原理。 这是一个向Vaadin应用程序发出请求时序列的简短摘要。

顺序图

基本上,Vaadin Servlet委托给Vaadin服务。 反过来,服务会循环遍历其内部的请求处理程序列表,直到其中一个能够处理请求为止。 默认情况下,Vaadin服务注册以下处理程序:

  1. ConnectorResourceHandler
  2. UnsupportedBrowserHandler:如果Vaadin不支持浏览器,则返回特定消息
  3. UidlRequestHandler:处理客户端和服务器之间的RPC通信
  4. FileUploadHandler:处理通过FileUpload组件实现的文件上传
  5. HeartbeatHandler:处理心跳请求
  6. PublishedFileHandler
  7. SessionRequestHandler:依次委托来请求已在会话中注册的处理程序

这在VaadinService.createRequestHandlers() 。 但是,请注意VaadinService是抽象的。 在使用的具体VaadinServletService子类中引入了一个细微的变化。 它注册了一个新的请求处理程序ServletBootstrapHandler ,以使Vaadin在Servlet和Portlet上下文中透明地运行。 在这种情况下,只有一个片段:

类图

servlet boostrap处理程序负责在应用程序开始时生成初始HTML页面,包括所需的外部html标签。 对应用程序的下一个请求将仅通过AJAX更新页面的一部分,但外部HTML不会更改。 因此,如果希望添加lang属性,则需要更新该类。 快速浏览一下该类就很清楚,很难扩展。 此外,它将HTML生成委托给JSoup ,更精确地委托给Document.createShell()静态方法。

此时,您有3个选择:

  1. 算了吧,这到底值什么钱?
  2. 重写BootstrapHandler的大部分并将其添加到处理程序序列中的BootstrapHandler之前
  3. 懒惰并应用Ockham的剃刀:只需使用简单的AOP方面

为了有用,我选择了最新的选项。 这非常简单明了,您只需要执行以下步骤。

创建方面本身。 请注意,我使用Kotlin与现有项目保持一致,但是Java或任何其他基于JVM的语言将是相同的。

@Aspect
openclassUpdateLangAspect{

    @Pointcut("execution(static * org.jsoup.nodes.Document.createShell(..))")
    funcallDocumentCreateShell():Unit{}

    @AfterReturning(pointcut="callDocumentCreateShell()",returning="document")
    funsetLangAttribute(document:Document):Unit{
        document.childNode(0).attr("lang","fr")
    }
}

由于检测方法是静态的,因此不可能使用简单的Spring代理,但是我们需要通过LTW进行 AspectJ类检测。 为了在Spring Boot中激活它,我只需要更新application.properties文件:

spring.aop.proxy-target-class=true

另外,还必须告诉Aspect的weaver需要在META-INF/aop.xml

<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
  <aspects>
    <aspectname="ch.frankel.blog.bootvaadinkotlin.UpdateLangAspect"/>
  </aspects>

  <weaveroptions="-XnoInline -Xlint:ignore -verbose -showWeaveInfo">
    <includewithin="org.jsoup.nodes.Document"/>
    <includewithin="ch.frankel.blog.bootvaadinkotlin.UpdateLangAspect"/>
  </weaver>
</aspectj>

第一部分是关于方面,第二部分是关于需要检测哪些类。 注意,编织部分也需要参考方面。

最后,必须更新POM,以便通过Spring Boot Maven插件启动应用程序也将使用该方面。

<plugin>
  <groupId> org.springframework.boot </groupId>
  <artifactId> spring-boot-maven-plugin </artifactId>
  <configuration>
    <agent> ${settings.localRepository}/org/aspectj/aspectjweaver/1.8.8/aspectjweaver-1.8.8.jar </agent>
  </configuration>
</plugin>

为了完整起见,该代码可在Github上使用manage-langv1标签使用。

此时,生成页面将显示所需的更改。 任务完成!

翻译自: https://blog.frankel.ch/customizing-vaadin-html-template/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值