javaweb基础打卡29

BaseServlet抽取:优化Servlet

1.目的
	减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。
2.分析
	HttpServlet
		|
	BaseServlet 方法分发 service()
		|					|
	UserServlet			CategoryServlet
		register()			save()
		login()				findOne()
		...					...
3.代码实现
	1.BaseServlet
		public class BaseServlet extends HttpServlet {
   
			@Override
			protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
				//System.out.println("baseServlet的service方法被执行了...");

				//完成方法分发
				//1.获取请求路径
				String uri = req.getRequestURI();// /travel/user/add
				//System.out.println("请求uri:" + uri);// /travel/user/add
				//2.获取方法名称
				String methodName = uri.substring(uri.lastIndexOf('/') + 1);
				//System.out.println("方法名称:" + methodName);
				//3.获取方法对象Method
				//谁调用我?我代表谁
				//System.out.println(this);//UserServlet的对象
				try {
   
					//忽略访问权限修饰符,获取方法getDeclaredMethod
					//获取方法
					Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
					//4.执行方法
					//暴力反射
					//method.setAccessible(true);
					method.invoke(this,req,resp);
				} catch (NoSuchMethodException e) {
   
					e.printStackTrace();
				} catch (IllegalAccessException e) {
   
					e.printStackTrace();
				} catch (InvocationTargetException e) {
   
					e.printStackTrace();
				}
			}
		}
	2.UserServlet
		@WebServlet("/user/*")// /user/add /user/find
		public class UserServlet extends BaseServlet {
   
			public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
				System.out.println("UserServlet的add方法...");
			}

			public void find(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
				System.out.println("UserServlet的find方法...");
			}
		}
		
	3.CategoryServlet
		@WebServlet("/category/*")
		public class CategoryServlet extends BaseServlet {
   
			public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
				System.out.println("CategoryServlet的add方法...");
			}

			public void find(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
				System.out.println("CategoryServlet的find方法...");
			}
		}

黑马旅游综合案例续

10.分类数据展示	
	1.分析
		分类的数据在每一次页面加载后都会重新请求数据库来加载,对数据库的压力比较大,而且分类的数据不会经常产生变化,所有可以使用redis来缓存这个数据。
		1.index.html包含header.html
			1.发送ajax请求,访问服务器,加载真正的分类数据
			2.遍历数组,完成展示
		2.CategoryServlet
			findAll(){
   
				1.调用Service查询 List
				2.将List集合序列化为json返回
			}	
		3.CategoryService
			findAll(){
   
				1.从redis中查询
				2.判断集合是否为null
					- 是:
						第一次访问,查询数据库,将数据存入redis中
					- 否:
						不是第一次访问
				3.返回集合		
			}
		4.CategoryDao
			find All()
	2.代码实现
		1.header.html加载后,发送ajax请求,请求category/findAll
			<script>
				$(function (){
   
					//查询分类数据
					$.get("category/findAll",{
   },function (data){
   
						//[{
   cid:1,cname:国内游},{
   },{
   }]
						var lis = '<li class="nav-active"><a href="index.html">首页</a></li>';
						//遍历数组,拼接字符串(<li>)
						for (var i = 0; i < data.length; i++) {
   
							var li = '<li><a href="route_list.html">'+data[i].cname+'</a></li>';
							lis += li;
						}
						//拼接收藏排行榜的li
						lis += '<li><a href="favoriterank.html">收藏排行榜</a></li>';

						//将lis字符串,设置到ul的html内容中
						$("#category").html(lis);
					});
				});
			</script>
			<ul id="category" class="nav"></ul>
		2.在BaseServlet中封装了序列化json的方法
			//直接将传入的对象序列化为json,并且写回客户端
			public void writeValue(Object obj,HttpServletResponse response) throws IOException {
   
				ObjectMapper mapper = new ObjectMapper();
				response.setContentType("application/json;charset=utf-8");
				mapper.writeValue(response.getOutputStream(),obj);
			}

			//将传入的对象序列化为json,返回
			pu
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值