利用反射编写一个强大的Servlet(解决Servlet过多问题)

如果每想服务器请求都需要写一个servlet的话,那么servlet实在是太多了,所以可以使用反射机制来编写一个BaseServlet利用反射来调用子类中的方法。
BaseServlet代码如下:
package com.lc.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/**
 * @author 梁宸
 */
public class BaseServlet extends HttpServlet {
    public BaseServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        final String method = req.getParameter("method");
        Method declaredMethod = null;
        try {
            declaredMethod = this.getClass().getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);
            declaredMethod.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("sql语句运行异常...");
        }
    }
}

可以看到,他利用了客户端传来的一个method参数,利用反射找到需要调用子类的哪个方法。
子类代码如下:
package com.lc.servlet;

import com.lc.bean.Book;
import com.lc.bean.Page;
import com.lc.service.impl.BookServiceImpl;
import com.lc.untils.JDBCUntils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * @author 梁宸
 */
public class BookManagerServlet extends BaseServlet{
    BookServiceImpl bookService = new BookServiceImpl();

    /**
     * 显示所有图书
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final List<Book> all = bookService.getAll();
       // System.out.println(all.get(0));
        req.setAttribute("list",all);
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
    }

    /**
     * 添加图书与更新图书
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final Book book = JDBCUntils.aotuBean(req, new Book());
        System.out.println(book);
        if(book.getId() == 0){
            bookService.add(book);
            resp.sendRedirect("/book_store05_war_exploded/bookmanager?method=page&pageNow="+req.getParameter("addPn"));
        }else {
            bookService.update(book);
            resp.sendRedirect("/book_store05_war_exploded/bookmanager?method=page&pageNow="+req.getParameter("updatePn"));
        }
    }

    /**
     * 删除单个图书信息
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final Book book = JDBCUntils.aotuBean(req, new Book());
        final String referer = req.getHeader("Referer");
        bookService.delete(book);
        resp.sendRedirect(referer);
    }

    /**
     * 分页查询显示
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String pageNow = req.getParameter("pageNow");
        Page<Book> page = bookService.pageList(pageNow);
        page.setUrl("/book_store05_war_exploded/bookmanager?method=page");
        req.setAttribute("page",page);
        //System.out.println(page);
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
    }
}

那么现在我们只需要将请求中的method参数与继承BaseServlet子类的方法名对应起来即可,这样子一来一个Servlet中可以编写处理多个请求的方法,不用担心servlet过多的问题。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值