Myeclipse关于Servlet项目文件的组织方面,如下:
WEB-INF:这个目录名称和位置是固定的,放置在该目录下的文件或目录,对外界来说的封闭的,也就是客户端无法用http的任何方式访问到其中的文件。如有这类需求,则必须通过Servlet/jsp的请求转发(Forward)。可用于保存资源。
web.xml:这是web应用程序部署描述文件,位置和名称固定。
lib:放置JAR文件,位置和名称固定。
classes:放置编译后的类文件
Servlet部署方面:
URL模式的设置,一个请求URI实际上是由三部分组成:
requestURI = contextPath + servletPath + pathInfo;
可以使用httpServletRequest的getRequestURI()来取得这项信息
首先,环境路径contextPath,是容器用来决定挑选哪个Web应用程序的依据,可以使用httpServletRequest的getContextPath()来获得,环境路径一般以"/"开头,若应用程序环境路径与Web服务器环境跟路径相同,则应用程序环境路径为空字符串。
一旦决定Web服务程序,接下来就进行Servlet的挑选,Servlet必须设置URL模式(url-pattern),三种设置方法,例如:/admin/login.do,/admin/*与*.do三个url模式设置,请求对比的原则是最严格的匹配优先原则。
其次,requestURI中的servletPath是Servlet路径,不包括路径信息和和请求参数,Servlet路径直接对应URL模式信息,可以使用httpServletRequest的getServletPath()获取,基本是以"/"开头,但在"/*"与""的情况下,Servlet的值为空字符串。
例如:某个请求是根据/hello.do对应至某个Servlet,则getServletPath()取得的Servlet路径就是/hello.do,如果是通过/servlet/*对应的,则取得的Servlet路径就是/servlet。
再次,requestURI中的pathInfo是路径信息,指的是不包括环境路径和Servlet路径的额外路径信息,通过httpServletRequest的getPathInfo()获取,若为类似*.do、预设Servlet或完全匹配的情况下,getPathInfo()得到的是null。
@WebServlet("/servlet/*")
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println("<HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println("<BODY>");
out.print(request.getRequestURI()+"<br/>");
out.print(request.getContextPath()+"<br/>");
out.print(request.getServletPath()+"<br/>");
out.print(request.getPathInfo()+"<br/>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}