1,架构

2,技术架构

3,应用的启动过程

4,用户的访问过程(前端为静态的html页面,这里主要是后端)

5,高级的地方,通过泛型,抽象了整个的MVC访问过程,对增删改查只写了一份代码,每一个新增的业务只需增加几个类,继承复用泛型类即可。

<!-- 创建游戏产品 -->

<action name="add" class="com.sz7road.web.action.admin.gameproduct.GameProductAction" method="modify">

<param name="operation">add</param>

<result name="input" type="tiles">adminGameProductAdd</result>

<result name="success" type="redirectAction">list</result>

<interceptor-ref name="globalInterceptorStack"></interceptor-ref>

</action>

<!-- 编辑游戏产品 -->

<action name="edit" class="com.sz7road.web.action.admin.gameproduct.GameProductAction" method="modify">

<param name="operation">edit</param>

<result name="success" type="redirectAction">list</result>

<result name="input" type="tiles">adminGameProductEdit</result>

<interceptor-ref name="globalInterceptorStack"></interceptor-ref>

</action>

<!-- 删除游戏产品 -->

<action name="del" class="com.sz7road.web.action.admin.gameproduct.GameProductAction" method="modify">

<param name="operation">del</param>

<result name="input" type="redirectAction">list</result>

<result name="success" type="redirectAction">list</result>

<interceptor-ref name="globalInterceptorStack"></interceptor-ref>

</action>

<!-- 查询游戏产品 -->

<action name="list" class="com.sz7road.web.action.admin.gameproduct.GameProductAction" method="list">

<param name="operation">list</param>

<result name="input" type="tiles">adminHomePage</result>

<result name="success" type="tiles">adminGameProductList</result>

<interceptor-ref name="globalInterceptorStack"></interceptor-ref>

</action>

public String modify() throws Exception {

EditType editType = EditType.getEnumType(getOperation());

if (null == editType) {

addActionError("operation参数非法");

return ActionSupport.INPUT;

}

boolean result = false;

try {

result = getService().modifyItem(editType, getT(), getDeleteIdArray());

} catch (Exception e) {

e.printStackTrace();

return ActionSupport.ERROR;

}

if (result) {

msg = getText("operation.success");

return ActionSupport.SUCCESS;

} else {

return ActionSupport.ERROR;

}

}

public String list() throws Exception {

paginationResult = new PaginationResult<T>();

dataList = getService().searchByPage(getPager());

final int total = getService().getTotalCount();

paginationResult.setTotal(total);

paginationResult.setResultList(dataList);

requestMap.put(AppConstant.PAGE_MAP_OBJECT, paginationResult);

return ActionSupport.SUCCESS;

}

@Override

public List<T> listByPage(Pager pager) {

boolean result = false;

final Session session = getCurrentSession();

Transaction transaction = session.beginTransaction();

List<T> list = null;

try {

final int pageSize = pager.getPageSize();

final int startPage = (pager.getPageIndex() - 1) * pageSize;

final StringBuffer queryStringBuffer = new StringBuffer(" from " + domainObjectName + " as " + instanceName  );

if(!Strings.isNullOrEmpty(pager.getSearchField()))

{

queryStringBuffer.append(" where "+instanceName + "." + pager.getSearchField() + " ").append(pager.getSearchOperation()+ " '").append(pager.getSearchValue()+"'");

}

queryStringBuffer.append(" order by ").append(instanceName + "." + pager.getSortField() + " " + pager.getSortOrder());

//            queryStringBuffer.append(" limit ").append(startPage).append(" , " + pageSize);

Query query = session.createQuery(queryStringBuffer.toString());

query.setFirstResult(startPage);

query.setMaxResults(pageSize);

list = query.list();

transaction.commit();

} catch (Exception ex) {

ex.printStackTrace();

transaction.rollback();

} finally {

return list;

}

}

public boolean update(final T entity) {

boolean result = false;

final Session session = getCurrentSession();

Transaction transaction = session.beginTransaction();

try {

if(entity.getId()>0){

session.update(entity);

result=true;

}  else{

result = session.save(entity) != null;

}

transaction.commit();

} catch (Exception ex) {

ex.printStackTrace();

transaction.rollback();

} finally {

return result;

}

}

6,tiles和基本展示控件包的使用

指定好定义tiles的配置文件,对象工厂,以及监听器即可

<context-param>

<param-name>org.apache.tiles.CONTAINER_FACTORY</param-name>

<param-value>org.apache.struts2.tiles.StrutsTilesContainerFactory</param-value>

</context-param>

<context-param>

<param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name><param-value>

/WEB-INF/tiles/tiles.xml,

/WEB-INF/tiles/tiles-adminlogin.xml,

/WEB-INF/tiles/tiles-adminPermission.xml,

/WEB-INF/tiles/tiles-adminUser.xml,

/WEB-INF/tiles/tiles-adminEvent.xml,

/WEB-INF/tiles/tiles-adminAgent.xml,

/WEB-INF/tiles/tiles-adminRecruit.xml,

/WEB-INF/tiles/tiles-adminCompanyInfo.xml,

/WEB-INF/tiles/tiles-adminCategory.xml,

/WEB-INF/tiles/tiles-adminAt7road.xml,

/WEB-INF/tiles/tiles-adminGameProduct.xml,

/WEB-INF/tiles/tiles-adminCarousel.xml

</param-value>

</context-param>

<listener>

<listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>

</listener>

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<tiles-definitions>

<!--首页-->

<definition name="adminDefaultLayout" template="/WEB-INF/web/common/admin/admin_layout.jsp">

<put-attribute name="titleKey" value="PageTitle" type="string"/>

<put-attribute name="header" value="/WEB-INF/web/common/admin/admin_header.jsp"/>

<put-attribute name="leftbar" value="/WEB-INF/web/common/admin/admin_left.jsp"/>

<put-attribute name="content" value=""/>

<put-attribute name="footer" value="/WEB-INF/web/common/admin/admin_footer.jsp"/>

</definition>

</tiles-definitions>模版定制

<tiles-definitions>

<definition name="adminCategoryAdd" extends="adminDefaultLayout">

<put-attribute name="titleKey" value="admin.categoryManage.add"/>

<put-attribute name="content" value="/WEB-INF/web/admin/category/admin_createCategory.jsp" />

</definition>个性实例

主要看展示数据的控件的使用:

<pg:pager items="<%=paginationResult.getTotal()%>"

url='<%=request.getContextPath()+"/gameProduct/list.action"%>'

index="center"

maxPageItems='<%= Integer.parseInt(SystemConfig.getProperty("admin.search.page.size")) %>'

maxIndexPages='<%= Integer.parseInt(SystemConfig.getProperty("admin.search.max.index.pages")) %>'

isOffset="true" export="offset,currentPageNumber=pageNumber" scope="request">

<display:table name="requestScope.paginationResult.resultList" class="tablelist"

defaultsort="0" cellpadding="0" cellspacing="0" style="width:99%"

requestURI="" id="gameProduct">

<%--<display:column property="id"   titleKey="admin.id" style="width:30px;"/>--%>

<display:column property="orderNum"  titleKey="admin.orderNum"/> //序号

<display:column property="gameName"  maxLength="5" titleKey="admin.gameProduct.gameName"/> //游戏名称

<display:column property="gameTitle"  maxLength="5" titleKey="admin.gameProduct.gameTitle"/> //游戏标题

<display:column property="gameWebsiteUrl" maxLength="15"  titleKey="admin.gameProduct.gameWebsiteUrl"/>//官网地址

<display:column property="gamePlayUrl"  maxLength="15" titleKey="admin.gameProduct.gamePlayUrl"/>//选服页地址

<display:column property="gameHtmlName" maxLength="5"  titleKey="admin.gameProduct.gameHtmlName"/>//html名称

<display:column property="gameImgShowInProduct"  maxLength="20" titleKey="admin.gameProduct.gameImgShowInProduct"/>//产品图片

<display:column property="gameShortDesc"  maxLength="5" titleKey="admin.gameProduct.gameShortDesc" escapeXml="true"/>//简介

<display:column property="gameDetailDesc" maxLength="5"  titleKey="admin.gameProduct.gameDetailDesc" escapeXml="true"/>//详细

<display:column property="createTime" style="width:50px;"  titleKey="admin.createTime" format="{0,date,yyyy-MM-dd}"/>//创建日期

<display:column style="width:60px;" titleKey="admin.common.operation"  href='${path}/gameProduct/edit.action'>

<s:url id="editUrl" namespace="/gameProduct" action="editPage">

<s:param name="gameProduct.id"><s:property value="#attr.gameProduct.id"/></s:param>

</s:url>

<s:a href="%{editUrl}"><s:text name="admin.common.edit"/></s:a>

<a href="#"  onClick="deleteGameProduct('<s:property value="#attr.gameProduct.id"/>','<s:property value="#attr.gameProduct.gameName"/>')"><s:text name="admin.common.delete"/></a>

</display:column>

</display:table>

<jsp:include page="/WEB-INF/web/common/pagination2.jsp" flush="true" />

</pg:pager>

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ page session="false" %>

<%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg" %>

<jsp:useBean id="currentPageNumber" type="java.lang.Integer" scope="request"/>

<jsp:useBean id="totalItems" type="java.lang.Integer" scope="request"/>

<jsp:useBean id="maxPageItems" type="java.lang.Integer" scope="request"/>

<br>

<span class="tabletitle">Result Page: </span>

<span class="content">

<%

int totalItemCount = totalItems.intValue();

int pageSise = maxPageItems.intValue();

if(totalItemCount < 1){

%>

没有查询到任何记录.

<%

}else if(totalItemCount == 1){

%>

1 - <%= totalItemCount %> of <%= totalItemCount %> record.

<%

}else if(totalItemCount <= pageSise){

%>

1 - <%= totalItemCount %> of <%= totalItemCount %> records.

<%

}

%>

<pg:index export="total=itemCount">

<pg:page export="first,last">

<%= first %> - <%= last %> of <%= total %> records.

</pg:page>

<pg:first export="firstPageUrl=pageUrl" unless="current">

<a href="<%= firstPageUrl %>">第一页</a>

</pg:first>

<pg:prev export="prevPageUrl=pageUrl">

<a href="<%= prevPageUrl %>">前一页</a>

</pg:prev>

<pg:pages><%

if (pageNumber == currentPageNumber) {

%> <b><%= pageNumber %></b> <%

} else {

%> <a href="<%= pageUrl %>"><%= pageNumber %></a> <%

}

%></pg:pages>

<pg:next export="nextPageUrl=pageUrl">

<a href="<%= nextPageUrl %>">后一页</a>

</pg:next>

<pg:last export="lastPageUrl=pageUrl" unless="current">

<a href="<%= lastPageUrl %>">末页</a>

</pg:last>

</pg:index>

</span>

<br>

7,小结

这是一个简单却经典的内容管理系统,在后台管理数据,对数据进行增删改查,数据管理好之后,使用freemarker生成静态的html页面,同时静态资源分域,加快了站点的显示速度;

后台使用泛型和抽象类,大大的减少了重复代码的数量,引入Guice容器,减少了对象的实例的互相依赖,同时使得程序的结构更加的清晰,hibernate简化了持久层代码的编写,tiles和数据展示控件的使用使得后端的数据展示比较美观,简单却使用的站点发布系统,通过这个项目,我熟悉了struts2,guice,hibernate,tiles技术,唯一一个觉得比较不妥的地方就是虽然大大的减少了重复代码,但是新增模块的话需要增加很多的类,如果可以定义一个公共的动态定位的类来顶替这些大量的只是简单继承的类我觉得后端的代码会更加整洁。

转载于:https://www.cnblogs.com/snidget/p/3598937.html

内容管理项目小结 成功案例-公司官网,游戏官网相关推荐

  1. 成功实施企业内容管理(ECM)的 5 个技巧

    成功实施企业内容管理(ECM)的 5 个技巧 俗话说,唯一不变的就是变化.在您不懈努力发展业务的过程中,您需要改变业务流程.不断升级产品.使用技术实现自动化.让您的员工和客户满意. 改变管理方式是实施 ...

  2. 企业内容管理(ECM)与文档管理的区别及其优势

    企业内容管理 企业内容管理 (ECM) 系统可以显着提高业务效率.降低成本并提高员工和客户满意度.ECM 软件几乎可以为公司内的任何部门带来可衡量的价值:会计.人力资源.销售.法律等都可以从中受益. ...

  3. 拯救被信息“淹没”的企业——越来越引人注目的企业内容管理

    ■ 张颖 雅虎公司收购付费搜索服务供应商Overture:IBM公司收购澳大利亚Web内容管理软件供应商Aptrix公司:Interwoven公司收购数字资产管理解决方案供应商MediaBin及文档整 ...

  4. 企业移动内容管理(MCM)

    1.什么是移动内容管理 (MCM) 移动内容管理 (MCM) 是指在组织中使用的移动设备上分发和管理企业文件的过程,以确保授权用户可以通过批准的设备安全地访问所需的资源.MCM 允许 IT 管理员在其 ...

  5. 巨杉数据库中标东莞农商银行非结构化内容管理平台项目

    2019独角兽企业重金招聘Python工程师标准>>> 近期,巨杉数据库中标东莞农村商业银行非结构化内容管理平台项目,通过新一代分布式数据库技术,助力东莞农商银行智慧化转型. 本次合 ...

  6. 【回顾】巨杉数据库中标东莞农商银行非结构化内容管理平台项目

    2018年,巨杉数据库中标东莞农村商业银行 "非结构化内容管理平台项目" ,通过新一代分布式数据库技术,助力东莞农商银行智慧化转型. 本次合作,巨杉数据库将帮助东莞农商银行接轨最前 ...

  7. 国家互联网信息办公室公布《互联网新闻信息服务单位内容管理从业人员管理办法》【软件网每日新闻播报│第10-31期】

    每一个企业级的人 都置顶了 中国软件网 中国软件网 为你带来最新鲜的行业干货   小编点评 互联网三大错觉 WP崛起 索尼倒闭 谷歌返华 知情人士透漏 谷歌新入华计划 与搜索 安卓无关 人工智能是中心 ...

  8. 推进“数字外服”项目,提升公司管理半径

    北京外企 &外服控股:人服国企借道资产重组上市,发 力数字化 谋新篇4.2.1 北京城乡:与北京外企资产置换在即,人服赛道再添巨头 7 月 28 日,证监会批复北京城乡与北京外企资产置换,并通 ...

  9. 信息系统项目管理师(2022年)—— 重点内容:项目范围管理(5)

    验收的可交付成果,属于项目范围管理中(确认范围 )过程的输出. 确认范围的输出主要包括:(1)验收的可交付成果:(2)变更请求:(3)工作绩效信息:(4)项目文件更新. ---- 群体创新技术(Gro ...

  10. 信息系统项目管理师(2022年)—— 重点内容:项目组合管理(19)

    项目组合包含项目集.项目.项目组合子集以及日常运作业务,其目的在于通过组合管理方式来实现组织的战略目标.项目集则是项目子集.项目以及日常运作业务的集合,组织通过项目集管理来支持项目组合管理. 项目组合 ...

最新文章

  1. VTK:比较随机生成器用法实战
  2. 复现强网杯python is the best language 2
  3. 开启HDR视觉盛宴:究竟什么视频算得上HDR?
  4. bert 中文 代码 谷歌_ELECTRA中文预训练模型开源,110个参数,性能媲美BERT
  5. Windows10下安装Tensorflow
  6. 使用 Unbound 创建DNS服务器
  7. Djangobook
  8. matlab绘制vti群速度,声波测井中的相速度与群速度讨论.PDF
  9. 基于Android的五子棋 开题报告,毕业论文 基于Android的五子棋设计.doc
  10. c++语言设计五子棋游戏,C++实现五子棋游戏
  11. 量化交易入门阶段——MACD的背离用法(一)——DIFF背离
  12. 【Android】_干货_制作透明背景icon
  13. Terraform基础(一)-什么是Terraform?
  14. 云服务器与虚拟主机有什么区别,我们应该如何选择?
  15. IT外企那点儿事(15): 好员工和坏员工只有一步之遥
  16. 判断file是否存在的方法
  17. CTF CRYPTO 从零开始的RSA1
  18. java 通联支付接口_通联支付接口.rar
  19. OSChina 周五乱弹 ——程序员的友谊小船是如何说翻就翻的
  20. Android4.4以上系统选择将第三方短信应用设置为默认短信应用方法

热门文章

  1. 区块链Hyperledger Fabric背书过程中链码是并行还是串行?
  2. Unity MRTK(三)部署到Hololens模拟器
  3. sonnar检查出没有的方法_你有没有定期检查轮胎?它还能换位置,真是“经济”宝藏方法...
  4. 在mysql数据库中创建Oracle数据库中的scott用户表
  5. Win 10 下载与安装 Oracle 12c 详细图解 与 Oracle 12c 卸载
  6. 动态加载执行 JS 文件、对话框 confirm 方法
  7. linux怎么db2命令窗口,Linux 命令行进入DB2
  8. 阶段3 3.SpringMVC·_06.异常处理及拦截器_2 SpringMVC异常处理之演示程序异常
  9. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_14_匿名内部类方式实现线程的创建...
  10. 程序员最想得到的十大证件,你最想得到哪个?