cmspageact.java
来自「为用户提供透明的管理平台」· Java 代码 · 共 280 行
JAVA
280 行
package com.jeecms.cms.action.front;
import static com.jeecms.cms.Constants.MEMBER_SYS;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.jeecms.article.entity.Article;
import com.jeecms.article.manager.ArticleMng;
import com.jeecms.cms.Constants;
import com.jeecms.cms.entity.CmsChannel;
import com.jeecms.cms.entity.CmsConfig;
import com.jeecms.cms.entity.CmsMember;
import com.jeecms.cms.entity.CmsMemberGroup;
import com.jeecms.cms.manager.CmsChannelMng;
import com.jeecms.cms.manager.CmsConfigMng;
import com.jeecms.cms.manager.CmsMemberMng;
import com.jeecms.cms.service.PageCacheSvc;
import com.jeecms.core.PageBaseAction;
import com.ponyjava.common.page.Paginable;
import com.ponyjava.common.page.SimplePage;
@SuppressWarnings("unchecked")
@Scope("prototype")
@Controller("cms.cmsPageAct")
public class CmsPageAct extends PageBaseAction {
private static final Logger log = LoggerFactory.getLogger(CmsPageAct.class);
@Override
protected String sysIndex() throws IOException {
String result = SUCCESS;
if (getConfig().getCacheHomepage()) {
log.debug("首页缓存开启");
result = PAGE_CACHE_RESULT;
if (useHomepageCache()) {
return null;
}
}
sysType = getConfig().getDefaultSystem();
chnl = cmsChannelMng.getRoot(getWebId(), sysType);
if (chnl == null) {
addActionError("站点首页不存在,请在后台添加首页!");
return showMessage();
}
// @ TODO 需要改变统计浏览次数的策略。目前的方法在大量并发下容易出现脏数据,并且频繁更新数据库,性能不佳。
// chnl.setVisitTotal(chnl.getVisitTotal() + 1);
tplPath = chnl.chooseTplChannel();
return result;
}
@Override
protected String chnlIndex(String chnlName) throws IOException {
String result = SUCCESS;
if (getConfig().getCacheChannel()) {
log.debug("栏目缓存开启");
result = PAGE_CACHE_RESULT;
if (useChannelCache(chnlName)) {
return null;
}
}
chnl = cmsChannelMng.getByPath(getWebId(), chnlName);
if (chnl == null) {
return pageNotFound();
}
// @ TODO 需要改变统计浏览次数的策略。目前的方法在大量并发下容易出现脏数据,并且频繁更新数据库,性能不佳。
// chnl.setVisitTotal(chnl.getVisitTotal() + 1);
tplPath = chnl.chooseTplChannel();
sysType = chnl.getSysType();
return result;
}
@Override
protected String content(String chnlName, Long id) {
arti = articleMng.findAndCheckResPath(id);
String err = checkArticle(arti, chnlName);
if (err != null) {
return err;
}
chnl = arti.getChannel();
sysType = chnl.getSysType();
pagination = new SimplePage(pageNo, 1, arti.getPageCount());
// @ TODO 需要改变统计浏览次数的策略。目前的方法在大量并发下容易出现脏数据,并且频繁更新数据库,性能不佳。
arti.updateVisit(1);
tplPath = arti.chooseTpl();
return SUCCESS;
}
@Override
protected String alone(String chnlName) {
chnl = cmsChannelMng.getByPath(getWebId(), chnlName);
if (chnl == null) {
return pageNotFound();
}
sysType = chnl.getSysType();
tplPath = chnl.chooseTplChannel();
return SUCCESS;
}
@Override
protected String pageNotFound() {
return handleResult(PAGE_NOT_FOUND, MEMBER_SYS, getConfig()
.getSolution(MEMBER_SYS));
}
@Override
protected String getSolution() {
return getConfig().getSolution(getSysType());
}
private String checkArticle(Article entity, String chnlName) {
if (entity == null || !entity.getChannel().getPath().equals(chnlName)) {
return pageNotFound();
}
// 检查阅读权限
CmsMemberGroup group = entity.getGroup();
if (group == null) {
group = entity.getChannel().getGroupVisit();
}
if (group != null) {
CmsMember cmsMember = getCmsMember();
if (cmsMember == null) {
return redirectLogin();
}
int artiLevel = group.getLevel();
CmsMemberGroup memberGroup = cmsMember.getGroup();
int memberLevel = memberGroup.getLevel();
if (artiLevel > memberLevel) {
addActionError("您的会员组级别是“" + memberGroup.getName() + "”,该页面需要“"
+ group.getName() + "”或以上级别才能访问");
return showMessage();
}
}
if (entity.getDisabled()) {
addActionError("您所访问的文章已经被关闭");
return showMessage();
}
return null;
}
public CmsChannel getChnl() {
return chnl;
}
public Article getArti() {
return arti;
}
public String getSysType() {
return sysType;
}
public CmsConfig getConfig() {
return cmsConfigMng.findById(getWebId());
}
/**
* 获得cms会员对象
*
* @return
*/
public CmsMember getCmsMember() {
Long memberId = getMemberId();
if (memberId == null) {
return null;
} else {
return cmsMemberMng.findById(memberId);
}
}
/**
* 获得cms会员ID
*
* @return
*/
public Long getCmsMemberId() {
CmsMember cmsMember = getCmsMember();
if (cmsMember == null) {
return null;
} else {
return cmsMember.getId();
}
}
private String showMessage() {
return handleResult(SHOW_MESSAGE, Constants.MEMBER_SYS);
}
protected String redirectLogin() {
rootWebUrl = getWeb().getRootWeb().getWebUrl();
return Constants.CMS_MEMBER_LOGIN;
}
private boolean useCache(Serializable key, PageCacheSvc cache)
throws IOException {
byte[] bytes = cache.get(key);
if (bytes != null) {
int i = 0;
while (i < MAX_WAIT_TIME && bytes.length == 0) {
try {
i += SLEEP_FOR_WAIT;
Thread.sleep(SLEEP_FOR_WAIT);
bytes = cache.get(key);
log.debug("等待缓存sleep{}ms" + SLEEP_FOR_WAIT);
} catch (InterruptedException e1) {
log.warn("sleep interrupted");
}
}
int len = bytes.length;
if (i < MAX_WAIT_TIME && len > 0) {
HttpServletResponse resp = ServletActionContext.getResponse();
resp.setContentLength(len);
resp.setCharacterEncoding("GBK");
resp.setContentType("text/html;charset=GBK");
OutputStream out = resp.getOutputStream();
out.write(bytes, 0, len);
out.flush();
log.debug("缓存命中");
return true;
} else {
log.warn("等待已经超过{}ms,没有等到缓存", i);
}
} else {
// 准备生成缓存
cache.put(key, new byte[0]);
log.debug("准备生成缓存");
}
return false;
}
private boolean useHomepageCache() throws IOException {
ckHomepage = getWebId();
cacheType = HOMEPAGE_CACHE;
return useCache(ckHomepage, homepageCacheSvc);
}
private boolean useChannelCache(String chnlName) throws IOException {
ckChannel = channelCacheSvc.getKey(getWebId(), chnlName, getPageNo());
cacheType = CHANNEL_CACHE;
return useCache(ckChannel, channelCacheSvc);
}
private static final int SLEEP_FOR_WAIT = 1000;
private static final int MAX_WAIT_TIME = 15000;
@Autowired
private CmsConfigMng cmsConfigMng;
@Autowired
private CmsChannelMng cmsChannelMng;
@Autowired
private CmsMemberMng cmsMemberMng;
@Autowired
private ArticleMng articleMng;
private CmsChannel chnl;
private Article arti;
private String sysType;
private Paginable pagination;
public void setChnl(CmsChannel chnl) {
this.chnl = chnl;
}
public Paginable getPagination() {
return pagination;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?