前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java Web之BaseServlet的抽取

Java Web之BaseServlet的抽取

作者头像
YungFan
发布2018-05-03 14:54:41
1.1K0
发布2018-05-03 14:54:41
举报
文章被收录于专栏:学海无涯学海无涯

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

BaseServlet

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

代码语言:javascript
复制
//这个抽象类,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。

代码语言:javascript
复制
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,如下:

代码语言:javascript
复制
<?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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.01.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • BaseServlet
  • 真正处理业务逻辑的Servlet
  • 部署Servlet
  • 访问Servlet
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档