内容管理项目小结 成功案例-公司官网,游戏官网
1,架构
2,技术架构
3,应用的启动过程
4,用户的访问过程(前端为静态的html页面,这里主要是后端)
5,高级的地方,通过泛型,抽象了整个的MVC访问过程,对增删改查只写了一份代码,每一个新增的业务只需增加几个类,继承复用泛型类即可。
add
edit
del
list
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
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
boolean result = false;
final Session session = getCurrentSession();
Transaction transaction = session.beginTransaction();
List
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的配置文件,对象工厂,以及监听器即可
/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
<?xml version="1.0" encoding="UTF-8"?>
模版定制
个性实例
主要看展示数据的控件的使用:
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">
defaultsort="0" cellpadding="0" cellspacing="0" style="width:99%"
requestURI="" id="gameProduct">
<%--
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page session="false" %>
<%@ taglib uri="/WEB-INF/pager-taglib.tld" prefix="pg" %>
Result Page:
<%
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.
<%
}
%>
<%= first %> - <%= last %> of <%= total %> records.
if (pageNumber == currentPageNumber) {
%> <%= pageNumber %> <%
} else {
%> <%= pageNumber %> <%
}
%>
7,小结
这是一个简单却经典的内容管理系统,在后台管理数据,对数据进行增删改查,数据管理好之后,使用freemarker生成静态的html页面,同时静态资源分域,加快了站点的显示速度;
后台使用泛型和抽象类,大大的减少了重复代码的数量,引入Guice容器,减少了对象的实例的互相依赖,同时使得程序的结构更加的清晰,hibernate简化了持久层代码的编写,tiles和数据展示控件的使用使得后端的数据展示比较美观,简单却使用的站点发布系统,通过这个项目,我熟悉了struts2,guice,hibernate,tiles技术,唯一一个觉得比较不妥的地方就是虽然大大的减少了重复代码,但是新增模块的话需要增加很多的类,如果可以定义一个公共的动态定位的类来顶替这些大量的只是简单继承的类我觉得后端的代码会更加整洁。