Spring LdapTemplate读取以及Freemark简朴合成页面
副标题#e#
客户近期频繁要求修改组织机构,维护部分苦不堪言。更新组织机构就要更新邮箱的通讯录,利用的应该是某风行的邮件系统,php的,版本挺老的,个中有个成果,在写收件人的时候输入的对象会autocomplate,这个对象维护部分需要维护一个超大的文件夹,如下图:一级目次是第一个字,二级目次是前两个字,三级目次是前三个字,以此类推,个中每个文件夹下包括一个result.php文件,内容为该级目次中所对应的全部人员。
那我需要做什么呢?对,辅佐他们生成这个对象。缕了一下思路,需要用到ldap、freemark的常识。
Spring各人应该不生疏,这里ldap数据的读取,我选用的是Spring的ldapTemplate 1.3.1,设置如jdbcTemplate:
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource"> <property name="url" value="ldap://192.168.101.179:389" /> <property name="base" value="" /> <property name="userDn" value="cn=platoptuser,ou=内置帐号,ou=系统,o=北京XX局" /> <property name="password" value="111111" /> </bean> <bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate"> <constructor-arg ref="contextSource" /> </bean>
读取Ldap这块我碰着一个难点,读取出来人如何获得这小我私家眷于哪个组织机构,网上搜索无果,通过查察包里的类找靠谱的要领,最后终于找到了ContextMapper,可以通过获取dn来取得组织机构
public List<Person> getAllPersonNames() { // 正则表达式,为获取组织机构 String regEx_script = "ou=([^,]*)?"; final Pattern p = Pattern.compile(regEx_script, Pattern.DOTALL | Pattern.CASE_INSENSITIVE);// 修改模式 @SuppressWarnings("unchecked") List<Person> persons = ldapTemplate.search("o=北京XX局", "(objectClass=Person)", new ContextMapper() { @Override public Object mapFromContext(Object arg0) { DirContextAdapter adapter = (DirContextAdapter)arg0; Attributes attrs = adapter.getAttributes(); Person bean = new Person(); // 取值 Attribute fullName = attrs.get("cn"); Attribute mail = attrs.get("mail"); Attribute title = attrs.get("title"); Name dn = adapter.getDn(); String org = ""; // 取组织机构 if(dn != null){ Matcher m = p.matcher(dn.toString()); MatchResult mr = null; // 获取匹配 while (m.find()) { mr = m.toMatchResult(); org = org + mr.group(1) + "/"; } } // 给工具赋值 try { bean.setFullName(fullName == null ? "" : fullName.get().toString()); // ldap中有的邮箱有后缀有的没有 String mailStr = mail == null ? "" : mail.get().toString(); bean.setMail(mailStr); bean.setTitle(title == null ? "" : title.get().toString()); bean.setOrg(org.equals("") ? "" : org.substring(0, org.length() - 1)); } catch (NamingException e) { e.printStackTrace(); } return bean; } }); return persons; }
#p#副标题#e#
利用Freemark生成result.php也碰着一个问题,打包成jar后,利用呼吁行方法输入java -jar xxx.jar后,提示找不到模板,原先利用的是setDirectoryForTemplateLoading需要修改为:
setTemplateLoader(new ClassTemplateLoader(this.getClass(), "/ftl"));
最后的Freemark代码是这样的
public class TestFreemarker { private Configuration cfg; public Configuration getCfg() { return cfg; } public void init() throws Exception { cfg = new Configuration(); cfg.setTemplateLoader(new ClassTemplateLoader(this.getClass(), "/ftl")); } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { TestFreemarker obj = new TestFreemarker(); obj.init(); List<Person> persons = new ArrayList<Person>(); Person user = new Person(); user.setFullName("陈小二"); user.setMail("[email protected]"); user.setOrg("XX公司/团体"); user.setTitle("措施员"); persons.add(user); Map<String, Object> root = new HashMap<String, Object>(); root.put("persons", persons); Template t = obj.getCfg().getTemplate("result.ftl"); Writer out = new OutputStreamWriter(new FileOutputStream("result.php"), "GBK"); t.process(root, out); out.flush(); out.close(); } }