纯servlet做控制器时BaseAction的缓存设计思想

本博客来自转载  转载地址:http://blog.tianya.cn/blogger/post_read.asp?BlogID=3283788&PostID=27541263

当我们在javaweb方面的项目时,如果不想用struts等现有的开源框架而只用servlet做控制器时,我们可以对自己servlet进行设计,从而追求更高的效率。以下是我的设计思想(来源于struts):

---------baseAction的代码------------
package org.leovuyo.servlet;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BaseServlet extends HttpServlet {

    /**
     */
    private static final long serialVersionUID = -1000401219832868371L;
    HashMap<String, Method> hashMap = new HashMap<String, Method>(); // 实例化一个hashMap以用作缓存

    /**
     * @see HttpServlet#HttpServlet()
     */
    public BaseServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
        // TODO Auto-generated method stub

        String className = this.getClass().getName();// 这里是判断交个哪个子servlet处理
        System.out.println(className);
        String methodName = request.getParameter("do");// 判断交给servlet的哪个方法
        System.out.println("---------" + methodName);
        try {
            Object instance = Class.forName(className).newInstance();// 实例化子servlet
            if (!hashMap.containsKey(methodName)) {// 判断hashMap中是否有这个方法
                Method method = instance.getClass().getMethod(methodName,
                        new Class[] { HttpServletRequest.class, HttpServletResponse.class });// 没有的话就利用反射机制得到子servlet的该方法
                method.invoke(instance, new Object[] { request, response });// 调用invoke执行该方法
                hashMap.put(methodName, method);// 加入hashMap中
            } else {
                Method method = (Method) hashMap.get(methodName);// 有就直接拿出运行
                method.invoke(instance, new Object[] { request, response });
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


-----------子action的代码--------
package org.leovuyo.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends BaseServlet {

    /**
     */
    private static final long serialVersionUID = 2341206665438407507L;

    public void login(HttpServletRequest request, HttpServletResponse response) {
        // ��登录的方法
        System.out.println("login!!!");
    }

    public void register(HttpServletRequest request, HttpServletResponse response) {
        // 注册的方法
        System.out.println("register!!!");
    }
}


这里还可以写其他的子servlet来继承该baseAction实现自己的功能,同时你也可以给一个模块定义一个baseAction(注意hashMap中不能有相同的键,所以注意里面的方法名)...

猜你喜欢

转载自leovuyo.iteye.com/blog/2069536
今日推荐