阅读:<script type="text/javascript" src="NavServlet?method=click&articleId=${param.articleId }"></script>
//更新文章点击量记录,在一个小时之内同一个IP的连续点击,将不重复计算点击量!
public void click(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String articleId = request.getParameter("articleId");
//首先,从ServletContext中取出一个Map
Map visitors = (Map)getServletContext().getAttribute("visitors");
if(visitors == null){
visitors = new ConcurrentHashMap();
getServletContext().setAttribute("visitors", visitors);
}
//得到客户端IP地址
String clickIp = request.getRemoteAddr();
String key = articleId+"_"+clickIp; //以文章ID和用户IP为键
Date lastVisitTime = (Date)visitors.get(key);
Article a = articleDao.findArticleById(Integer.parseInt(articleId));
int clickNumber = a.getClickNumber(); //旧的点击量
/**
* 没有访问记录、或最后一次访问在一个小时之前,需再次记录访问量
* 否则,无需再次记录访问量
*/
if(lastVisitTime == null || !withinOneHour(lastVisitTime)){
//更新点击量
clickNumber = articleDao.updateClickNumber(Integer.parseInt(articleId));
visitors.put(key, new Date());
}
response.setContentType("text/javascript");
response.getWriter().println("document.write('"+clickNumber+"')");
}
/**
* 将lastVisitTime和现在的时间相比,判断其是否在一个小时之内
* @param lastVisitTime
* @return
*/
private boolean withinOneHour(Date lastVisitTime){
//现在的时间
Calendar now = Calendar.getInstance();
//上次访问时间
Calendar last = Calendar.getInstance();
last.setTime(lastVisitTime);
last.add(Calendar.HOUR_OF_DAY, 1);
if(last.before(now)){
return false;
}
return true;
}
public int updateClickNumber(int articleId) {
SqlSession session = MyBatisUtil.getSession();
int clickNumber = 0;
try {
clickNumber = (Integer)session.selectOne(Article.class.getName()+".selectClickNumber", articleId);
clickNumber = clickNumber + 1;
Article a = new Article();
a.setId(articleId);
a.setClickNumber(clickNumber);
session.update(Article.class.getName()+".updateClickNumber", a);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
} finally{
session.close();
}
return clickNumber;
}
<!-- 更新文章的点击量 --> <select id="selectClickNumber" parameterType="int" resultType="int"> select clickNumber from t_article where id = #{id} </select> <update id="updateClickNumber" parameterType="Article"> update t_article set clickNumber = #{clickNumber} where id = #{id} </update>