vaadin
<htmllang="fr">
尽管自定义页面上的各个组件非常容易,但外部html标签不在我们的控制范围内。 在本文中,我将描述该问题的可能解决方案。 请注意,我认为这对于morevaadin.com来说太专业了。 但是,对于Vaadin来说,这仍然应该是我的参考网站。
我的第一个(错误的)想法是html
元素是由UI小部件客户端生成的。 并非如此-因为没有这样的小部件。 为了找到答案,我必须了解框架的工作原理。 这是一个向Vaadin应用程序发出请求时序列的简短摘要。
基本上,Vaadin Servlet委托给Vaadin服务。 反过来,服务会循环遍历其内部的请求处理程序列表,直到其中一个能够处理请求为止。 默认情况下,Vaadin服务注册以下处理程序:
- ConnectorResourceHandler
- UnsupportedBrowserHandler:如果Vaadin不支持浏览器,则返回特定消息
- UidlRequestHandler:处理客户端和服务器之间的RPC通信
- FileUploadHandler:处理通过
FileUpload
组件实现的文件上传 - HeartbeatHandler:处理心跳请求
- PublishedFileHandler
- SessionRequestHandler:依次委托来请求已在会话中注册的处理程序
这在VaadinService.createRequestHandlers()
。 但是,请注意VaadinService
是抽象的。 在使用的具体VaadinServletService
子类中引入了一个细微的变化。 它注册了一个新的请求处理程序ServletBootstrapHandler
,以使Vaadin在Servlet和Portlet上下文中透明地运行。 在这种情况下,只有一个片段:
servlet boostrap处理程序负责在应用程序的开头生成初始HTML页面,包括所需的外部html
标签。 对应用程序的下一个请求将仅通过AJAX更新页面的一部分,但外部HTML不会更改。 因此,如果希望添加lang
属性,则需要更新该类。 快速浏览一下该类就很清楚,很难扩展。 此外,它将HTML生成委托给JSoup ,更确切地说,委托给Document.createShell()
静态方法。
此时,您有3个选择:
- 算了,这到底值什么钱?
- 重写BootstrapHandler的大部分并将其添加到处理程序序列中的BootstrapHandler之前
- 懒惰并应用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/
vaadin