BaseServlet
2016-07-29 15:36
405 查看
BASESERVLET
说明:
为了简化Servlet的书写,也为了实现一个Servlet中可以调用多个方法,借鉴别人代码,写出baseServlet。以后再写servlet的时候,可以继承该BaseServlet。注意:
若要使用该BaseServlet,则需按照一定的书写规范,以下会有举例!
BaseServlet.java
package demo1.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; public abstract class BaseServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; @SuppressWarnings("unchecked") public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* * 1. 获取参数,用来识别用户想请求的方法 * 2. 然后判断是否哪一个方法,是哪一个我们就调用哪一个 */ String methodName = req.getParameter("method"); if(methodName == null || methodName.trim().isEmpty()) { throw new RuntimeException("您没有传递method参数!无法确定您想要调用的方法!"); } /* * 得到方法名称,是否可通过反射来调用方法? * 1. 得到方法名,通过方法名再得到Method类的对象! * * 需要得到Class,然后调用它的方法进行查询!得到Method * * 我们要查询的是当前类的方法,所以我们需要得到当前类的Class */ @SuppressWarnings("rawtypes") Class c = this.getClass();//得到当前类的class对象 Method method = null; try { method = c.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); } catch (Exception e) { throw new RuntimeException("您要调用的方法:" + methodName + "(HttpServletRequest,HttpServletResponse),它不存在!"); } /* * 调用method表示的方法 */ try { String result = (String)method.invoke(this, req, resp); /* * 获取请求处理方法执行后返回的字符串,它表示转发或重定向的路径! * 帮它完成转发或重定向! */ /* * 如果用户返回的是字符串为null,或为"",那么我们什么也不做! */ if(result == null || result.trim().isEmpty()) { return; } /* * 查看返回的字符串中是否包含冒号,如果没有,表示转发 * 如果有,使用冒号分割字符串,得到前缀和后缀! * 其中前缀如果是f,表示转发,如果是r表示重定向,后缀就是要转发或重定向的路径了! */ if(result.contains(":")) { // 使用冒号分割字符串,得到前缀和后缀 int index = result.indexOf(":");//获取冒号的位置 String s = result.substring(0, index);//截取出前缀,表示操作 String path = result.substring(index+1);//截取出后缀,表示路径 if(s.equalsIgnoreCase("r")) {//如果前缀是r,那么重定向! resp.sendRedirect(req.getContextPath() + path); } else if(s.equalsIgnoreCase("f")) { req.getRequestDispatcher(path).forward(req, resp); } else { throw new RuntimeException("你指定的操作:" + s + ",当前版本还不支持!"); } } else {//没有冒号,默认为转发! req.getRequestDispatcher(result).forward(req, resp); } } catch (Exception e) { System.out.println("您调用的方法:" + methodName + ", 它内部抛出了异常!"); throw new RuntimeException(e); } } }
实例:
class BServlet extends BaseServlet { public String fun1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("fun1()..."); return "r:/index.jsp"; } }
请求路径:
http://域名:端口/项目名/Servlet名?method=方法名如:
http://localhost:8080/demo1/BServlet?method=fun1
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序