目录
一、效果
二、分析
三、前端实现
修改header.html
<script>
$(function () {
$.post("user/findUser",{},function (data) {
if (data.name!="undefined" && data.name!=null){
var msg = "欢迎回来,"+data.name;
$("#span_username").html(msg);
$(".login").css("display","block");
}else{
$(".login").css("display","none");
}
});
//通过ajax获取分类数据
$.get("category/findAll",{},function (data) {
var lis = '<li class="nav-active"><a href="index.html">首页</a></li>';
//数据遍历
for(var i=0;i<data.length;i++){
var li = '<li><a href="route_list.html?cid='+data[i].cid+'">'+data[i].cname+'</a></li>';
lis +=li;
}
lis+='<li><a href="favoriterank.html">收藏排行榜</a></li>';
//往ul标签下插入html代码块
$("#category").html(lis);
});
});
</script>
<!-- 头部 start -->
<header id="header">
<div class="top_banner">
<img src="images/top_banner.jpg" alt="">
</div>
<div class="shortcut">
<!-- 未登录状态 -->
<div class="login_out">
<a href="login.html">登录</a>
<a href="register.html">注册</a>
</div>
<!-- 登录状态 -->
<div class="login" style="display:none;">
<span id="span_username">欢迎回来,admin</span>
<a href="myfavorite.html" class="collection">我的收藏</a>
<a href="javascript:location.href='user/exit';">退出</a>
</div>
</div>
<div class="header_wrap">
<div class="topbar">
<div class="logo">
<a href="/"><img src="images/logo.jpg" alt=""></a>
</div>
<div class="search">
<input name="" type="text" placeholder="请输入路线名称" class="search_input" autocomplete="off">
<a href="javascript:;" class="search-button">搜索</a>
</div>
<div class="hottel">
<div class="hot_pic">
<img src="images/hot_tel.jpg" alt="">
</div>
<div class="hot_tel">
<p class="hot_time">客服热线(9:00-6:00)</p>
<p class="hot_num">400-618-9090</p>
</div>
</div>
</div>
</div>
</header>
<!-- 头部 end -->
<!-- 首页导航 -->
<div class="navitem">
<ul class="nav">
<li class="nav-active"><a href="index.html">首页</a></li>
<li><a href="route_list.html">门票</a></li>
<li><a href="route_list.html">酒店</a></li>
<li><a href="route_list.html">香港车票</a></li>
<li><a href="route_list.html">出境游</a></li>
<li><a href="route_list.html">国内游</a></li>
<li><a href="route_list.html">港澳游</a></li>
<li><a href="route_list.html">抱团定制</a></li>
<li><a href="route_list.html">全球自由行</a></li>
<li><a href="favoriterank.html">收藏排行榜</a></li>
</ul>
</div>
四、后端实现
修改CategoryServlet
package com.hotdas.travel.web.servlet;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hotdas.travel.domain.Category;
import com.hotdas.travel.service.CategoryService;
import com.hotdas.travel.service.impl.CategoryServiceImpl;
import com.sun.xml.internal.rngom.parse.host.Base;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/category/*")
public class CategoryServlet extends BaseServlet {
private CategoryService categoryService = new CategoryServiceImpl();
/**
* 查询所有分类数据
*/
public void findAll(HttpServletRequest request, HttpServletResponse response) throws Exception {
List<Category> categoryList = categoryService.findAll();
//返回数据到页面
// ObjectMapper objectMapper = new ObjectMapper();
// response.setCharacterEncoding("utf-8");
// response.setContentType("application/json;charset=utf-8");
// objectMapper.writeValue(response.getOutputStream(),categoryList);
writeValue(categoryList,response);
}
}
修改CategoryService
package com.hotdas.travel.service;
import com.hotdas.travel.domain.Category;
import java.util.List;
public interface CategoryService {
List<Category> findAll();
}
categoryServiceImpl
package com.hotdas.travel.service.impl;
import com.hotdas.travel.dao.CategoryDao;
import com.hotdas.travel.dao.impl.CategoryDaoImpl;
import com.hotdas.travel.domain.Category;
import com.hotdas.travel.service.CategoryService;
import java.util.List;
public class CategoryServiceImpl implements CategoryService {
private CategoryDao categoryDao = new CategoryDaoImpl();
@Override
public List<Category> findAll() {
return categoryDao.findAll();
}
}
CategoryDao
package com.hotdas.travel.dao;
import com.hotdas.travel.domain.Category;
import java.util.List;
public interface CategoryDao {
List<Category> findAll();
}
CategoryDaoImpl
package com.hotdas.travel.dao.impl;
import com.hotdas.travel.dao.CategoryDao;
import com.hotdas.travel.domain.Category;
import com.hotdas.travel.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class CategoryDaoImpl implements CategoryDao {
private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<Category> findAll() {
String sql = "select * from tab_category";
List<Category> list =jdbcTemplate.query(sql,new BeanPropertyRowMapper<Category>(Category.class));
return list;
}
}
修改BaseServlet
package com.hotdas.travel.web.servlet;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("service 已经运行...");
//1.获取请求路径
String requestURI = request.getRequestURI();// /travel/user/add ...
//2.获取方法名
String methodName = requestURI.substring(requestURI.lastIndexOf("/") + 1);
System.out.println("methodName="+methodName);
//3.让调用的servlet执行它自已该方法
//谁调用谁是this
System.out.println(this);
try {
//获取调者的方法
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//暴力反射
//method.setAccessible(true);
//通过反射调用方法
method.invoke(this,request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
//封装对象转字符串输出到客户端
public void writeValue(Object obj,HttpServletResponse response) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
objectMapper.writeValue(response.getOutputStream(),obj);
}
}
五、测试
六、对分类数据进行优化
1. 为了减少数据库的压力,使用redis缓存分类数据
package com.hotdas.travel.service.impl;
import com.hotdas.travel.dao.CategoryDao;
import com.hotdas.travel.dao.impl.CategoryDaoImpl;
import com.hotdas.travel.domain.Category;
import com.hotdas.travel.service.CategoryService;
import com.hotdas.travel.util.JedisUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class CategoryServiceImpl implements CategoryService {
private CategoryDao categoryDao = new CategoryDaoImpl();
@Override
public List<Category> findAll() {
//1.连接redis
Jedis jedis = JedisUtil.getJedis();
List<Category> lists =null;
//redis中有一个得分实现排序功能
//zrangeWithScores有作用范围的,start从0条件记录开始读取,end是排序.
Set<Tuple> categorys = jedis.zrangeWithScores("category",0,-1);
List<Category> cs = null;
if (categorys==null || categorys.size()==0){
System.out.println("从数据库中读取....");
cs=categoryDao.findAll();
for(int i =0 ;i<cs.size();i++){
jedis.zadd("category",cs.get(i).getCid(),cs.get(i).getCname());
}
}else{
System.out.println("从redis中读取数据");
cs=new ArrayList<>();
for(Tuple t : categorys){
Category category = new Category();
category.setCid((int)t.getScore());
category.setCname(t.getElement());
cs.add(category);
}
}
return cs;
}
}
2.安装redis
windows下安装
下载安装包
解压安装包
输入redis-server.exe redis.windows.conf
命令。
验证输入ping,PONG连接成功
七、遇到bug
1.redis未连接,
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
at redis.clients.jedis.Connection.connect(Connection.java:154)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:83)
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1643)
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:85)
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:861)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
at redis.clients.util.Pool.getResource(Pool.java:48)
... 26 more
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at redis.clients.jedis.Connection.connect(Connection.java:148)
... 33 more
连接成功redis,问题就解决了