关于多个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可以实现,那么技术上来讲也可以实现。
问题补充:
对于小型应用来说,自己配置的servlet比struts要好使用,这是我问这个问题的初衷。
问题补充:
不管是struts还是其他的开源框架底层用的还是servlet,如果连servlet都搞不清楚,开口闭口都是这些框架,那么技术得不到提高。只能用人家封装好的框架。
我问这个问题,就是想搞清楚底层的实现,既然struts可以实现,那么技术上来讲也可以实现。
采纳的答案
2008-07-11 lggege (资深程序员)
那我只好贴代码了. 简单测试通过.
web.xml 配置内容
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做的也就是你现在做的这件事情而已.
不过,还是不建议重造轮子.
只不过现在的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
lggege (资深程序员) 2008-07-11
上面的代码, 还需要去符合J2ee定义的Servlet生命周期.
比如: 去模拟 init(), destroy(). Servlet的单件.
比如: 去模拟 init(), destroy(). Servlet的单件.
lggege (资深程序员) 2008-07-11
已解决问题数: 959
待解决问题数: 418
已关闭问题数: 1635
待解决问题数: 418
已关闭问题数: 1635




