JavaWeb26.2【综合案例:分类数据展示】

效果

 

 

 

分析

 

 

 

 

代码

 

复制代码
 1 package cn.haifei.travel.dao;
 2 
 3 import cn.haifei.travel.domain.Category;
 4 
 5 import java.util.List;
 6 
 7 public interface CategoryDao {
 8 
 9     /**
10      * 查询所有类别
11      * @return
12      */
13     public List<Category> findAll();
14 
15 
16 }
复制代码
复制代码
 1 package cn.haifei.travel.dao.impl;
 2 
 3 import cn.haifei.travel.dao.CategoryDao;
 4 import cn.haifei.travel.domain.Category;
 5 import cn.haifei.travel.util.JDBCUtils;
 6 import org.springframework.dao.DataAccessException;
 7 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 8 import org.springframework.jdbc.core.JdbcTemplate;
 9 
10 import java.util.List;
11 
12 public class CategoryDaoImpl implements CategoryDao {
13 
14     private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
15 
16     @Override
17     public List<Category> findAll() {
18         List<Category> categories = null;
19         try {
20             String sql = "select * from tab_category";
21             categories = template.query(sql, new BeanPropertyRowMapper<>(Category.class));
22         } catch (DataAccessException e) {
23             e.printStackTrace();
24         }
25         return categories;
26     }
27 
28 }
复制代码
复制代码
 1 package cn.haifei.travel.service;
 2 
 3 import cn.haifei.travel.domain.Category;
 4 
 5 import java.util.List;
 6 
 7 public interface CategoryService {
 8 
 9     /**
10      * 查询所有类别
11      * @return
12      */
13     public List<Category> findAll();
14 
15 }
复制代码
复制代码
 1 package cn.haifei.travel.service.impl;
 2 
 3 import cn.haifei.travel.dao.CategoryDao;
 4 import cn.haifei.travel.dao.impl.CategoryDaoImpl;
 5 import cn.haifei.travel.domain.Category;
 6 import cn.haifei.travel.service.CategoryService;
 7 
 8 import java.util.List;
 9 
10 public class CategoryServiceImpl implements CategoryService {
11 
12     CategoryDao categoryDao = new CategoryDaoImpl();
13 
14     @Override
15     public List<Category> findAll() {
16         return categoryDao.findAll();
17     }
18 }
复制代码
复制代码
 1 package cn.haifei.travel.web.servlet;
 2 
 3 import cn.haifei.travel.domain.Category;
 4 import cn.haifei.travel.service.CategoryService;
 5 import cn.haifei.travel.service.impl.CategoryServiceImpl;
 6 import com.fasterxml.jackson.databind.ObjectMapper;
 7 
 8 import javax.servlet.ServletException;
 9 import javax.servlet.annotation.WebServlet;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 import java.io.IOException;
14 import java.util.List;
15 
16 @WebServlet("/category/*")
17 public class CategoryServlet extends BaseServlet {
18 
19     private CategoryService service = new CategoryServiceImpl();
20 
21     /**
22      * 查询所有
23      * @param request
24      * @param response
25      * @throws ServletException
26      * @throws IOException
27      */
28     protected void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
29         //1 调用service查询
30         List<Category> categories = service.findAll();
31 
32         //2 序列化为json并返回
33         /*ObjectMapper mapper = new ObjectMapper();
34         response.setContentType("application/json;charset=utf-8");
35         mapper.writeValue(response.getOutputStream(), categories);*/
36 
37         //在BaseServlet中新封装两个成员方法用于将对象序列化为json(返回给调用者/写回到客户端)
38         writeValue(categories, response); //写回到客户端
39     }
40 
41 }
复制代码
复制代码
 1 package cn.haifei.travel.web.servlet;
 2 
 3 import com.fasterxml.jackson.core.JsonProcessingException;
 4 import com.fasterxml.jackson.databind.ObjectMapper;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.annotation.WebServlet;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.IOException;
12 import java.lang.reflect.InvocationTargetException;
13 import java.lang.reflect.Method;
14 
15 /**
16  * 方法分发
17  */
18 public class BaseServlet extends HttpServlet {
19 
20     @Override
21     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
22 
23         //1 获取请求路径
24         String uri = req.getRequestURI();
25 
26         //2 获取方法名称
27         String methodName = uri.substring(uri.lastIndexOf('/') + 1); //+1:截取含头不含尾
28         
29         try { 
30             //3 利用反射获取方法对象Method
31             Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
32              //4 执行方法
33             method.invoke(this, req, resp);
34         } catch (NoSuchMethodException e) {
35             e.printStackTrace();
36         } catch (IllegalAccessException e) {
37             e.printStackTrace();
38         } catch (InvocationTargetException e) {
39             e.printStackTrace();
40         }
41     }
42 
43 
44     /**
45      * 直接将传入的对象序列化为json,并且写回客户端
46      * @param obj
47      */
48     public void writeValue(Object obj, HttpServletResponse response) throws IOException {
49         ObjectMapper mapper = new ObjectMapper();
50         response.setContentType("application/json;charset=utf-8");
51         mapper.writeValue(response.getOutputStream(),obj);
52     }
53 
54     /**
55      * 将传入的对象序列化为json,并且返回给调用者
56      * @param obj
57      * @return
58      */
59     public String writeValueAsString(Object obj) throws JsonProcessingException {
60         ObjectMapper mapper = new ObjectMapper();
61         return mapper.writeValueAsString(obj);
62     }
63 
64 
65 }
66         
复制代码

 UserServlet优化改写

复制代码
  1 package cn.haifei.travel.web.servlet;
  2 
  3 import cn.haifei.travel.domain.ResultInfo;
  4 import cn.haifei.travel.domain.User;
  5 import cn.haifei.travel.service.UserService;
  6 import cn.haifei.travel.service.impl.UserServiceImpl;
  7 import com.fasterxml.jackson.databind.ObjectMapper;
  8 import org.apache.commons.beanutils.BeanUtils;
  9 
 10 import javax.servlet.ServletException;
 11 import javax.servlet.annotation.WebServlet;
 12 import javax.servlet.http.HttpServlet;
 13 import javax.servlet.http.HttpServletRequest;
 14 import javax.servlet.http.HttpServletResponse;
 15 import javax.servlet.http.HttpSession;
 16 import java.io.IOException;
 17 import java.lang.reflect.InvocationTargetException;
 18 import java.util.Map;
 19 
 20 @WebServlet("/user/*")
 21 public class UserServlet extends BaseServlet {
 22 
 23     //声明UserService业务对象(抽取公共)
 24     private UserService service = new UserServiceImpl();
 25 
 26     /**
 27      * RegistUserServlet
 28      * @param request
 29      * @param response
 30      * @throws ServletException
 31      * @throws IOException
 32      */
 33     public void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 34         //验证校验码
 35         String checkcode_userinput = request.getParameter("check"); //用户提交的验证码
 36         HttpSession session = request.getSession();
 37         String checkcode_server = (String)session.getAttribute("CHECKCODE_SERVER");//服务器产生的验证码
 38         session.removeAttribute("CHECKCODE_SERVER"); //保证后台产生得验证码一次性使用
 39         if (checkcode_server==null || !checkcode_server.equalsIgnoreCase(checkcode_userinput)){
 40             //用户输入验证码错误
 41             ResultInfo info = new ResultInfo();
 42             info.setFlag(false);
 43             info.setErrorMsg("验证码错误!");
 44 
 45             /*ObjectMapper mapper = new ObjectMapper();
 46             String json = mapper.writeValueAsString(info);*/
 47             String json = writeValueAsString(info);
 48 
 49             response.setContentType("application/json;charset=utf-8");
 50             //因为json结果是字符串,所以此处用字节流或者字符流都行
 51             //response.getOutputStream().write(json.getBytes()); //字节流
 52             response.getWriter().write(json); //字符流
 53 
 54             return;
 55         }//用户输入验证码正确执行以下
 56 
 57 
 58         //1 获取数据
 59         Map<String, String[]> map = request.getParameterMap();
 60 
 61         //2 封装对象
 62         User user = new User();
 63         try {
 64             BeanUtils.populate(user, map);
 65         } catch (IllegalAccessException e) {
 66             e.printStackTrace();
 67         } catch (InvocationTargetException e) {
 68             e.printStackTrace();
 69         }
 70 
 71         //3 调用service完成注册
 72 //        UserService service = new UserServiceImpl();
 73         boolean flag = service.regist(user);
 74 
 75         //4 响应结果
 76         ResultInfo info = new ResultInfo();
 77         if (flag){
 78             //注册成功
 79             info.setFlag(true);
 80         }else {
 81             //注册失败
 82             info.setFlag(false);
 83             info.setErrorMsg("注册失败!");
 84         }
 85 
 86         //5 将对象info序列化为json
 87         /*ObjectMapper mapper = new ObjectMapper(); //利用jackson
 88         String json = mapper.writeValueAsString(info);*/
 89         String json = writeValueAsString(info);
 90 
 91         //6 将json结果写回到客户端
 92         response.setContentType("application/json;charset=utf-8");
 93         response.getWriter().write(json);
 94     }
 95 
 96 
 97     /**
 98      * LoginServlet
 99      * @param request
100      * @param response
101      * @throws ServletException
102      * @throws IOException
103      */
104     public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
105         //验证校验码
106         String checkcode_userinput = request.getParameter("check"); //用户提交的验证码
107         HttpSession session = request.getSession();
108         String checkcode_server = (String)session.getAttribute("CHECKCODE_SERVER");//服务器产生的验证码
109         session.removeAttribute("CHECKCODE_SERVER"); //保证后台产生得验证码一次性使用
110         if (checkcode_server==null || !checkcode_server.equalsIgnoreCase(checkcode_userinput)){
111             //用户输入验证码错误
112             ResultInfo info = new ResultInfo();
113             info.setFlag(false);
114             info.setErrorMsg("验证码错误!");
115             /*ObjectMapper mapper = new ObjectMapper();
116             String json = mapper.writeValueAsString(info);*/
117             String json = writeValueAsString(info);
118             response.setContentType("application/json;charset=utf-8");
119             response.getWriter().write(json);
120             return;
121         }//用户输入验证码正确执行以下
122 
123 
124         //1 获取用户名和密码
125         Map<String, String[]> map = request.getParameterMap();
126 
127         //2 利用BeanUtils工具类封装User对象(此处仅含用户名和密码两个值)
128         User user = new User();
129         try {
130             BeanUtils.populate(user, map);
131         } catch (IllegalAccessException e) {
132             e.printStackTrace();
133         } catch (InvocationTargetException e) {
134             e.printStackTrace();
135         }
136 
137         //3 调用service查询
138 //        UserService service = new UserServiceImpl();
139         User u = service.login(user);
140 
141         ResultInfo info = new ResultInfo();
142         //4 判断用户是否为null
143         if (u == null){
144             info.setFlag(false);
145             info.setErrorMsg("用户名或密码错误");
146         }
147         //5 判断用户是否已激活账号
148         if (u!=null && !"Y".equals(u.getStatus())){
149             info.setFlag(false);
150             info.setErrorMsg("您的账号尚未激活,请查收邮件进行激活");
151         }
152         //6 判断是否登录成功
153         if (u!=null && "Y".equals(u.getStatus())){
154             info.setFlag(true);
155             request.getSession().setAttribute("user", u); //登录成功标记
156         }
157 
158         //7 响应数据
159         /*ObjectMapper mapper = new ObjectMapper(); //jackson
160         response.setContentType("application/json;charset=utf-8");
161         mapper.writeValue(response.getOutputStream(), info); //字节流*/
162         writeValue(info, response);
163     }
164 
165 
166     /**
167      * FindUserServlet
168      * @param request
169      * @param response
170      * @throws ServletException
171      * @throws IOException
172      */
173     public void findOne(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
174         //从session中获取登录用户
175         Object user = request.getSession().getAttribute("user");
176         //将user写回客户端
177         /*ObjectMapper mapper = new ObjectMapper();
178         response.setContentType("application/json;charset=utf-8");
179         mapper.writeValue(response.getOutputStream(), user);*/
180         writeValue(user, response);
181     }
182 
183 
184     /**
185      * ExitServlet
186      * @param request
187      * @param response
188      * @throws ServletException
189      * @throws IOException
190      */
191     public void exit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
192         //1.销毁session
193         request.getSession().invalidate();
194         //2.跳转登录页面
195         response.sendRedirect(request.getContextPath()+"/login.html"); //response-redirect重定向时要加虚拟目录
196     }
197 
198 
199     /**
200      * ActiveUserServlet
201      * @param request
202      * @param response
203      * @throws ServletException
204      * @throws IOException
205      */
206     public void avtive(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
207         //获取激活码
208         String code = request.getParameter("code");
209         if (code != null){
210             //调用service完成激活
211 //            UserService service = new UserServiceImpl();
212             boolean flag = service.active(code);
213 
214             //判断标记
215             String msg = null;
216             if (flag){
217                 msg = "激活成功,请<a href='login.html'>登录</a>";
218             }else {
219                 msg = "激活失败,请联系管理员";
220             }
221 
222             response.setContentType("text/html;charset=utf-8");
223             response.getWriter().write(msg);
224         }
225     }
226 
227 
228 }
View Code
复制代码

 header.html

复制代码
  1 <!-- 头部 start -->
  2 <script>
  3     $(function () {
  4 
  5         //请求登录用户信息
  6         $.get(
  7             // "findUserServlet",
  8             "user/findOne",
  9             {},
 10             function (data) {
 11                 var msg = "欢迎回来," + data.name;
 12                 $("#span_username").html(msg);
 13             },
 14             "json"
 15         );
 16 
 17         //请求分类数据
 18         $.get(
 19             "category/findAll",
 20             {},
 21             function (data) { //data: [{cid:1,cname:国内游},{},{},...]
 22                 //初始化<li>字符串(第一个是首页,固定的)
 23                 var lis = '<li class="nav-active"><a href="index.html">首页</a></li>';
 24 
 25                 //遍历数组,拼接<li>字符串
 26                 for (var i=0; i<data.length; i++){
 27                     var li = '<li><a href="route_list.html">' + data[i].cname + '</a></li>';
 28                     lis += li;
 29                 }
 30 
 31                 //拼接收藏排行榜的<li>(最后一个也是固定的)
 32                 lis += '<li><a href="favoriterank.html">收藏排行榜</a></li>';
 33 
 34                 //将lis字符串,设置到ul的html内容中
 35                 $("#category").html(lis);
 36             },
 37             "json"
 38         );
 39 
 40     });
 41 </script>
 42 
 43 
 44     <header id="header">
 45         <div class="top_banner">
 46             <img src="images/top_banner.jpg" alt="">
 47         </div>
 48         <div class="shortcut">
 49             <!-- 未登录状态  -->
 50             <div class="login_out">
 51                 <a href="login.html">登录</a>
 52                 <a href="register.html">注册</a>
 53             </div>
 54             <!-- 登录状态  -->
 55             <div class="login">
 56                 <!--<span>欢迎回来,admin</span>-->
 57                 <span id="span_username"></span>
 58                 <a href="myfavorite.html" class="collection">我的收藏</a>
 59                 <!--<a href="javascript:location.href='exitServlet';">退出</a>-->
 60                 <a href="javascript:location.href='user/exit';">退出</a>
 61             </div>
 62         </div>
 63         <div class="header_wrap">
 64             <div class="topbar">
 65                 <div class="logo">
 66                     <a href="/"><img src="images/logo.jpg" alt=""></a>
 67                 </div>
 68                 <div class="search">
 69                     <input name="" type="text" placeholder="请输入路线名称" class="search_input" autocomplete="off">
 70                     <a href="javascript:;" class="search-button">搜索</a>
 71                 </div>
 72                 <div class="hottel">
 73                     <div class="hot_pic">
 74                         <img src="images/hot_tel.jpg" alt="">
 75                     </div>
 76                     <div class="hot_tel">
 77                         <p class="hot_time">客服热线(9:00-6:00)</p>
 78                         <p class="hot_num">400-618-9090</p>
 79                     </div>
 80                 </div>
 81             </div>
 82         </div>
 83     </header>
 84     <!-- 头部 end -->
 85      <!-- 首页导航 -->
 86     <div class="navitem">
 87         <ul class="nav" id="category">
 88             <!--<li class="nav-active"><a href="index.html">首页</a></li>
 89             <li><a href="route_list.html">门票</a></li>
 90             <li><a href="route_list.html">酒店</a></li>
 91             <li><a href="route_list.html">香港车票</a></li>
 92             <li><a href="route_list.html">出境游</a></li>
 93             <li><a href="route_list.html">国内游</a></li>
 94             <li><a href="route_list.html">港澳游</a></li>
 95             <li><a href="route_list.html">抱团定制</a></li>
 96             <li><a href="route_list.html">全球自由行</a></li>
 97             <li><a href="favoriterank.html">收藏排行榜</a></li>-->
 98         </ul>
 99     </div>
100     
复制代码

 

复制代码
 1 package cn.haifei.travel.service.impl;
 2 
 3 import cn.haifei.travel.dao.CategoryDao;
 4 import cn.haifei.travel.dao.impl.CategoryDaoImpl;
 5 import cn.haifei.travel.domain.Category;
 6 import cn.haifei.travel.service.CategoryService;
 7 import cn.haifei.travel.util.JedisUtil;
 8 import redis.clients.jedis.Jedis;
 9 
10 import java.util.ArrayList;
11 import java.util.List;
12 import java.util.Set;
13 
14 public class CategoryServiceImpl implements CategoryService {
15 
16     CategoryDao categoryDao = new CategoryDaoImpl();
17 
18     //注意,该方法改写后,访问项目前,须手动将redis服务器打开
19     @Override
20     public List<Category> findAll() {
21         //1 从redis中查询
22         //1.1 获取jedis客户端
23         Jedis jedis = JedisUtil.getJedis();
24         //1.2 期望数据中存储的顺序就是将来展示的顺序,使用redis的sortedset
25         Set<String> categorys = jedis.zrange("category", 0, -1);
26 
27         //2 判断查询结果集合是否为空
28         List<Category> cs = null;
29         if (categorys==null || categorys.size()==0){
30             System.out.println("从mysql数据库中查询");
31 
32             //3 若为空,则需要从数据库查询,并将结果数据存入redis
33             //3.1 从数据库查询
34             cs = categoryDao.findAll();
35             //3.2 将集合数据存储到redis中的 category的key
36             for (int i=0; i<cs.size(); i++){
37                 jedis.zadd("category", cs.get(i).getCid(), cs.get(i).getCname()); //键名,分数,键值
38             }
39         }else {
40             System.out.println("从redis缓存中查询");
41 
42             //4 若不为空,直接返回redis缓存结果
43             //因为查询出来的是set集合,而返回结果为list集合,故将set数据存入list(转换)
44             cs = new ArrayList<>();
45             for (String name : categorys) {
46                 Category category = new Category();
47                 category.setCname(name);
48                 cs.add(category);
49             }
50         }
51 
52 //        return categoryDao.findAll();
53         return cs;
54     }
55 }
复制代码

启动项目后,首次访问主页&再次访问

 

 

 

posted @   yub4by  阅读(153)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示