JavaWeb——Servlet路径问题("/"到底代表什么)

JavaWeb——Servlet路径问题("/"到底代表什么)

  在JavaWeb中,使用路径时出现了大量的"/",而每次使用"“时都感觉其代表的含义是不同的,因此,本篇文章将汇总JavaWeb中的”"出现情况及其所代表的含义。
  了解这些"/"含义之前,先来了解绝对路径与相对路径的概念。
  提前说一下自己总结的规律:

   若是在浏览器中请求服务器,则此时绝对路径的"/"代表的是服务器(Tomcat)的根目录,而此时的相对路径代表的是该项目的根目录
   若在服务器中请求服务器,则此时绝对路径的"/"或相对路径代表的都是该项目的根目录
   而在服务器内部,可以这样理解,服务器在解析路径时,‘src’、'webapp’这些文件夹其实都被忽略了,也就是说,这两个目录下的文件可以认为是在同一目录(该项目的根目录)下
  一定要看使用的是什么路径,如果是相对路径,只需要看目标文件与当前文件之间的位置关系即可,而如果是绝对路径,才需要注意上面这几点要求。

 1、"/"出现在请求重定向与请求转发中

  有关请求转发与请求重定向的概念,这里不再赘述,请参考:请求转发与请求重定向

在这里插入图片描述

  由于请求转发是服务器内部行为,是在服务器中请求服务器,因此请求转发中的"/"表示该项目的根目录
  由于请求重定向是浏览器行为,是在浏览器中请求服务器,因此请求重定向的"/"表示Tomcat服务器的根目录
  先来看请求转发,此时dispatcher.jsp与request_form.jsp由于上面第三条的存在,都处于该项目的根目录,因此若使用绝对路径,可以再dispatcher.jsp中使用"/request_form.jsp"访问到request_form.jsp,若使用相对路径,由于dispatcher.jsp与request_form.jsp同在一个目录(项目根目录)下,因此也可以直接使用"request_form.jsp"访问到request_form.jsp。
	// 请求转发使用下面两种方式均可以访问到request_form.jsp
	// 使用绝对路径
	request.getRequestDispatcher("/request_form.jsp").forward(request,response);
	// 使用相对路径
	request.getRequestDispatcher("request_form.jsp").forward(request,response);
  下面看一下请求重定向,若使用相对路径,由于dispatcher.jsp与request_form.jsp同在一个目录中,因此使用"request_form.jsp"就可以访问,但对于相对路径来说,此时的"/"代表Tomcat服务器的根目录,因此要想访问该项目根目录中的文件,需要加上该项目根目录路径(需要与tomcat中该项目的路径相同或使用request.getContextPath()),再加上该文件的路径。
	// 请求重定向使用下面两种方式均可以访问到request_form.jsp
	// 使用相对路径
	response.sendRedirect("request_form.jsp");
	// 使用绝对路径
	response.sendRedirect("/javaweb_jsp/request_form.jsp");
	response.sendRedirect(request.getContextPath()+"/request_form.jsp");

 2、"/"出现在web.xml文件中(<servlet-mapping>中的<url-pattern>)

  servlet的相对路径跳转是相对于servlet配置的xml路径(或servlet3.0注解路径),无论是使用配置文件的方式还是注解的方式,在描述绝对路径的时候就不要多说,此时不需要知道servlet到底在哪,而只需要知道目标文件在哪即可,若servlet和目标文件都在同一服务器中,就相当于是服务器内部请求(请求转发或重定向均可),若servlet和目标文件在不同服务器中,使用请求重定向即可。
  若servlet与目标文件处于同一服务器中,并且是以相对路径来调用,无论是配置文件还是注解,只需要servlet的url-pattern(注解里也有)与目标文件的相对位置即可。举个栗子:

在这里插入图片描述

	// web.xml中的servlet配置
	 <servlet>
        <servlet-name>Dispatcher</servlet-name>
        <servlet-class>com.xiaoaxiao.test.Dispatcher</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Dispatcher</servlet-name>
        <url-pattern>/dis</url-pattern>
    </servlet-mapping>

	// Dispatcher(继承了HttpServlet)中的请求转发
	req.getRequestDispatcher("login.html").forward(req,resp);
  解析一下这个例子,此时的servlet根据配置文件的url-pattern配置可以看出,该servlet的路径相当于是在"/dis",即当前项目的根目录下(起了个名字叫dis),而login.html也是处于当前项目的根目录,因此使用相对路径访问直接"login.html"即可。
  还是同样的结构图,将配置文件中的url-pattern修改为"/test/dis"
	// web.xml中的servlet配置
	 <servlet>
        <servlet-name>Dispatcher</servlet-name>
        <servlet-class>com.xiaoaxiao.test.Dispatcher</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Dispatcher</servlet-name>
        <!-- 修改了此配置-->
        <url-pattern>/test/dis</url-pattern>
    </servlet-mapping>

	// Dispatcher(继承了HttpServlet)中的请求转发
	req.getRequestDispatcher("login.html").forward(req,resp);
  此时再直接访问"login.html"就不起作用了,因为此时的servlet相当于位于根目录下的test文件夹中,而login.html位于根目录下,因此此时通过相对路径就不能访问到login.html,若此时要访问login.html,需要将请求的地址改为"…/login.html","…/"代表返回上一层,对这个例子来讲就是返回到根目录(上一层),然后再访问这一层的login.html即可。
	req.getRequestDispatcher("../login.html").forward(req,resp);
  同理,使用注解与上面的情况完全相同,只需要关注注解中的属性url-pattern与目标文件的相对路径即可。
	// Servlet注解
	@WebServlet(urlPatterns = "/test/dis")
	
	// 请求转发
	req.getRequestDispatcher("../login.html").forward(req,resp);

 3、"/"出现在JSP页面中的表单标签或超链接标签中

  如果是JSP页面向servlet进行跳转,这很明显,是浏览器请求服务器,因此,此时的""指的就是Tomcat服务器,所以若此时想要请求某个Servlet,最好使用相对路径,相对路径为该jsp与对应servlet所处的相对位置。在webapp下新建一个test.jsp,使用相对路径即可访问到Dispatcher类(后续Dispatcher在通过请求转发访问login.html)
	<a href="test/dis">hello</a>
  若要使用绝对路径,"/"代表Tomcat服务器,有两种方式,要么给前面加上该项目的路径,要么自定义当前jsp页面的path与basePath属性后在网页中使用。
	//	加上项目路径
	<a href="/practice_webapp/test/dis">hello</a>
	
	//	使用自定义path属性
		// 设置basePath
		<%
	        String path = request.getContextPath();
	        String basePath = request.getScheme()+"://"+request.getServerName()
	            +":"+request.getServerPort()+path+"/";
	    %>
    	// 在<head>中设置默认路径为当前项目
    	<base href="<%=basePath%>"/>
    	// 在<a>标签中使用
    	<a href="test/dis">hello</a>
  即便是使用basePath后,也只是相当于当前处于项目的根目录,但"/“指的仍然是Tomcat服务器的根目录,因此只能使用"test/dis"找到对应servlet,而不能使用”/test/dis"(前面加了个"/")。
  本文参考:Servlet路径跳转问题
  • 27
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Servlet 是 JavaEE 规范中的一部分,是处理 Web 请求的组件。Servlet 运行在服务器端,能够接收客户端发来的请求,并给客户端响应结果。下面我们来看看 Servlet 的基本概念和使用方法。 ## 一、Servlet 的基本概念 ### 1.1 Servlet 的生命周期 Servlet 的生命周期包含以下三个阶段: - 初始化阶段(init):当 Servlet 实例化后,Web 容器会调用其 init() 方法进行初始化操作。在此阶段,Servlet 可以执行一些初始化操作,例如读取配置信息、建立数据库连接等。 - 请求处理阶段(service):当客户端发来请求时,Web 容器会创建一个线程调用 Servlet 的 service() 方法处理请求。在此阶段,Servlet 可以获取请求参数、处理请求并生成响应数据。 - 销毁阶段(destroy):当 Web 应用停止或 Servlet 被卸载时,Web 容器会调用 Servlet 的 destroy() 方法进行清理工作。在此阶段,Servlet 可以释放资源、关闭数据库连接等。 ### 1.2 Servlet 的配置 在使用 Servlet 时,需要在 web.xml 文件中进行配置。以下是一个 Servlet 的基本配置: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> ``` 其中,servlet-name 表示 Servlet 的名称,servlet-class 表示 Servlet 的类名,url-pattern 表示请求的 URL 匹配规则。 ## 二、Servlet 的使用方法 ### 2.1 编写 Servlet 编写 Servlet 有两种方法:一种是继承 HttpServlet 类,另一种是实现 Servlet 接口。这里以继承 HttpServlet 类为例: ```java public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 GET 请求 PrintWriter out = resp.getWriter(); out.println(&quot;Hello, world!&quot;); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求 PrintWriter out = resp.getWriter(); out.println(&quot;Hello, world!&quot;); } } ``` 在 Servlet 中,doGet() 方法用于处理 GET 请求,doPost() 方法用于处理 POST 请求。通过调用 HttpServletResponse 对象的 getWriter() 方法可以向客户端返回响应数据。 ### 2.2 部署 Servlet 将编写好的 Servlet 部署到 Web 容器中,有两种方法:一种是将 Servlet 类打成 war 包放到 Web 容器的 webapps 目录下,另一种是通过 Eclipse 等开发工具将 Servlet 部署到 Web 容器中。部署完成后,可以通过访问 Servlet 的 URL 来测试 Servlet 是否正常工作。 ## 三、总结 本文介绍了 Servlet 的基本概念和使用方法。Servlet 是 Java Web 开发中非常重要的组件,掌握 Servlet 的使用方法对于 Java Web 开发人员来说是必不可少的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值