Servlet使用过程中关于路径的设置

在使用servlet进行web编程时,有关的路径设置是一个很头疼的问题,servlet的路径设置主要分为相对路径和绝对路径,下面通过Eclipse构建的一个ServletPathDemo动态网站项目进行分析(Myeclipse构建基本一致):

项目文件层次为:

Servlet使用过程中关于路径的设置_第1张图片

1.Jsp页面中的路径设置

以index.jsp为例:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>

<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>





Insert title here


	

Servlet路径跳转


访问HelloServlet!
访问HelloServlet!

访问TestServlet!
访问TestServlet!
上面的jsp界面中有四个超链接来访问项目中的servlet,其中有相对路径和绝对路径的方式,上面代码中的两种路径访问格式完全正确。

2. servlet中的路径设置

以TestServlet为例:

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		doPost(request, response);
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		//请求重定向方式跳转到test.jsp,当前路径为ServletPathDemo/servlet/
		response.sendRedirect("/test.jsp"); //错误,报错路径: /test.jsp(前面没有项目根目录)
		response.sendRedirect("test.jsp"); //错误,报错路径: /ServletPathDemo/servlet/test.jsp
		response.sendRedirect(request.getContextPath()+"/test.jsp"); //正确
		response.sendRedirect("../test.jsp"); //正确
		
		//服务器内部跳转
		request.getRequestDispatcher("/test.jsp").forward(request, response);//正确
		request.getRequestDispatcher("../test.jsp").forward(request, response); //正确
		request.getRequestDispatcher("test.jsp").forward(request, response); //错误,报错路径: /ServletPathDemo/servlet/test.jsp
		request.getRequestDispatcher(request.getContextPath()+"/test.jsp").forward(request, response); //错误
		//上述转发的最终路径为:/ServletPathDemo/ServletPathDemo/test.jsp,可以看到项目根目录重复
		
		/*
		 * 从上面的分析可以知道:当服务器处理到达servlet时,重定向和转发的默认路径都为ServletPathDemo/servlet/
		 * 在response的重定向时,当路径前面加“/”使用绝对路径时,默认路径会变成localhost:8080,后面并不带项目名称;
		 * 在request的转发时,当路径采用绝对路径时,默认路径会变成localhost:8080/ServletPathDemo,带项目名称。
		 */
	}

}
servlet中的路径设置根据重定向和转发分为两种格式,上述代码完整的分析了各种写法。

3. web.xml中关于servlet-mapping的设置

以本项目的web.xml为例:



  ServletPathDemo
  
    index.jsp
  
  
  
  	HelloServlet
  	servlet.HelloServlet
  
  
  
  	TestServlet
  	servlet.TestServlet
  
  
  
  	HelloServlet
  	
  	/servlet/HelloServlet
  
  
  
  	TestServlet
  	/servlet/TestServlet
  
  
web.xml中的servlet-mapping中的url-pattern中的路径前面必须是有"/"的。



你可能感兴趣的:(Java,Web)