关于多个servlet的配置文件

悬赏:10 发布时间:2008-07-09 提问人:templarz (初级程序员)

大家好,我有一个关于servlet文件的问题,一般servlet的配置信息都是放在 %/WEB-INF/web.xml下,如果是个简单的系统还好说,如果是大一点的项目,那么按照模块划分,摸个模块对应多个servlet,那么这些servlet的配置全放在web.xml里就太臃肿了,大家有什么好的方法,比如一个模块的servlet配置信息放在一个model_web.xml里,然后把这个model_web.xml信息放在 web.xml里,我是这么考虑的,自定义一个servlet类,tomcat启动时运行这个servlet,这个servlet把 model_web.xml加载。请问如何实现?
问题补充:
对于小型应用来说,自己配置的servlet比struts要好使用,这是我问这个问题的初衷。
问题补充:
不管是struts还是其他的开源框架底层用的还是servlet,如果连servlet都搞不清楚,开口闭口都是这些框架,那么技术得不到提高。只能用人家封装好的框架。
我问这个问题,就是想搞清楚底层的实现,既然struts可以实现,那么技术上来讲也可以实现。

采纳的答案

2008-07-11 lggege (资深程序员)

那我只好贴代码了. 简单测试通过.

web.xml 配置内容
 	<servlet>
 		<servlet-name>ttServlet</servlet-name>
		<servlet-class>cn.iwoo.demo.web.TtServlet</servlet-class>
		<init-param>
    		<param-name>xmlLocations</param-name>
    		<param-value>one.xml,two.xml</param-value>
  		</init-param>
 	</servlet>
 	
 	<servlet-mapping>
		<servlet-name>ttServlet</servlet-name>
		<url-pattern>/tt/*</url-pattern>
	</servlet-mapping>

提问者对于答案的评价:
写的很精辟
额外加分:15

其他回答

那为什么不用struts?
congjl2002 (资深程序员) 2008-07-09
这应该是个很好的J2ee实践模式. 将所有的Servlet放在一个统一的地方进行管理.

只不过现在的struts做的也就是你现在做的这件事情而已.

不过,还是不建议重造轮子.
lggege (资深程序员) 2008-07-09
总的Servlet

public class TtServlet extends HttpServlet {
	private String[] locationArray;
	private List<ServletModel> servletModels;
	@Override
	public void init(ServletConfig arg0) throws ServletException {
		String locations = arg0.getInitParameter("xmlLocations");
		locationArray = locations.split(",");
		// .. 这里就直接设定从locationArray加载model_web.xml 得到的内容
		servletModels = new ArrayList<ServletModel>();
		servletModels.add(new ServletModel("/tt/a", "cn.iwoo.demo.web.AServlet"));
		// ..
		super.init(arg0);
	}
	
	@Override
	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		this.service(arg0, arg1);
	}
	
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		// 请求地址
		String requestURI = this.getRequestURI(arg0);
		
		// 请求的目标Servlet
		ServletModel targetServeltModel = this.getRequestTargetServletModel(requestURI);
		
		// 目标Servlet响应请求
		try {
			HttpServlet targetServlet = this.getRequestTargetServlet(targetServeltModel);
			targetServlet.service(arg0, arg1);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private String getRequestURI(HttpServletRequest arg0) {
		return arg0.getRequestURI();
	}
	
	private ServletModel getRequestTargetServletModel(String requestURI) {
		ServletModel targetServeltModel = null;
		for (ServletModel servletModel : servletModels) {
			if (requestURI.endsWith(servletModel.urlParttern)) {
				targetServeltModel = servletModel;
				break;
			}
		}
		return targetServeltModel;
	}
	
	private HttpServlet getRequestTargetServlet(ServletModel targetServeltModel) {
		HttpServlet targetSevlet = null;
		try {
			targetSevlet = (HttpServlet) Class.forName(targetServeltModel.servletname).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return targetSevlet;
	}
	
	class ServletModel {
		private String urlParttern;
		private String servletname;
		public ServletModel(String urlParttern, String servletname) {
			this.urlParttern = urlParttern;
			this.servletname = servletname;
		}
		// ..
	}
}
lggege (资深程序员) 2008-07-11
目标Servlet
public class AServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		this.service(arg0, arg1);
	}
	
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		arg1.getWriter().write("LSDLKSDKFJDSf");
	}
}
lggege (资深程序员) 2008-07-11
测试使用的url
http://localhost:8080/iwoo/tt/a

页面显示结果:
引用
LSDLKSDKFJDSf
lggege (资深程序员) 2008-07-11
上面的代码, 还需要去符合J2ee定义的Servlet生命周期.

比如: 去模拟 init(), destroy(). Servlet的单件.
lggege (资深程序员) 2008-07-11