本博客来自转载 转载地址: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中不能有相同的键,所以注意里面的方法名)...
纯servlet做控制器时BaseAction的缓存设计思想
猜你喜欢
转载自leovuyo.iteye.com/blog/2069536
今日推荐
周排行