大家好,我有一个关于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加载。请问如何实现?
[b]问题补充:[/b]
对于小型应用来说,自己配置的servlet比struts要好使用,这是我问这个问题的初衷。
[b]问题补充:[/b]
不管是struts还是其他的开源框架底层用的还是servlet,如果连servlet都搞不清楚,开口闭口都是这些框架,那么技术得不到提高。只能用人家封装好的框架。
我问这个问题,就是想搞清楚底层的实现,既然struts可以实现,那么技术上来讲也可以实现。
那我只好贴代码了. 简单测试通过.
web.xml 配置内容
[code="xml"]
ttServlet
cn.iwoo.demo.web.TtServlet
xmlLocations
one.xml,two.xml
<servlet-mapping>
<servlet-name>ttServlet</servlet-name>
<url-pattern>/tt/*</url-pattern>
</servlet-mapping>[/code]
那为什么不用struts?
这应该是个很好的J2ee实践模式. 将所有的Servlet放在一个统一的地方进行管理.
只不过现在的struts做的也就是你现在做的这件事情而已.
不过,还是不建议重造轮子. :D
总的Servlet
[code="java"]public class TtServlet extends HttpServlet {
private String[] locationArray;
private List servletModels;
@Override
public void init(ServletConfig arg0) throws ServletException {
String locations = arg0.getInitParameter("xmlLocations");
locationArray = locations.split(",");
// .. 这里就直接设定从locationArray加载model_web.xml 得到的内容
servletModels = new ArrayList();
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;
}
// ..
}
}[/code]
目标Servlet
[code="java"]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");
}
}[/code]
测试使用的url
[url]http://localhost:8080/iwoo/tt/a[/url]
页面显示结果:
[quote]LSDLKSDKFJDSf[/quote]
上面的代码, 还需要去符合J2ee定义的Servlet生命周期.
比如: 去模拟 init(), destroy(). Servlet的单件.