反射实现同一Java文件多个Servlet
(2010-08-08 21:12:53)
标签:
servlet
企业java
反射
it
标准的Servlet写法,是一个Servlet占用一个Java文件,使用doGet()或者doPost()或者service()方法,执行Servlet与
前台之间的交互,但是,在大型项目中,由于业务逻辑的复杂性,如果每个Servlet占用一个Java文件,那么Java文件会太多,而且
源代码会比较乱,看起来工程庞大,其实实现的功能很少,所以怎么样让同一个Java文件,能够包含多个Servlet就成为不得不解决
的问题。
最容易想到的办法,是在向Servlet发送请求的时候,传递一个参数比如tag,然后在doGet()方法里,用if..else这种条件判
断的方式,选择究竟执行Java文件中的那个Servlet,但是这样的代码写法是很不美观的,而且doGet()方法校验,也会增加代码
的编写量。这里介绍一种用反射来实现的的,根据请求传来的参数,自动选择执行那个Servlet方法。这种实现,其实是借鉴了
Struts1.2中的DispatchAction的处理方法,呵呵,偷来的吧。
言归正传,首先是一个AbstractServlet方法,作为所有Servlet方法的基类,在这个基类的doGet()方法,使用反射的完成,
判断执行Java文件中的哪个Servlet,切忌在继承了基类的Servlet中不要再写doGet()或者doPost(),service
()方法了,否
则这个反射机制就失效了,不知道为什么的可以找一本面向对象的初级教程看看,^_^。
源码:
AbstractServlet.java :
--------------------------------------------------------------
import java.lang.reflect.Method;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AbstractServlet extends HttpServlet
{
public AbstractServlet() {
super();
}
public void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException,
IOException
{
String tag = request.getParameter("tag");
try
{
Method method = this.getClass().getDeclaredMethod(tag, new Class[]
{
HttpServletRequest.class, HttpServletResponse.class });
method.invoke(this, new Object[] { request, response });
} catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException,
IOException
{
doGet(request, response);
}
}
------------------------------------------------------------------------------------
自己写的一个Servlet示例:
Manage.java
-----------------------------
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import bo.Users;
import service.UserManage;
import service.UserQuery;
import vo.AbstractServlet;
public class Manage extends AbstractServlet
{
private UserManage userManage = new UserManage();
private UserQuery userQuery = new UserQuery();
public void addUser(HttpServletRequest request, HttpServletResponse
response) throws ServletException,
IOException
{
Users user = new Users();
user.setUser_id(request.getParameter("id"));
user.setUser_name(request.getParameter("name"));
user.setUser_password(request.getParameter("password"));
user.setUser_address(request.getParameter("address"));
// String password = request.getParameter("address");
// user.setUser_address(new
String(password.getBytes("ISO-8859-1"),
// "UTF-8"));
user.setUser_phone(request.getParameter("phone"));
if (userManage.usersAdd(user))
{
String add_suc = "login.jsp";
response.sendRedirect(add_suc);
return;
} else
{
String add_fail = "error.jsp";
response.sendRedirect(add_fail);
return;
}
}
public void deleteUser(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException
{
String id = request.getParameter("id");
PrintWriter out = response.getWriter();
if (userManage.usersDelete(id))
{
out.print("删除成功!");
return;
} else
{
out.print("删除失败!");
return;
}
}
public void queryUsers(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException
{
Integer pageSize = 3;
request.setAttribute("pageSize", pageSize);
String pageNo = request.getParameter("pageNo");
if (pageNo == null)
pageNo = "1";
Integer pageNum = Integer.parseInt(pageNo);
Users user = new Users();
user.setUser_id(request.getParameter("id"));
user.setUser_name(request.getParameter("name"));
user.setUser_address(request.getParameter("address"));
user.setUser_phone(request.getParameter("phone"));
List list =
userQuery.queryUsers(user, pageNum, pageSize);
List sendList = new
Vector();
if (list != null)
{
Integer size = userQuery.queryUsersCount(user);
request.setAttribute("total", size + "");
if (pageNum != 1)
{
Integer removeNo = (pageNum - 1) * pageSize;
for (int i = 0; i < list.size(); i++)
{
if (i < removeNo)
continue;
else
{
sendList.add(list.get(i));
}
}
} else
{
sendList = list;
}
request.setAttribute("list", sendList);
String queSuc = "userQuery.jsp";
request.getRequestDispatcher(queSuc).forward(request,
response);
return;
} else
{
String queFail = "error.jsp";
response.sendRedirect(queFail);
return;
}
}
public void updateUser(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException
{
Users user = new Users();
user.setUser_id(request.getParameter("id"));
user.setUser_name(request.getParameter("name"));
user.setUser_password(request.getParameter("password"));
user.setUser_address(request.getParameter("address"));
user.setUser_phone(request.getParameter("phone"));
if (userManage.usersUpdate(user))
{
String update_suc = "ok.jsp";
response.sendRedirect(update_suc);
return;
} else
{
String update_fail = "error.jsp";
response.sendRedirect(update_fail);
return;
}
}
}
------------------------------------------------------------------------------
从JSP页面调用Servlet的方法
method="post">
----------------------------------------------------------------------
点到为止,对这个Servlet基类,AbstractServlet中,还可以写一些各个Servlet中都可能会用到的公用方法,至于怎么扩充,就看业务需要了。
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。