欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet的抽取:BaseServlet

程序员文章站 2022-05-08 13:15:07
...
 4.Servlet的抽取:BaseServlet只重写service方法,其他Servlet继承BaseServlet,其他Servlet中方法的返回值均为String

          之前编写的servlet的问题:1.2.3.

              1.doget每次请求都会执行,解决方法:重写service方法。

                  关于service(ServletRequest req,ServletResponse res)方法:客户端每次请求Servlet都会运行该方法,该方法判断访问类型
                  然后根据HttpServletRequest的getMethod()返回结果判断是执行doGet还是doPost方法等。
              
              2.用了大量的if else if等判断语句,来判断getParameter()方法得到的值,根据值来判断进行做什么操作。 解决方法:通过反射获得当前运行类中指定方法,形式参数,通过调用this.getClass().getMethod(String name,parameterTypes)来获取该对象所声明的公开方法。返回一个Method对象。

                第一个参数name是要获得方法的名字,第二个参数parameterTypes是按该方法声明的形参类型。

                person.getClass().getMethod("run", String.class);//获得person对象的run方法,因为run方法的形参是String类型的,所以parameterTypes为String.class

                 Method method = this.getClass().getMethod(String name,parameterTypes);   //获取方法(只能获取公共方法,父类方法也能获取)
                 method.invoke(this,request,response);                                    //执行方法         

              3.每个方法执行的结果无非就是请求转发或者重定向或者打印数据。 解决方法:让每个方法都返回一个字符串,

                          若最后的结果需要请求转发,就把转发的路径返回。若最后的结果不需要请求转发(重定向),就返回一个null;

                          String path = method.invoke(this,request,response);
                              
                           if(path != null){
                               request.getRequestDispatcher(path).forword(request,response);   //执行请求转发
                            }
    
               4.所有Servlet的service中的代码都一样,向上抽取,编写一个父类:BaseServlet,将之前service方法中的代码复制过来即可, 然后所有的Servlet都继承BaseServlet方法。

               5.统一的错误页面。

public class  BaseServlet extends HttpServlet{
	@Override
	public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
		try {
			//1.获得方法名
			String methodname = request.getParameter("method");

			//思考:若没有得到方法名呢?所以此处要增加一个错误处理
			if (methodname == null || methodname.trim().length() == 0) {
				methodname = "index";  //若为空,后者长度为0,给他一个默认值
			}

			//2.通过反射获得当前运行类中指定方法,形式参数.
			Method method = this.getClass().getMethod(methodname, HttpServletRequest.class, HttpServletResponse.class);

			//3.执行该方法,方法执行完后要判断是转发还是重定向,我们将返回值存到字符串path中来判断。
			String path = (String) method.invoke(request, response);

			//4.根据path判断执行什么操作
			if (path != null) {
				request.getRequestDispatcher(path).forward(request, response);
			}


		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException();
		}

	}
	public String index(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {

		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html");

		response.getWriter().println("亲,不要捣乱");

		return null;
	}
}