通用Servlet的抽取
- 模块化开发Servlet的方法,自定义 BaseServlet工具 继承HttpServlet;
BaseServlet的原理是通过反射找到子类的方法,然后执行!
package com.igeek.shop.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author www.igeehome.com
*
* TODO 所有的servlet的基类
*
* 2018年9月8日上午10:26:54
*/
public class BaseServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数中的method
String method = req.getParameter("method");
if(method!=null){
try {
//通过反射调用对应的方法
//通过“this”获取class对象
Class clazz = this.getClass();
//通过class对象和方法名获取方法对象
Method m = clazz.getMethod(method, HttpServletRequest.class,HttpServletResponse.class);
//通过反射机制调用方法
m.invoke(this, req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.创建servlet继承 BaseServlet 类中不用写 doget dopost方法
package com.igeek.shop.servlet;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.igeek.shop.entity.Pager;
import com.igeek.shop.entity.Product;
import com.igeek.shop.service.ProductService;
import com.igeek.shop.service.impl.ProductServiceImpl;
/**
* Servlet implementation class ProductServlet
*/
public class ProductServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private ProductService productService = new ProductServiceImpl();
public ProductServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* 合并ProductListServlet的功能,实现商品列表展示
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void productList(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
// 通过cid读取商品列表
String cid = request.getParameter("cid");
int page = 1;
int size = 6;
try {
page = Integer.parseInt(request.getParameter("page"));
} catch (Exception e) {
}
try {
size = Integer.parseInt(request.getParameter("size"));
} catch (Exception e) {
}
// List<Product> products = productService.findProductsByCid(cid);
// request.setAttribute("products", products);
// 将查询全部修改为分页查询
Pager<Product> pager = productService.findByPage(cid, page, size);
request.setAttribute("pager", pager);
// 将cid再次携带到页面
request.setAttribute("cid", cid);
// 从cookie中取出readId
Cookie[] cookies = request.getCookies();// 获取所有的cookie
// 遍历找出浏览记录的cookie
Cookie readCookie = null;
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("readId")) {
readCookie = cookie;
break;
}
}
//判断是否已经拿到浏览记录的cookie
if(readCookie!=null){//说明已经获取到浏览记录的cookie
//取出id字符串
String ids = readCookie.getValue();
// 分割id
String[] pids = ids.split("_");
// 根据pid的数组,从底层中查询浏览记录的商品信息列表
//只窃取数组的最后7位。
pids = Arrays.copyOfRange(pids, pids.length-7<0?0:pids.length-7, pids.length);
List<Product> rproducts = productService.findByIds(pids);
// 将浏览记录的商品信息列表存储在request中
request.setAttribute("rproducts", rproducts);
}
// 转发到列表页面
request.getRequestDispatcher("product_list.jsp").forward(request, response);
}
/**
* 合并ProductInfoServlet功能,实现商品详细信息展示的功能
* @throws IOException
* @throws ServletException
*/
private void productInfo(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
//从请求参数中取出商品的ID
String pid = request.getParameter("pid");
//通过id读取商品的信息,
Product product = productService.findProducById(pid);
//将商品的信息放入request中。
request.setAttribute("product", product);
//将商品的ID存储到cookie中
//要考虑是否以及存在了浏览记录。
//如果已经存在浏览记录cookie,则将现在的ID添加到原来的浏览记录中
//从reuqest中区cookie
Cookie[] cookies = request.getCookies();//获取到所有的cookie
//保存浏览记录的cookie对象
Cookie readCookie = null;
//遍历cookies
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//判断是否存在浏览记录的cookie
if(cookie.getName().equals("readId")){
//说明存在浏览记录的cookie
readCookie = cookie;
break;//跳出循环
}
}
if(readCookie!=null){//浏览记录cookie存在
//将当前的ID添加到原有的记录cookie中
//取出原有的浏览记录的ID
String ids = readCookie.getValue();//1_3434_54545_erer3434_3434
//直接将现在pid添加到原有的后面
//判断浏览记录的cookie中是否存在当前的商品
if(!ids.contains(pid)){//不存在就添加到后面
//当记录数量超过10的时候,就删除最前面的一个记录。
if(ids.split("_").length==10){
ids=ids.substring(ids.indexOf("_")+1);
}
//将最新的浏览记录的ID追加到最后
ids+="_"+pid;//
//再将ID设置到cookie中
readCookie.setValue(ids);
}
}else{
//如果没有浏览记录,则新创建浏览记录的cookie
readCookie = new Cookie("readId", pid);
}
readCookie.setPath("/");//设置cookie的路径为根目录
readCookie.setMaxAge(60*60*24*7);//设置cookie的存活时间为7天。一旦设置cookie的存活时间,cookie就会存储在磁盘上。
//将cookie设置到response中
response.addCookie(readCookie);
//转发到product_info.jsp
request.getRequestDispatcher("product_info.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
3.在请求的过程中 用URL 携带一个方法的名称给服务端。(你需要执行哪个方法名就用哪个方法)