主题 : jeecms v2012数据库字典
级别: 秀才
UID: 35142
积分:69 加为好友
威望: 0 精华: 0
主题:0 回复:64
注册时间:2012-06-15
在线时长:0
601#   发表于:2012-06-18 16:18:22  IP:1.254.*.*
1.在myeclipse中新建一个项目jeecms,将服务器中jeecms项目下web-inf文件夹下内容拷到新建项目中 
2.解压缩jeecms-3.0.2-final-src,在src文件夹下会看到有三个压缩文件,如果只想进行普通的二次开发,可以只导入cms这个源码,删除jeecms-cms-identity-3.0.2-final.jar即可,如果想进行深入的二次开发,需要导入common和core源码,另导入common-lib下的jar包,删除jeecms-cms- identity-3.0.2-final.jar,jeecms-common-3.0.2-final.jar ,jeecms-core- identity-3.0.2-final.jar这三个jar包,切记:务必进行build path 
3.修改jdbc链接,自己导入数据库。  
4.把服务器下install\config下的web.xml复制出来覆盖掉新建项目WEB-INF下的web.xml 
5.classes下有四个文件,手动烤到myeclipse项目src根目录下中 
6.将服务器上jeecms项目删掉,发布新建的jeecms项目。 

首页的加载过程: 
在浏览器中输入http://localhost:8080/jeecms,回车 
首先进入配置文件web.xml, 
<context-param> 
 <param-name>contextConfigLocation</param-name> 
 <!----> 
 <param-value> 
 /WEB-INF/config/application-context.xml 
 /WEB-INF/config/cache-context.xml 
 /WEB-INF/config/captcha-context.xml 
 /WEB-INF/config/jeecore-context.xml 
 /WEB-INF/config/jeecms-context.xml 
 </param-value> 
</context-param> 

应用范围内的初始化参数 
其中jeecms-context.xml是对标签的初始化 

<welcome-file-list> 
 <welcome-file>index.html</welcome-file> 
 <welcome-file>index.shtml</welcome-file> 
 <welcome-file>index.jhtml</welcome-file> 
</welcome-file-list> 
通过以上标签找到应该加载哪一个页面 

<servlet> 
 <servlet-name>JeeCmsFront</servlet-name> 
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
 <init-param> 
 <param-name>contextConfigLocation</param-name> 
 <param-value>/WEB-INF/config/jeecms-servlet-front.xml</param-value> 
 </init-param> 
 <load-on-startup>2</load-on-startup> 
 </servlet> 
<servlet-mapping> 
 <servlet-name>JeeCmsFront</servlet-name> 
 <url-pattern>*.jhtml</url-pattern> 
 </servlet-mapping> 
 <servlet-mapping> 
 <servlet-name>JeeCmsFront</servlet-name> 
 <url-pattern>*.jspx</url-pattern> 
 </servlet-mapping> 
 <servlet-mapping> 
 <servlet-name>JeeCmsFront</servlet-name> 
 <url-pattern>*.jsp</url-pattern> 
 </servlet-mapping> 
 <servlet-mapping> 
 <servlet-name>JeeCmsFront</servlet-name> 
 <url-pattern>*.htm</url-pattern> 
</servlet-mapping> 

通过servlet配置,可以找到jeecms-servlet-front.xml,在此配置文件的最后有 
<import resource="jeecms-servlet-front-action.xml"/>代码 
找到jeecms-servlet-front-action.xml,在此配置文件中有 
<bean id="dynamicAct" class="com.jeecms.cms.action.front.DynamicPageAct"/> 
可以找到类DynamicPageAct,此类是首页模板。 
在类DynamicPageAct中有 
public static final String TPL_INDEX = "tpl.index"; 
找到WEB-INF\languages\jeecms_front下messages_zh_CN.properties配置文件,可以找到对应的首页面 
tpl.index=首页(工程中的首页.html文件) 



标签的配置流程,以cms_content_list为例 
首先,每一个标签的声明都是在jeecms-context.xml中进行的, 
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" 
 default-lazy-init="true"> 
…… 
<bean id="cms_content_list" class="com.jeecms.cms.action.directive.ContentListDirective"/>(声明标签对应的类) 
<bean id="staticPageSvc" class="com.jeecms.cms.staticpage.StaticPageSvcImpl"> 
 <property name="freeMarkerConfigurer"> 
 <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
 <property name="freemarkerVariables"> 
 <map> 
 …… 
 <entry key="cms_content_list" value-ref="cms_content_list"/> 
 …… 
 </map> 
 </property> 
 <property name="templateLoaderPath" value=""/> 
 …… 
 </bean> 
 </property> 
</bean> 
</beans> 
此外,在配置文件jeecms-servlet-front.xml中,还有一段对标签的配置 
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
 <property name="freemarkerVariables"> 
 <map> 
 …… 
 <entry key="cms_content_list" value-ref="cms_content_list"/> 
 …… 
   </map> 
 </property> 
         …… 
</bean> 

 </bean>类ContentListDirective继承自AbstractContentDirective,最主要的是execute方法 
public class ContentListDirective extends AbstractContentDirective { 
 /** 
  * 模板名称 
  */ 
 public static final String TPL_NAME = "content_list"; 

 /** 
  * 输入参数,文章ID。允许多个文章ID,用","分开。排斥其他所有筛选参数。 
  */ 
 public static final String PARAM_IDS = "ids"; 

 @SuppressWarnings("unchecked") 
 public void execute(Environment env, Map params, TemplateModel[] loopVars, 
 TemplateDirectiveBody body) throws TemplateException, IOException { 
 //获取站点 
 CmsSite site = FrontUtils.getSite(env); 
 //获取内容列表,可以通过此处进行更改,获取自己数据库中的数据 
 List<Content> list = getList(params, env); 

 Map<String, TemplateModel> paramWrap = new HashMap<String, TemplateModel>( 
 params); 
 //OUT_LIST值为tag_list,在类DirectiveUtils中声明,将内容列表放入其中 
 paramWrap.put(OUT_LIST, DEFAULT_WRAPPER.wrap(list)); 
 //将params的值复制到variable中 
 Map<String, TemplateModel> origMap = DirectiveUtils 
 .addParamsToVariable(env, paramWrap); 
 //获取的是参数PARAM_TPL,是否调用模板以及调用的模板类型 
 InvokeType type = DirectiveUtils.getInvokeType(params); 
 //获取传入参数,列表样式,根据不同的参数获取不同的样式列表 
 String listStyle = DirectiveUtils.getString(PARAM_STYLE_LIST, params); 
 if (InvokeType.sysDefined == type) { 
 if (StringUtils.isBlank(listStyle)) { 
 throw new ParamsRequiredException(PARAM_STYLE_LIST); 
 } 
 //列表样式模板 
 env.include(TPL_STYLE_LIST + listStyle + TPL_SUFFIX, UTF8, true); 
 } else if (InvokeType.userDefined == type) { 
 if (StringUtils.isBlank(listStyle)) { 
 throw new ParamsRequiredException(PARAM_STYLE_LIST); 
 } 
 //列表样式模板路径 WEB-INF\t\cms_sys_defined\style_list\style_2-1.html 
 FrontUtils.includeTpl(TPL_STYLE_LIST, site, env); 
 } else if (InvokeType.custom == type) { 
//这个模板就是自己声明的,即content_list.html,如果采用自定义模板的话,页面中可以只写上标签,并添加上标签内需要的几个参数,不需要写标签体的内容,会去自动调用模板中的标签体。 
 FrontUtils.includeTpl(TPL_NAME, site, params, env); 
 } else if (InvokeType.body == type) { 
 body.render(env.getOut()); 
 } else { 
 throw new RuntimeException("invoke type not handled: " + type); 
 } 
 //将variable中的params值移除 
 DirectiveUtils.removeParamsFromVariable(env, paramWrap, origMap); 
 } 

 @SuppressWarnings("unchecked") 
 protected List<Content> getList(Map<String, TemplateModel> params, 
 Environment env) throws TemplateException { 
 Integer[] ids = DirectiveUtils.getIntArray(PARAM_IDS, params); 
 if (ids != null) { 
 //根据内容ID数组获取文章列表 
 return contentMng.getListByIdsForTag(ids, getOrderBy(params)); 
 } else { 
 return (List<Content>) super.getData(params, env); 
 } 
 } 

 @Override 
 protected boolean isPage() { 
 return false; 
 } 


Content_list.html中的内容 
[#list tag_list as a] 
<li><a href="${a.url}" target="_blank">${a.title}</a></li> 
[/#list] 
就是简单的将tag_list中的内容,即“paramWrap.put(OUT_LIST, DEFAULT_WRAPPER.wrap(list));”中放入的数据遍历出来 

style_2-1.html中的内容 主要是对图文列表或标题列表向上滚动的样式的,其中包含两个同样为样式的文件 
style_2-1_core.html(图文列表或标题列表向上滚动)和style_1-1_core.html(图文列表或标题列表向上滚动),在此就不做赘述了。 

Jeecms是基于Spring注解,在自定义标签时对于*类和dao service等注意注解的问题。 

下面是我自己定义的标签mycontent_list的实现过程 

首先,在数据库里创建了一个jc_mycontent的表,其中有id,title,content三个字段 
其次,创建了一个*类 
public class MyContent { 
 private static final long serialVersionUID = 1L; 
 private Integer id; 
 private String title; 
 private String content; 
 public MyContent () { 
 super(); 
 } 
……get set方法 

接下来是配置hibernate中jc_mycontent表的配置文件 
<?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> 

与数据库交互的持久层接口 
public interface MyContentDao { 
 public List<MyContent> getList(); 

持久层实现类 
@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; 
 } 

业务层接口 
public interface MyContentMng { 
 public List<MyContent> getList(); 

业务层实现类 
@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 
public abstract class AbstractMyContentDirective implements 
 TemplateDirectiveModel { 
protected Object getData(Map<String, TemplateModel> params, Environment env) 
 throws TemplateException { 
 return myContentMng.getList(); 
 } 
 @Autowired 
 protected MyContentMng myContentMng; 

自定义标签中最重要的类继承上边的抽象类 
public class MyContentListDirective extends AbstractMyContentDirective { 
 /** 
  * 模板名称 
  */ 
 public static final String TPL_NAME = "mycontent_list"; 
 @SuppressWarnings("unchecked") 
 public void execute(Environment env, 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); 
 //OUT_LIST值为tag_list,将内容列表放入其中 
 paramWrap.put(MYOUT_LIST, DEFAULT_WRAPPER.wrap(list)); 
 //将params的值复制到variable中 
 Map<String, TemplateModel> origMap = DirectiveUtils.addParamsToVariable(env, paramWrap); 
 //没有采用默认的模板,直接采用自己写的简单的模板(mycontent_list.html) 
 FrontUtils.includeTpl(TPL_NAME, site, params, env); 
 //将variable中的params值移除 
 DirectiveUtils.removeParamsFromVariable(env, paramWrap, origMap); 
 } 
 protected List<MyContent> getList(Map<String, TemplateModel> params, 
 Environment env) throws TemplateException { 
 return myContentMng.getList(); 
 } 

样式模板mycontent_list.html内容,里边可以自己添加一些样式,可参考\t\cms_sys_defined\style_list下样式文件 
[#list mytag_list as a] 
<li><a href="${a.title}"><font color='blue'>"${a.content}"</font></a></li> 
[/#list] 

首页里加入如下代码 
[@cms_mycontent_list] 
    <ul class="topnews"> 
    </ul> 
[/@cms_mycontent_list] 
通过以上这些代码,可以实现将自己的表jc_mycontent中的数据查询并显示在页面上
级别: 秀才
UID: 25145
积分:88 加为好友
威望: 0 精华: 0
主题:2 回复:47
注册时间:2011-10-28
在线时长:0
602#   发表于:2012-06-19 11:12:34  IP:219.31.*.*
admin admin 
级别: 秀才
UID: 32699
积分:58 加为好友
威望: 0 精华: 0
主题:3 回复:26
注册时间:2012-04-20
在线时长:0
603#   发表于:2012-06-19 21:16:51  IP:202.241.*.*
下下来看看!
级别: 童生
UID: 34559
积分:35 加为好友
威望: 0 精华: 0
主题:0 回复:34
注册时间:2012-05-31
在线时长:0
604#   发表于:2012-06-20 12:47:56  IP:222.242.*.*
kankan
级别: 童生
UID: 19461
积分:36 加为好友
威望: 0 精华: 0
主题:0 回复:27
注册时间:2011-05-12
在线时长:0
605#   发表于:2012-06-20 15:27:09  IP:220.204.*.*
sadfsdaf
级别: 童生
UID: 23173
积分:26 加为好友
威望: 0 精华: 0
主题:3 回复:10
注册时间:2011-08-29
在线时长:0
606#   发表于:2012-06-20 15:48:45  IP:61.81.*.*
级别: 童生
UID: 35263
积分:18 加为好友
威望: 0 精华: 0
主题:1 回复:11
注册时间:2012-06-19
在线时长:0
607#   发表于:2012-06-25 11:35:26  IP:114.89.*.*
dd
级别: 秀才
UID: 34762
积分:58 加为好友
威望: 0 精华: 0
主题:0 回复:37
注册时间:2012-06-05
在线时长:0
608#   发表于:2012-06-26 19:52:43  IP:118.217.*.*
好像很厉害的样子
级别: 秀才
UID: 35277
积分:73 加为好友
威望: 0 精华: 0
主题:7 回复:20
注册时间:2012-06-20
在线时长:0
609#   发表于:2012-06-27 09:46:01  IP:58.26.*.*
看看
级别: 贡士
UID: 35548
积分:439 加为好友
威望: 0 精华: 0
主题:49 回复:162
注册时间:2012-06-27
在线时长:0.14
610#   发表于:2012-06-27 15:15:02  IP:211.30.*.*
看看看看看看看看
聚美建站,一站式建站服务,并配有免费微信营销