增加一个页面
先增加一个页面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) {
// ...
}
}
- ExecutionContextFactory构造
- ScreenFacade->warmCache
- 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
- ExecutionContext info
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
* 否则处理 .. 等特殊路径符后返回