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