效果图
点赞和反对所需的redis方法
package cn.itcast.biz;
import java.util.Set;
import org.apache.catalina.connector.Request;
import redis.clients.jedis.Jedis;
public class ZanBiz {
Jedis js = new Jedis("127.0.0.1",6379);//登录redis
/**
* 点赞功能
* @param topicid 主题id
* @param uid 用户id
* @param flag true就添加进去 false就删除
*/
public void dianZan(String topicid,String uid,boolean flag){
if(flag){//点赞加入
js.set(topicid+":"+uid, "1");
}else{//去赞删除
js.del(topicid+":"+uid);
}
}
/**
* 获取特定主题的点赞总数
* @param topicid
* @return
*/
public long getCount(String topicid){
Set<String> set = js.keys(topicid+":*");
return set.size();
}
/**
* 反对功能
* @param topicid
* @param uid
* @param flag true就添加进去 false就删除
*/
public void dianZanx(String topicid,String uid,boolean flag){
if(flag){//反对加入
js.set(topicid+"|"+uid, "1");
}else{//反对删除
js.del(topicid+"|"+uid);
}
}
/**
* 获取特定主题的反对总数
* @param topicid
* @return
*/
public long getCountx(String topicid){
Set<String> set = js.keys(topicid+"|*");
return set.size();
}
/**
* 判断登陆顾客是否在特定主题上点赞[detail.jsp]
* @param topicid
* @param uid
* @return
*/
public int judge(Object topicid,Integer uid){
Set<String> set = js.keys(""+topicid+":"+uid);
return set.size();
}
/**
* 判断登陆顾客是否在特定主题上反对数[detail.jsp]
* @param topicid
* @param uid
* @return
*/
public int judgex(Object topicid,Integer uid){
Set<String> set = js.keys(""+topicid+"|"+uid);
return set.size();
}
}
Servlet与jsp的操作
Servlet操作
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.bean.UserBean;
import cn.itcast.biz.ZanBiz;
@WebServlet("/zan.s")
public class ZanServlet extends BasicServlet {
ZanBiz zbiz = new ZanBiz();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String op = request.getParameter("op");
if("love".equals(op)){
doZan(request, response);
}else if("dislove".equals(op)){
doFan(request, response);
}
}
/**
* 从ajax接收数据并返回该登录用户是否反对 1表示反对 0表示不反对
* @param request
* @param response
*/
private void doFan(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
String topicid = request.getParameter("topicid");//获取主题id
String flag = request.getParameter("flag");//判断是否反对
UserBean user = (UserBean) request.getSession().getAttribute("logineduser");//获取当前登录用户的实例
if(user != null){//说明用户已登录
zbiz.dianZanx(topicid, ""+user.getUid(), "true".equals(flag));//反对则将其加入到redis数据库中 未反对则将其从数据库中删除
try {
send(response, "1");//返回给jsp "1"
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{//说明用户未登录
try {
send(response, "0");//返回给jsp "0"
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 从ajax接收数据并返回该登录用户是否点赞 1表示点赞 0表示不点赞
* @param request
* @param response
*/
public void doZan(HttpServletRequest request, HttpServletResponse response) {
String topicid = request.getParameter("topicid");//获取主题id
String flag = request.getParameter("flag");//判断是否点赞
UserBean user = (UserBean) request.getSession().getAttribute("logineduser");//获取当前登录用户的实例
if(user != null){//说明用户已登录
zbiz.dianZan(topicid, ""+user.getUid(), "true".equals(flag));//点赞则将其加入到redis数据库中 未点赞则将其从数据库中删除
try {
send(response, "1");//返回给jsp "1"
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{//说明用户未登录
try {
send(response, "0");//返回给jsp "0"
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
jsp中与点赞和反对相关的代码
<script type="text/javascript">
/**
* 实现点赞功能
*/
function change(img,topicid,y){
var flag = (img.src.indexOf('image/zan_no.jpg')>0);//判断当前图标 若为未点赞则为true 否则false
var span = document.getElementById("love"+y);//获取控制点赞数目的span标签并用变量名span表示
/*
*/
/*
jQuery调用ajax请求
*/
var c = "\"1\"";
$.post(
"zan.s",
{
"op": "love",
"topicid" : topicid,//传给Servlet的主题id
"flag" : flag//传给Servlet的图标 若为未点赞则为true 否则false
},function(data){
if(data == c){//若点击图标则会改变图标 (点赞图标点击之后变成未点赞 未点赞图标点击之后变成点赞)
if(flag){
img.src = 'image/zan_on.jpg';//改图标为点赞
span.innerHTML = parseInt(span.innerHTML)+1;//利用js实现动态点赞数目
}else{
img.src = 'image/zan_no.jpg';//改图标为未点赞
span.innerHTML = parseInt(span.innerHTML)-1;//利用js实现动态点赞数目
}
}else{
alert('请先登录系统');//未登录用户会提示
}
});
}
/**
* 实现反对功能
*/
function changex(img,topicid,y){
var flag = (img.src.indexOf('image/fan_no.jpg')>0);//判断当前图标 若为未反对则为true 否则false
console.log(y);
var span = document.getElementById("dislove"+y);//获取控制反对数目的span标签并用变量名span表示
/*
*/
/*
jQuery调用ajax请求
*/
var c = "\"1\"";
$.post(
"zan.s",
{
"op": "dislove",
"topicid" : topicid,//传给Servlet的主题id
"flag" : flag //传给Servlet的图标 若为未反对则为true 否则false
},function(data){
if(data == c){
if(flag){
img.src = 'image/fan_on.jpg';//改图标为反对
span.innerHTML = parseInt(span.innerHTML)+1;//利用js实现动态点赞数目
}else{
img.src = 'image/fan_no.jpg';//改图标为未反对
span.innerHTML = parseInt(span.innerHTML)-1;//利用js实现动态点赞数目
}
}else{
alert('请先登录系统');//未登录用户会提示
}
});
}
</script>
<%
int y = 0;
for(Map<String, Object> map:list){
String name = (String)map.get("uname");
int num = zbiz.judge( map.get("topicid") , user.getUid());//判断当前登录用户是否之前有点赞
int num1 = zbiz.judgex( map.get("topicid") , user.getUid());//判断当前登录用户是否之前有反对
y++;
%>
<DIV class="t">
<TABLE style="BORDER-TOP-WIDTH: 0px; TABLE-LAYOUT: fixed" cellSpacing="0" cellPadding="0" width="100%">
点赞数:<span id="love<%=y%>"><%= (map.get("zan") != null) ? map.get("zan") : "0" %></span><!-- 获取的点赞总数 -->
<img alt="" src="<%=(num == 0) ?"image/zan_no.jpg":"image/zan_on.jpg" %>"><!-- 之前点过显示点赞图标 否则显示未点赞图标 -->
onclick="change(this,<%=map.get("topicid") %>,<%=y%>)" height="20px">
反对数:<span id="dislove<%=y%>"><%= (map.get("fan") != null) ? map.get("fan") : "0" %></span><!-- 之前点过显示反对图标 否则显示未反对图标 --><!-- 获取的反对总数 -->
<img alt="" src="<%=(num1 == 0) ?"image/fan_no.jpg":"image/fan_on.jpg" %>"<!-- 之前点过显示反对图标 否则显示未反对图标 -->
onclick="changex(this,<%=map.get("topicid") %>,<%=y%>)" height="20px"><br/>
</TR>
</TABLE>
</DIV>
<%
}
%>
在jsp中需要显示的点赞或者反对的总数有关的代码
/**
* 查询主贴和跟帖(detail.jsp)
* @param tid
* @return
*/
public List<Map<String,Object>> selectTopicAndReplay(Integer tid,Integer page,Integer rows){
if(page == null){
page = 1;
}
if(rows == null){
rows = 10;
}
List<Map<String,Object>> list = rdao.selectTopicAndReplay(tid,page,rows);
long count = 0;
for(int i = 0;i<list.size();i++){
count = zbiz.getCount(""+list.get(i).get("topicid"));//在你进入界面时显示相应的点赞总数所需
list.get(i).put("zan", count);
count = zbiz.getCountx(""+list.get(i).get("topicid"));//在你进入界面时显示相应的反对总数所需
list.get(i).put("fan", count);
}
return list;
}