优化Servlet
减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。
BaseServlet:
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("application/json;charset=utf-8");
String uri = req.getRequestURI();
// System.out.println("请求uri:"+uri);
String methodName = uri.substring(uri.lastIndexOf('/') + 1);
// System.out.println("方法名称:"+methodName);
Method method = null;
try {
method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public void writeResponse(Object data,HttpServletResponse response) throws IOException {
ObjectMapper mapper= new ObjectMapper();
String json ="";
try {
json = mapper.writeValueAsString(data);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
response.getWriter().write(json);
}
}
分类数据的展示:
功能分析:
CategoryServlet
@WebServlet("/category/*")
public class CategoryServlet extends BaseServlet {
CategoryService service = new CategoryServiceImpl();
public void findAll(HttpServletRequest request,HttpServletResponse response) throws IOException {
List<Category> list= service.findAll();
ResponseInfo responseInfo = new ResponseInfo();
if(list==null ||list.size()==0){
responseInfo.setFlag(false);
responseInfo.setErrorMsg("分类查询失败!");
}else {
responseInfo.setFlag(true);
responseInfo.setData(list);
}
writeResponse(responseInfo,response);
}
}
CategoryService
public class CategoryServiceImpl implements CategoryService {
CategoryDao dao = new CategoryDaoImlp();
@Override
public List<Category> findAll() {
Jedis jedis = JedisUtil.getJedis();
Set<Tuple> categorys = jedis.zrangeWithScores("category", 0, -1);
List<Category> cs = null;
if (categorys == null || categorys.size() == 0) {
System.out.println("from database......");
cs = dao.findAll();
for (int i = 0; i < cs.size(); i++) {
jedis.zadd("category", cs.get(i).getCid(), cs.get(i).getCname());
}
}else {
System.out.println("from redis......");
cs = new ArrayList<Category>();
for (Tuple t : categorys) {
Category category = new Category();
category.setCname(t.getElement());
category.setCid((int) t.getScore());
cs.add(category);
}
}
return cs;
}
}
CategoryDao
JdbcTemplate jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource());
@Override
public List<Category> findAll() {
List<Category> list = null;
try{
list = jdbcTemplate.query("select * from tab_category order by cid asc",new BeanPropertyRowMapper<Category>(Category.class));
}catch (Exception e){
}
return list;
}
$.get("category/findAll",{},function(data) {
var cid = getParameter("cid");
var lis='<li ><a href="index.html">首页</a></li>';
for(var i=0;i<data.data.length;i++){
if (cid==data.data[i].cid){
lis+='<li class="nav-active"></li>';
}else {
lis+='<li ></li>';
}
lis+='<li><a href="route_list.html?cid='+data.data[i].cid+'">'+data.data[i].cname+'</a></li>';
}
lis+='<li><a href="favoriterank.html">收藏排行榜</a></li>';
$("#nav").html(lis);
},"json");
根据id查询不同类别的旅游线路
$(function() {
var cid =getParameter("cid");
//获取rname的参数值
var rname = getParameter("rname");
if(rname){
//url解码
rname = window.decodeURIComponent(rname);
}
var currentPage = getParameter("currentPage");
if(currentPage){
load(cid,currentPage,rname);
}else {
load(cid,1,rname);
}
// load(cid,1);
});
function load(cid,currentPage,rname) {
$.get("route/listPage",{cid:cid,currentPage:currentPage,rname:rname},function (data) {
$("#totalPage").html(data.data.totalPage);
$("#totalCount").html(data.data.totalSize);
var pages='<li οnclick="javascipt:load('+cid+','+1+',\''+rname+'\')"><a href="javascript:void(0)">首页</a></li>\n' + '<li οnclick="javascipt:load('+cid+','+(data.data.currentPage-1)+',\''+rname+'\')" class="threeword"><a href="javascript:void(0)">上一页</a></li>';
var begin;
var end;
if(data.data.totalPage < 10){
//总页码不够10页
begin = 1;
end = data.data.totalPage;
} else {
begin = data.data.currentPage - 5 ;
end = data.data.currentPage + 4 ;
if (begin<1){
begin=1;
end=10;
}
if (end>data.data.totalPage){
end=data.data.totalPage;
begin=end-9;
}
}
for (var i=begin;i<=end;i++){
if(data.data.currentPage == i){
li = '<li class="curPage" οnclick="javascipt:load('+cid+','+i+',\''+rname+'\')"><a href="javascript:void(0)">'+i+'</a></li>';
}else{
//创建页码的li
li = '<li οnclick="javascipt:load('+cid+','+i+',\''+rname+'\')"><a href="javascript:void(0)">'+i+'</a></li>';
}
pages+=li;
}
pages+=' <li οnclick="load('+cid+','+(data.data.currentPage+1)+',\''+rname+'\')" class="threeword"><a href="javascript:void(0);">下一页</a></li>\n' +
' <li οnclick="load('+cid+','+data.data.totalPage+',\''+rname+'\')" class="threeword"><a href="javascript:void(0);">末页</a></li>';
$("#page").html(pages);
var lis ='';
for (var i=0;i<data.data.list.length;i++){
lis+='<li>\n' +
' <div class="img"><img width="299" height="169" src="'+data.data.list[i].rimage+'" alt=""></div>\n' +
' <div class="text1">\n' +
' <p>'+data.data.list[i].rname+'</p>\n' +
' <br/>\n' +
' <p>'+data.data.list[i].routeIntroduce+'</p>\n' +
' </div>\n' +
' <div class="price">\n' +
' <p class="price_num">\n' +
' <span>¥</span>\n' +
' <span>'+data.data.list[i].price+'</span>\n' +
' <span>起</span>\n' +
' </p>\n' +
' <p><a href="route_detail.html?rid='+data.data.list[i].rid+'¤tPage='+data.data.currentPage+'">查看详情</a></p>\n' +
' </div>\n' +
' </li>';
}
$("#list").html(lis);
window.scrollTo(0,0);
},"json");
}
PageBean对象
public class PageBean<T> implements Serializable {
private int totalSize;//总条数 查询数据库
private int pageSize;//每页显示的条数 页面传递,固定
private int totalPage;//总页数 计算 totalSize/pageSize
private int currentPage;//当前页码 页面传递
private List<T> list;// 查询数据库 limit
}
RouteServlet
public void listPage(HttpServletRequest request,HttpServletResponse response) throws IOException {
String cid_ = request.getParameter("cid");
String currentPage_ = request.getParameter("currentPage");
String rname_ = request.getParameter("rname");
Integer cid;
Integer currentPage;
String rname="";
if(StringUtils.isEmpty(rname_)||rname_.equals("null")){
}else {
byte[] bytes = rname_.getBytes("iso-8859-1");
rname=new String(bytes,"utf-8");
}
if(StringUtils.isEmpty(cid_)||cid_.equals("null")){
cid= 4;
}else {
cid = Integer.parseInt(cid_);
}
if(StringUtils.isEmpty(currentPage_)||currentPage_.equals("null")||Integer.parseInt(currentPage_)==0){
currentPage= 1;
}else {
currentPage = Integer.parseInt(currentPage_);
}
PageBean<Route> pb = service.findBycid(cid,currentPage,rname);
ResponseInfo info = new ResponseInfo();
if (pb.getList()==null||pb.getList().size()==0){
info.setFlag(false);
info.setErrorMsg("线路查询失败");
}else {
info.setFlag(true);
info.setData(pb);
}
writeResponse(info,response);
}
RouteService:
@Override
public PageBean<Route> findBycid(Integer cid, Integer currentPage,String rname) {
PageBean<Route> pb = new PageBean<>();
pb.setCurrentPage(currentPage);
Integer totalCount = routeDao.findCountBycid(cid,rname);
List<Route> list = routeDao.findPageBycid(cid,currentPage,rname,10);
pb.setList(list);
pb.setPageSize(10);
pb.setTotalPage(totalCount%10 == 0?totalCount/10:totalCount/10+1);
pb.setTotalSize(totalCount);
return pb;
}
RouteDao:
@Override
public Integer findCountBycid(Integer cid,String rname) {
Integer count = jdbcTemplate.queryForObject("select count(1) from tab_route where cid = ? and rname like ?", Integer.class, cid,"%"+rname+"%");
return count;
}
@Override
public List<Route> findPageBycid(Integer cid, Integer currentPage, String rname,int pagesize) {
List<Route> list = jdbcTemplate.query("select * from tab_route where cid = ? and rname like ? limit ? , ? ", new BeanPropertyRowMapper<Route>(Route.class), cid,"%"+rname+"%" ,(currentPage - 1) * pagesize, pagesize);
return list;
}