Java Web之BaseServlet的抽取

作者: YungFan | 来源:发表于2017-01-06 10:11 被阅读1056次

    在Java Web学习的初期,开发的小项目几乎都是JSP+Servlet+JDBC,长期开发下来,会发现当业务逻辑设计的接口一多的时候,充当控制器的Servlet也会越来越多,但是处理的业务逻辑相对单一。后来学习Struts2或者SpringMVC,发现它们处理起来优雅得多,但是配置起来也比纯的Servlet要繁琐,对于经常做小项目的我来说有点大材小用了,于是我根据前人的经验抽离了一个BaseServlet,用反射的机制来处理请求,这样处理业务逻辑的Servlet要相对简单的多,废话不说,把自己使用的一套拿出来晒晒。

    BaseServlet

    由于服务器端经常是用JSON与Android和iOS客户端进行交互,所以这里返回的就是JSON数据

    //这个抽象类,BaseServlet类不需要在web.xml中进行配置
    public abstract class BaseServlet extends HttpServlet {
    
        // final 防子类复写
        public final void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            this.doPost(request, response);
        }
    
        public final void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 1、获得执行的方法名
            String methodName = request.getParameter("method");
            // 默认方法
            if (methodName == null) {
                methodName = "execute";
            }
    
            System.out.println("BaseServlet : " + this + " , " + methodName);
    
            try {
                // 2、通过反射获得当前运行类中指定方法,形式参数
                Method executeMethod = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
                // 3、反射执行方法
                String result = (String)executeMethod.invoke(this, request, response);
                // 4、将json数据返回
                response.getWriter().write(result);
            } catch (NoSuchMethodException e) {
                throw new RuntimeException("请求的方法[" + methodName + "]不存在");
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException("服务器异常", e);
            }
        }
    
        /**
         * 此方法用于复写,方便子类编程,默认执行方法
         */
        public void execute(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
        }
    }
    

    真正处理业务逻辑的Servlet

    需要做的就是继承上面的BaseServlet,然后根据业务需求写自己的方法即可,乍一看像SpringMVC,但是要注意这里的方法名和返回值,方法名决定了请求时的method参数的值,返回值由于是JSON,所以用的是String。

    public class UserServlet extends BaseServlet {
    
        public String users(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ArrayList<User> users = new ArrayList<User>();
            for (int i = 0; i < 10; i++) {
                User user = new User(i, "zhangsan" + i, i + 10, "wukong" + i);
                users.add(user);
            }
            Gson gson = new Gson();
            return gson.toJson(users);
        }
    }
    
    ==========================================================
    //自定义的一个PO
    public class User {
    
        private int id;
        private String name;
        private int age;
        private String nickname;
    
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getNickname() {
            return nickname;
        }
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
    
        public User(int id, String name, int age, String nickname) {
            this.id = id;
            this.name = name;
            this.age = age;
            this.nickname = nickname;
        }
    }
    

    部署Servlet

    将自己的业务UserServlet部署到web.xml,如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
    
        <servlet>
            <servlet-name>UserServlet</servlet-name>
            <servlet-class>test.app.api.UserServlet</servlet-class>
        </servlet>
        
        
        <servlet-mapping>
            <servlet-name>UserServlet</servlet-name>
            <url-pattern>/UserServlet</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    访问Servlet

    部署并启动tomcat以后,打开浏览器访问:http://localhost/AppTestAPI/UserServlet?method=users
    结果如下:

    返回JSON结果.png

    相关文章

      网友评论

        本文标题:Java Web之BaseServlet的抽取

        本文链接:https://www.haomeiwen.com/subject/ykwzvttx.html