如果每想服务器请求都需要写一个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;
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;
public class BookManagerServlet extends BaseServlet{
BookServiceImpl bookService = new BookServiceImpl();
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
final List<Book> all = bookService.getAll();
req.setAttribute("list",all);
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
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"));
}
}
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);
}
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);
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
}
那么现在我们只需要将请求中的method参数与继承BaseServlet子类的方法名对应起来即可,这样子一来一个Servlet中可以编写处理多个请求的方法,不用担心servlet过多的问题。