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方法。
之前编写的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;
}
}
上一篇: 用vue2.0实现点击选中active其他选项互斥的效果
下一篇: 最配的手机壳
推荐阅读
-
SpringBoot 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)
-
Servlet | Request 对象获取请求参数的通用方式
-
jsp和servlet操作mysql中文乱码问题的解决办法
-
解决cannot be cast to javax.servlet.Filter 报错的问题
-
jsp传参 servlet接收中文乱码问题的解决方法
-
Servlet实现文件上传的三种方法总结
-
JSP+Servlet制作Java Web登录功能的全流程解析
-
详解Struts2中Action访问Servlet API的几种方法
-
ASP抽取数据的执行效率
-
【JDBC】工具类的抽取