第一次接触用友NC65登录界面开发时,很多人都会被它的路径映射机制搞晕。明明浏览器访问的是/portal/app/mockapp/login.jsp,但在nchome目录下却找不到对应的物理文件。这种"虚拟路径"的设计其实是用友NC框架的一个巧妙之处。
实际开发中,登录页面的真实物理路径位于D:\nchome\hotwebs\portal\sync\websm\pserver\html\nodes\login\uimeta.jsp。这个路径结构反映了用友NC65的模块化设计思想:
hotwebs目录存放所有Web应用portal是门户模块sync/websm/pserver体现了门户服务的分层架构html/nodes/login则是登录页面的专属目录理解这个映射关系很重要,因为:
最简单的定制就是在登录页面添加提示文字。比如我们需要提醒用户"请使用PC端登录",可以这样修改uimeta.jsp:
jsp复制<tr>
<td colspan="3" align="center" valign="center" height="70"
style="color: #f8094b; font-size: 30px; font-family: '微软雅黑';">
<b>请使用PC端登录,账号密码与NC一致</b>
</td>
</tr>
这个修改虽然简单,但有几个技术要点需要注意:
colspan="3"确保跨所有列显示如果想实现更智能的提示,可以结合后端模型类。PortalLoginPageModel类就是控制登录页面行为的核心:
java复制public class PortalLoginPageModel extends PageModel {
@Override
protected void initPageMetaStruct() {
// 初始化多语言选择框
ComboBoxComp combo = (ComboBoxComp) this.getPageMeta()
.getWidget("main")
.getViewComponents()
.getComponent("multiLanguageCombo");
// 获取当前语言设置
String langcode = LfwRuntimeEnvironment.getLangCode();
// ...其他初始化代码
}
}
我们可以扩展这个类,添加获取提示信息的方法:
java复制public String getLoginTip() {
// 这里可以从数据库或配置文件中读取提示信息
return "系统维护时间:每周六 00:00-06:00";
}
然后在JSP中调用:
jsp复制<td><%= ((PortalLoginPageModel)pageContext.getAttribute("model")).getLoginTip() %></td>
PortalLoginPageModel的initPageMetaStruct方法负责初始化登录页面元素。关键操作包括:
调试时可以在该方法中添加日志:
java复制PortalLogger.debug("当前语言代码:" + langcode);
getBusinessEtag方法生成页面缓存标识,它考虑了:
这个机制意味着:
xml复制<logger name="nc.uap.portal" level="DEBUG"/>
问题1:修改不生效
问题2:样式错乱
问题3:后端代码修改不生效
我在实际项目中遇到过修改后页面空白的情况,最后发现是因为JSP中使用了未转义的特殊字符。建议复杂HTML通过Java字符串工具类生成:
java复制String tip = HtmlUtils.htmlEscape("<提示信息>");
开发过程中多查看portal.log日志文件,它能准确记录页面加载过程中的各种异常。遇到棘手问题时,可以临时在PortalLoginPageModel的构造方法中添加调试信息,这样能确认模型类是否被正确实例化。