增加一个页面

先增加一个页面XML文件:

runtime/component/tutorial/screen/tutorial.xml

现在这个界面比较简单,里面只有一个“Hello world!”标签。内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<screen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://moqui.org/xsd/xml-screen-2.1.xsd"
        require-authentication="anonymous-all">
    <widgets>
        <label type="h1" text="Hello world!"/>
    </widgets>
</screen>

注意:

  • screen.@require-authentication 属性被设置为 "anonymous-all"。
    • 这禁止了页面的默认安全设置,访问此页面不再需要身份鉴定(登录)和鉴权(是否可访问)。
    • apps.xml 页面的此属性使用“false”,效果类似,但是不会作为匿名用户登录,也不会禁止页面上所有(不仅仅是view)action的鉴权。
    • 关于 Moqui构件鉴权的更多信息,请参考安全文档
  • xmlns:xsi 和 xsi:noNamespaceSchemaLocation 属性指定被用来在IDE中校验和自动完成的XSD文件。
    • 不同IDE,可能有不同的配置方式,这样它才知道如何为指定的位置(是合法的HTTP URL但不是XSD URI)找到本地的XSD文件。
    • 请查看IDE的设置文档

页面的加载

  • 在哪加载
  • 加载后保存在哪里
  • 如何通过修改数据库记录动态添加
  • ScreenDefinition
    • parameter
    • transition
    • subscreen
    • action
      • always
      • pre
    • section
      • root
    • form
    • flags
      • standalone
      • serverStatic
    • response
  • ScreenFacade

    class ScreenFacadeImpl implements ScreenFacade {

        // ...

        List<String> getAllRootScreenLocations() {
            List<String> allLocations = []
            for (MNode webappNode in ecfi.confXmlRoot.first("webapp-list").children("webapp")) {
                for (MNode rootScreenNode in webappNode.children("root-screen")) {
                    String rootLocation = rootScreenNode.attribute("location")
                    allLocations.add(rootLocation)
                }
            }
            return allLocations
        }

        // ...
        protected synchronized ScreenDefinition makeScreenDefinition(String location) {
            // ...
        }

    }
  1. ExecutionContextFactory构造
  2. ScreenFacade->warmCache
  3. ScreenFacade->makeScreenDefinition for all root screen location

相关缓存

  • screen.location: String -> ScreenDefinition
  • screen.location.perm: String -> ScreenDefinition
  • screen.url: String -> ScreenUrlInfo
  • ScreenUrlInfo
    • ExecutionContext info
      • execution context factory
      • screen facade
      • root screen definition
      • plain url
    • from screen info
      • from screen definition
      • from path list
      • from screen path
    • flags:
      • require encryption
      • always use full path
    • 事务相关
      • flag: begin transaction
      • transaction timeout
    • menu image, menu image type
    • full path name list
    • minimal path name list
    • extra path name list
    • file resource info list
      • path
      • ref
      • content type
    • all screens found in the path list: screen path def list
    • renderPathDifference
    • lastStandalone
    • pathParameterItems
    • the last screen found in the path list(target screen):
      • ScreenDefinition
      • render mode
      • transition actual name
      • transition extension
      • pre transition path name list
      • flags:
        • reusable
        • targetExists
      • not exists last ScreenDefinition
      • notExistsLastName
      • notExistsNexLoc

baseUrl =

* plainUrl
* ScreenRender's baskLinkUrl(如果首字母是/,则去掉/)
* WebFacadeImpl.getWebappRootUrl(ScreenRender's webappName, ScreenRender's servletContextPath)

urlWithBase(baseUrl)

* 如果 !targetExists, 返回 "#"
* baseUrl + 合并fullPathNameList中的各项,以'/'间隔

minimalPathUrlWithBase(baseUrl)

* 如果 !targetExists, 返回 "#"
* 如果 alwaysUseFullPath, baseUrl + 合并 fullPathNameList
* 否则 baseUrl + 合并 minimalPathNameList

screenPathUrlWithBase(baseUrl)

* 如果 !targetExists, 返回 "#"
* 返回 baseUrl + 合并 preTransitionPathNameList

initUrl

1. parseSubScreenPath
2. 设置 fromSd, fullPathNameList, fromPathList
3. 设置 requireEncryption, beginTransaction, transactionTimeout (都在 rootSd 中定义)
4. screenRenderDefList, screenPathDefList 加上 rootSd 后逐层处理
    1. 根据路径获取页面定义(ScreenDefinition)
    2. 查找 subscreen, transition
        * 如果没有找到子项,根据 extraPathNameList 查找文件资源
        * 否则: 从 screenRenderDefList 中清理掉 standalone 的子项
        * 在 screenRenderDefList, screenPathDefList, fullPathNameList 中添加该子项                
    3. 设置 requireEncryption, beginTransaction, transactionTimeout 等(子项覆盖上一层的)
5. 设置 minimalPathNameList
6. 逐层处理:
    * 根据 moqui.screen.SubscreenDefault 以及 conditional-default 设置默认值
7. 设置 menuImage、menuImageType 等

根据 moqui.screen.ScreenPathAlias 处理路径别名,处理特殊路径符 parseSubScreenPath(rootScreenDefinition, fromScreenDefinition, fromPathList, screenPath, inlineParameters, screenFacade)

* aliasPath
    * 如果screenPath不是以'/'开始且fromPathList不为空,则 fromPathList + '/' + screenPath
    * 否则为 screenPath
* 以 aliasPath = $aliasPath 为条件查找最近有效的 moqui.screen.ScreenPathAlias 实体的 screenPath 字段作为 screenPath
* 因为 moqui.screen.ScreenPathAlias 实体中的记录值的url可能是直接复制的,要解析出参数信息(?后面的放入inlineParameters)
* 如果是以 '/' 开始
    * 处理 . .. 等特殊路径符
    * 如果 screenFindPathCache 中有 screenPath,则返回缓存中的,否则返回null
* 否则处理 .. 等特殊路径符后返回

results matching ""

    No results matching ""