
CMS是”Content Management System”的缩写,意为”内容管理系统”。 内容管理系统是企业信息化建设和电子政务的新宠,也是一个相对较新的市场。对于内容管理,业界还没有一个统一的定义,不同的机构有不同的理解。
自定义标签[mycontent_list]实现步骤:
创建jc_mycontent的表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
   |  create table JC_MYCONTENT (   id      NUMBER not null,   title   VARCHAR2(250),   content VARCHAR2(250) ) tablespace CMS   pctfree 10   initrans 1   maxtrans 255   storage   (     initial 64K     minextents 1     maxextents unlimited   );
  alter table JC_MYCONTENT   add constraint PK_ID primary key (ID)   using index    tablespace CMS   pctfree 10   initrans 2   maxtrans 255;
 
 
  | 
 
创建实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
   | package com.jeecms.cms.entity.main;
  public class MyContent { 	private Integer id; 	private String title; 	private String content;
  	public Integer getId() { 		return id; 	}
  	public void setId(Integer id) { 		this.id = id; 	}
  	public String getTitle() { 		return title; 	}
  	public void setTitle(String title) { 		this.title = title; 	}
  	public String getContent() { 		return content; 	}
  	public void setContent(String content) { 		this.content = content; 	}
  	public MyContent(Integer id, String title, String content) { 		super(); 		this.id = id; 		this.title = title; 		this.content = content; 	}
  	public MyContent() { 		super(); 	}
  }
   | 
 
接下来是配置hibernate中jc_mycontent表的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jeecms.cms.entity.main"> 	<class name="MyContent" table="jc_mycontent"> 		<meta attribute="sync-DAO">false</meta> 		<cache usage="read-write" /> 		<id name="id" type="java.lang.Integer" column="id"> 			<generator class="identity" /> 		</id> 		<property name="title" column="title" type="java.lang.String" 			not-null="true" /> 		<property name="content" column="content" type="java.lang.String" 			not-null="true" /> 	</class> </hibernate-mapping>
   | 
 
持久层接口
1 2 3 4 5 6 7 8 9
   | package com.jeecms.cms.dao.main;
  import java.util.List;
  import com.jeecms.cms.entity.main.MyContent;
  public interface MyContentDao { 	public List<MyContent> getList(); }
   | 
 
持久层实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
   | package com.jeecms.cms.dao.main.impl;
  import java.util.List;
  import org.springframework.stereotype.Repository;
  import com.jeecms.cms.dao.main.MyContentDao; import com.jeecms.cms.entity.main.MyContent; import com.jeecms.common.hibernate4.Finder; import com.jeecms.common.hibernate4.HibernateBaseDao;
  @Repository
  public class MyContentDaoImpl extends HibernateBaseDao<MyContent, Integer> implements MyContentDao { 	@SuppressWarnings("unchecked") 	public List<MyContent> getList() { 		return find(byNothing()); 	}
  	private Finder byNothing() { 		Finder f = Finder.create(); 		f.append("from MyContent"); 		f.setCacheable(true); 		return f; 	}
  	@Override 	protected Class<MyContent> getEntityClass() { 		return MyContent.class; 	} }
   | 
 
业务层接口
1 2 3 4 5 6 7 8 9
   | package com.jeecms.cms.manager.main;
  import java.util.List;
  public interface MyContentMng {   public List getList(); }public interface MyContentMng {   public List getList(); }
   | 
 
业务层实现类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
   | package com.jeecms.cms.manager.main.impl;
  import java.util.List;
  import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;
  import com.jeecms.cms.dao.main.MyContentDao; import com.jeecms.cms.entity.main.MyContent; import com.jeecms.cms.manager.main.MyContentMng; import com.jeecms.cms.service.ContentListener;
  @Service
  @Transactional public class MyContentMngImpl implements MyContentMng { 	@Transactional(readOnly = true) 	 	public List<MyContent> getList() { 		return myContentDao.getList(); 	}
  	private MyContentDao myContentDao;
  	@Autowired 	 	public void setMyContentDao(MyContentDao myContentDao) { 		this.myContentDao = myContentDao; 	}
  	private List<ContentListener> listenerList;
  	@Autowired 	public void setListenerList(List<ContentListener> listenerList) { 		this.listenerList = listenerList; 	} }
   | 
 
标签类的抽象类
最主要的就是getData这个方法,以及绑定业务层(其中也可以添加多种查询方法,可参考类AbstractContentDirective )。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   | package com.jeecms.cms.action.directive.abs;
  import java.util.Map;
  import org.springframework.beans.factory.annotation.Autowired;
  import com.jeecms.cms.manager.main.MyContentMng;
  import freemarker.core.Environment; import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateException;
  public abstract class AbstractMyContentDirective implements TemplateDirectiveModel { 	protected Object getData(Map params, Environment env) throws TemplateException { 		return myContentMng.getList(); 	}
  	@Autowired 	protected MyContentMng myContentMng; }
   | 
 
标签工具类DirectiveUtils下定义输出参数:MYOUT_LIST
1
   | public static final String MYOUT_LIST = "mytag_list";
   | 
 
自定义标签中最重要的类继承上边的抽象类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
   | package com.jeecms.cms.action.directive;
  import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map;
  import com.jeecms.cms.action.directive.abs.AbstractMyContentDirective; import com.jeecms.cms.entity.main.MyContent;
  import static com.jeecms.common.web.freemarker.DirectiveUtils.MYOUT_LIST; import com.jeecms.common.web.freemarker.DefaultObjectWrapperBuilderFactory; import com.jeecms.common.web.freemarker.DirectiveUtils; import com.jeecms.core.entity.CmsSite; import com.jeecms.core.web.util.FrontUtils;
  import freemarker.core.Environment; import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateException; import freemarker.template.TemplateModel;
  public class MyContentListDirective extends AbstractMyContentDirective { 	
 
  	public static final String TPL_NAME = "mycontent_list";
  	@SuppressWarnings("unchecked") 	public void execute(Environment env, @SuppressWarnings("rawtypes") Map params, 			TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, 			IOException { 		 		CmsSite site = FrontUtils.getSite(env); 		 		List<MyContent> list = getList(params, env); 		Map<String, TemplateModel> paramWrap = new HashMap<String, TemplateModel>(params); 		 		paramWrap.put(MYOUT_LIST, DefaultObjectWrapperBuilderFactory.getDefaultObjectWrapper() 				.wrap(list));
  		
  		Map<String, TemplateModel> origMap = DirectiveUtils.addParamsToVariable(env, paramWrap); 		 		FrontUtils.includeTpl(TPL_NAME, site, params, env); 		 		DirectiveUtils.removeParamsFromVariable(env, paramWrap, origMap); 	}
  	@SuppressWarnings("unchecked") 	protected List<MyContent> getList(Map<String, TemplateModel> params, Environment env) 			throws TemplateException { 		return myContentMng.getList(); 	} }
   | 
 
在jeecms-context.xml中声明标签
1
   | <bean id="cms_mycontent_list" class="com.jeecms.cms.action.directive.MyContentListDirective"/>
   | 
 
在jeecms-context.xml中注入DAO
1
   | <bean id="myContentDao" class="com.jeecms.cms.dao.main.impl.MyContentDaoImpl"/>
   | 
 
在jeecms-context.xml中注入Manager
1
   | <bean id="myContentMng" class="com.jeecms.cms.manager.main.impl.MyContentMngImpl"/>
   | 
 
配置文件jeecms-servlet-front.xml中有一段对标签的配置
jeecms.properties中配置标签名
1
   | directive.cms_mycontent_list=cms_mycontent_list
   | 
 
新建模板
WEB-INF\t\cms\www\oa\tag下新建模板mycontent_list.html,并加入如下代码(里边也可以自己添加一些样式,可参考WEB-INF\t\cms_sys_defined\style_list下样式文件)
1 2 3 4 5
   | [#list mytag_list as a] 	<li>   <a href="${a.title}">"${a.content}"</a> 	</li> [/#list]
   | 
 
调用代码
1 2 3 4 5 6 7
   | [@cms_mycontent_list] 	[#list mycontent_list as a] 			<li> 		  <a href="${a.title}">"${a.content}"</a> 			</li> 	[/#list] [/@cms_mycontent_list]
   | 
 
通过以上这些代码,实现将自己的表jc_mycontent中的数据查询并显示在页面上