模板时候控制标签显示和隐藏

本文介绍了一个使用Java技术实现的机构管理系统的页面布局与功能实现细节,包括机构列表展示、添加、编辑和删除等操作。系统采用树形表格的形式来展现不同级别的机构间的关系,并集成了权限控制确保数据的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<html>
<head>

	<meta name="decorator" content="default"/>
	<%@include file="/WEB-INF/views/include/treetable.jsp" %>
	<script type="text/javascript">
		$(document).ready(function() {
			var tpl = $("#treeTableTpl").html().replace(/(\/\/\<!\-\-)|(\/\/\-\->)/g,"");
			var data = ${fns:toJson(list)}, rootId = "${not empty office.id ? office.id : '0'}";
			addRow("#treeTableList", tpl, data, rootId, true);
			$("#treeTable").treeTable({expandLevel : 5});
			$(".typeA[type!=1]").hide();   -- 这个
		});
		function addRow(list, tpl, data, pid, root){
			for (var i=0; i<data.length; i++){
				var row = data[i];
				if ((${fns:jsGetVal('row.parentId')}) == pid){
					$(list).append(Mustache.render(tpl, {
						dict: {
							type: getDictLabel(${fns:toJson(fns:getDictList('sys_office_type'))}, row.type)
						}, pid: (root?0:pid), row: row
					}));
					addRow(list, tpl, data, row.id);
				}
			}
		}
	</script>
</head>
<body>
	<ul class="nav nav-tabs">
		<li class="active"><a href="${ctx}/sys/office/list?id=${office.id}&parentIds=${office.parentIds}">机构列表</a></li>
		<shiro:hasPermission name="sys:office:edit"><li><a href="${ctx}/sys/office/form?parent.id=${office.id}">机构添加</a></li></shiro:hasPermission>
	</ul>
	<sys:message content="${message}"/>
	<table id="treeTable" class="table table-striped table-bordered table-condensed">
		<thead><tr><th>机构名称</th><th>归属区域</th><th>机构编码</th><th>机构类型</th><th>备注</th><shiro:hasPermission name="sys:office:edit"><th>操作</th></shiro:hasPermission></tr></thead>
		<tbody id="treeTableList"></tbody>
	</table>

	
	<script type="text/template" id="treeTableTpl">
		<tr id="{{row.id}}" pId="{{pid}}">
			<td><a href="${ctx}/sys/office/form?id={{row.id}}">{{row.name}}</a></td>
			<td>{{row.area.name}}</td>
			<td>{{row.code}}</td>
			<td>{{dict.type}}</td>
			<td>{{row.remarks}}</td>
			<shiro:hasPermission name="sys:office:edit"><td>
				<a href="${ctx}/sys/office/form?id={{row.id}}">修改</a>
				<a href="${ctx}/sys/office/delete?id={{row.id}}" onclick="return confirmx('要删除该机构及所有子机构项吗?', this.href)">删除</a>
					<a class="typeA" type="{{row.type}}" href="${ctx}/sys/office/referSubmit?id={{row.id}}" >恢复子公司提交</a>  -- 这个
				<a href="${ctx}/sys/office/form?parent.id={{row.id}}">添加下级机构</a> 
			</td></shiro:hasPermission>
		</tr>
	</script>
</body>
</html>

<think>首先,用户的问题是关于在FreeMarker模板引擎中实现自定义权限控制标签控制页面元素的显示隐藏。用户提到了“FreeMarker 自定义权限标签 控制元素显示隐藏”。 我需要回顾系统指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 参考站内引用。 站内引用内容: - 引用[1]: 关于权限检查标签实践,包括用户登录状态检查。 - 引用[2]: FreeMarker的安全措施,如使用html函数转义输出。 - 引用[3]: 在Spring MVC + Freemarker中处理按钮权限。 - 引用[4]: 介绍SFMT项目,将Apache Shiro的权限控制引入Freemarker,实现动态内容显示。 这些引用与用户的问题相关,因为用户想实现自定义权限标签控制元素显示隐藏。引用[4]特别提到了SFMT项目,它封装了自定义的Freemarker指令来实现类似功能。 我的回答结构: 1. **理解需求**:先确认用户的需求。 2. **逐步指导**:提供如何实现自定义权限标签的步骤。 3. **代码示例**:给出示例代码。 4. **安全考虑**:提醒安全最佳实践。 5. **生成相关问题**:在最后添加相关问题。 使用中文回答。 现在,规划回答内容: - **介绍**:解释什么是自定义权限标签及其用途。 - **实现步骤**: 1. 创建自定义指令类。 2. 实现指令逻辑(检查权限)。 3. 在FreeMarker配置中注册指令。 4. 在模板中使用指令。 - **示例代码**:基于引用[4]的SFMT项目,或提供一个简单示例。 - **安全提示**:参考引用[2],强调转义输出。 - **引用引用**:自然地融入引用内容,并在末尾添加标识。 生成相关问题:在回答末尾,添加几个相关问题。 确保数学表达式正确:用户的问题中没有明显的数学内容,但如果有变量等,使用$...$格式。例如,在代码或解释中,如果有变量名,可以写成$variable$,但通常在这种上下文中不需要。 回答结构: 1. **开头**:简要回应问题。 2. **步骤指南**:分步解释如何实现。 3. **代码示例**:提供Freemarker模板Java代码示例。 4. **安全建议**:基于引用。 5. **总结**:简要总结。 6. **相关问题**:以“§§相关问题§§”开头,列出几个问题。 相关问题应该基于用户的问题,例如: 1. 如何测试自定义权限标签的有效性? 2. 自定义标签与内置函数相比有什么优势? 3. 在分布式系统中如何管理权限标签? 现在,整合引用: - 引用[4]详细描述了SFMT项目,我可以在解释中提及它。 - 引用[3]提到在Spring MVC中设置按钮权限。 - 引用[2]关于安全措施。 在回答中,自然地添加引用标识,例如:“如引用[4]所述,SFMT项目实现了类似的功能。[^4]” 最终回答: - 用中文。 - 结构清晰。</think>### FreeMarker 自定义权限标签实现元素显示控制 在 FreeMarker 模板引擎中,实现自定义权限控制标签控制页面元素(如按钮、菜单或内容块)显示隐藏的有效方法。这通常涉及创建自定义指令(Directive),通过检查用户权限来决定是否渲染特定模板片段。下面我将基于您的需求,提供分步指南、代码示例安全建议,确保实现过程可靠且易于理解。参考了相关站内资源,本回答结合了最佳实践实际应用场景。 #### 1. **理解自定义权限标签的原理** 自定义权限标签的核心是扩展 FreeMarker 的 `TemplateDirectiveModel` 接口,实现一个指令类来封装权限检查逻辑(如基于角色或权限字符串)。在模板中使用该指令时,FreeMarker 会调用指令的 `execute` 方法,根据权限检查结果决定是否输出嵌套内容。这种方法类似于 Apache Shiro 与 FreeMarker 的集成(如 SFMT 项目所述),但您可以自定义逻辑以适应您的权限框架(如 Spring Security 或自定义 RBAC)。[^4] #### 2. **实现自定义权限标签的步骤** 以下是分步实现过程,基于 Java FreeMarker 的典型环境(如 Spring Boot 项目)。假设您已集成权限框架(如 Spring Security)。 ##### 步骤 1: 创建自定义指令类 创建一个 Java 类实现 `TemplateDirectiveModel` 接口。该类负责检查用户权限,并控制模板片段的渲染。 ```java import freemarker.core.Environment; import freemarker.template.*; import java.io.IOException; import java.util.Map; public class PermissionDirective implements TemplateDirectiveModel { @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { // 检查权限参数(例如,从 params 获取权限字符串) String requiredPermission = params.get("permission").toString(); // 模拟权限检查(实际中应集成您的权限服务,如 Spring Security) boolean hasPermission = checkUserPermission(requiredPermission); // 假设 checkUserPermission 是您的权限检查方法 // 如果用户有权限,渲染嵌套内容;否则跳过 if (hasPermission && body != null) { body.render(env.getOut()); // 输出内容到模板 } } private boolean checkUserPermission(String permission) { // 实际实现:这里应调用您的权限服务(如 SecurityContextHolder 在 Spring Security 中) // 示例:返回 true 表示有权限,false 表示无权限 return true; // 简化示例,实际中需动态判断 } } ``` ##### 步骤 2: 在 FreeMarker 配置中注册指令 在 Spring 配置类或初始化代码中,将自定义指令注册到 FreeMarker 的共享变量中。这样模板就能识别并使用新指令。 ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import java.util.HashMap; import java.util.Map; @Configuration public class FreemarkerConfig { @Bean public FreeMarkerConfigurer freeMarkerConfigurer() { FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); configurer.setTemplateLoaderPath("classpath:/templates"); // 设置模板路径 // 注册自定义指令 Map<String, Object> sharedVariables = new HashMap<>(); sharedVariables.put("permission", new PermissionDirective()); // 指令名称为 "permission" configurer.setFreemarkerVariables(sharedVariables); return configurer; } } ``` ##### 步骤 3: 在 FreeMarker 模板中使用自定义指令 在您的 `.ftl` 模板文件中,使用 `<@permission>` 指令包裹需要控制的元素。指令参数指定所需权限,嵌套内容仅在权限满足时渲染。 ```ftl <#-- 示例:控制按钮显示 --> <@permission permission="admin:edit"> <#-- "admin:edit" 是权限字符串 --> <button class="btn-edit">编辑内容</button> <#-- 仅当用户有 "admin:edit" 权限时显示此按钮 --> </@permission> <#-- 控制菜单项显示 --> <@permission permission="user:view"> <li><a href="/profile">个人中心</a></li> <#-- 仅当用户有 "user:view" 权限时显示 --> </@permission> ``` #### 3. **安全建议与最佳实践** - **转义输出防止 XSS 攻击**:在指令中输出内容时,务必使用 FreeMarker 的内置函数进行 HTML 转义,例如 `$variable?html`。这能防止恶意脚本注入,确保模板安全(如引用[2]所述)。[^2] - **集成现有权限框架**:如果您的项目使用 Apache Shiro 或 Spring Security,可以直接复用其权限检查逻辑。例如,SFMT 项目展示了如何无缝整合 Shiro,提供指令如 `<@shiro.hasPermission>` 来简化开发(引用[4])。[^4] - **性能优化**:权限检查应高效,避免在模板中频繁调用数据库。建议在服务器端缓存用户权限(如会话中存储)。 - **错误处理**:在指令中添加异常捕获,避免模板渲染失败。例如: ```java try { if (hasPermission) { body.render(env.getOut()); } } catch (Exception e) { throw new TemplateException("权限检查错误", e, env); } ``` #### 4. **实际应用场景** - **动态 UI 控制**:如引用[3]所述,在 Spring MVC + FreeMarker 中,这种方法常用于按钮或菜单的权限控制(例如,管理员显示管理面板,普通用户隐藏)。[^3] - **内容过滤**:基于用户角色显示隐藏敏感内容(引用[4]),如会员专享区域。[^4] - **登录状态检查**:结合用户登录状态(引用[1]),扩展指令以支持 guest 或 authenticated 用户。[^1] #### 5. **总结** 通过实现自定义 `TemplateDirectiveModel` 指令,您可以在 FreeMarker 中灵活控制页面元素的显示隐藏。整个过程包括创建指令类、注册到配置、在模板中使用指令。核心优势是代码复用性强,且易于集成到现有权限系统中。确保遵循安全最佳实践,如输出转义权限验证。如果您使用类似 SFMT 的开源项目,可以快速上手(引用[4])。[^4] 如有具体权限框架(如 Spring Security),我可以提供更针对性的示例。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值