专栏首页技术进阶之路JSP 页面中的 路径问题

JSP 页面中的 路径问题

一、关于 jsp 中的超链接路径问题

我们假设你的项目路径也就是 web应用程序的根目录为 /webapp

<a href="/webapp/login.jsp"></a>
<a href="login.jsp"></a>

上面两种写法是相同的,都是指向 webapp 应用程序下的 login.jsp 页面。

  • 如果以"/"开头,代表相对于web服务器的根目录
  • 如果不以"/"开头,代表相对于webapp 应用程序的根目录

我们知道,web服务器可以包含多个 web应用程序,而/代表服务器的根目录,也就是Tomcat 的根目录,加上webapp就是告诉它我要访问的是哪一个应用程序,如果不加就默认是当前的应用程序。

二、关于 jsp 中请求路径的问题

一般我们会在 jsp 页面中放一个 form 表单,这样当我们启动项目的时候请求可以直接跳转到指定的请求路径上面去,这里的规则和超链接一样,只不过要重点注意 Servlet 的路径

例如:

如果你的 jsp 页面直接在项目的根目录下的话,表单跳转如下:

<form action="customer.do" method="post">
    <table border="1">
        <tr>
            <td>客户姓名</td>
            <td><input type="text" name="name"></td>
        </tr>
        <tr>
            <td>邮箱地址</td>
            <td><input type="text" name="email"></td>
        </tr>
        <tr>
            <td>联系电话</td>
            <td><input type="text" name="phone"></td>
        </tr>
        <tr>
            <td><input type="submit" value="提交"></td>
            <td><input type="reset" value="重置"></td>
        </tr>
    </table>
</form>

对用的 Servlet 接口:

@WebServlet(urlPatterns = "/customer.do")
public class Servlet01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String email = request.getParameter("email");
        String phone = request.getParameter("phone");
        Customer customer = new Customer(name, email, phone);
        HttpSession session = request.getSession();
        synchronized (session) {
            session.setAttribute("customer", customer);
        }
        request.getRequestDispatcher("/demo/displayCustomer.jsp").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

但是如果你的项目结构是这样的:

也就是说 jsp 文件在项目的根目录下的一个包下。

<form action="customer.do" method="post">
    <table border="1">
        <tr>
            <td>客户姓名</td>
            <td><input type="text" name="name"></td>
        </tr>
        <tr>
            <td>邮箱地址</td>
            <td><input type="text" name="email"></td>
        </tr>
        <tr>
            <td>联系电话</td>
            <td><input type="text" name="phone"></td>
        </tr>
        <tr>
            <td><input type="submit" value="提交"></td>
            <td><input type="reset" value="重置"></td>
        </tr>
    </table>
</form>

对应的 Servlet 接口:

@WebServlet(urlPatterns = "/demo/customer.do")
public class Servlet01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String email = request.getParameter("email");
        String phone = request.getParameter("phone");
        Customer customer = new Customer(name, email, phone);
        HttpSession session = request.getSession();
        synchronized (session) {
            session.setAttribute("customer", customer);
        }
        request.getRequestDispatcher("/demo/displayCustomer.jsp").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

三、总结

需要填写路径的地方有四处:

  1. 链接地址: <a href=" "></a>
  2. 表单地址: <form action=" ">
  3. 重定向地址: response.sendRedirect(" ");
  4. 转发地址:request.getRequestDispatcher(" ");

相对路径:

  • 不以/开头

绝对路径:

  • /开头

两种都可以,相对路径是相对于当前项目所在的目录,如果是 Servlet 的话就是相对于 @WebServlet(urlPatterns = "/demo/customer")这里的地址。


随便拿一个 JSP 和 Servlet 举例子:

  • jsp 页面中的 form 表单的 action 指向直接写:servlet.do
  • Servlet 的 urlPatterns 的值必须是对应的 jsp 页面相对于应用根目录的绝对路径,也就是要加上 jsp 页面所在的包名,如:/demo/servlet.do
  • 注意这里不用管 Servlet 在那个包下,只需要弄清楚发请求的 jsp 在哪个包下。
  • 然后如果 Servlet 中有重定向或者转发都是根据请求发来的路径决定的,也就是相对于请求的路径(即 urlPatterns 中的发来的请求的 jsp 页面的路径),而不是相对于 Servlet 的存放路径。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据库原理02——关系数据库

    外码: 设 F 是基本关系 R 的一个或一组属性,但不是关系 R 的码。如果 F 与基本关系 S 的主码 Ks 相对应,则称 F 是 R 的外码(外键):

    wsuo
  • Servlet 3.0 文件上传与下载

    主要是用到了客户端 HTML 页面的表单元素,使用<form> 标签的 enctype 属性,并设置它的值为 multipart/formdata,意思是:多部...

    wsuo
  • Ubuntu19.10 编译运行C语言程序

    -o是确定输出文件的名称,第一个 Hello 为输出文件名称,可自定义。 -lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找.

    wsuo
  • 使用session的带验证码的登陆练习

    1、图片验证码是防止暴力破解机制。计算机目前还是很难识别图形的。但是人眼却可以轻松的认出来! 2、rand.Next(1000,10000)左闭右开的区间

    静心物语313
  • httperf 一个高性能的压力测试工具

    Written by bixuan on 2008年06月26号 – 22:14

    一见
  • Dubbo官方的Starter发布1.0.0测试版,与Spring Boot的结合将更加自然

    公告 今天小马哥非常高兴地向各位小伙伴宣布,官方 Dubbo Spring Boot Starter 1.0.0 公测版已开发完毕,即将发布至 Maven 公有...

    程序猿DD
  • iOS AutoLayout全解

    AutoLayout简介 Autolayout是一种全新的布局技术,专门用来布局UI界面的,用来取代Frame布局在遇见屏幕尺寸多重多样的问题。Autolayo...

    xiangzhihong
  • object __new__函数

    用户1733462
  • 【ssm个人博客项目实战09】写博客与自定义监听器1、2、3、

    前面我们已经完成了博客的分页显示模糊查询删除等功能,现在我们就讲一下如何实现写博客与修改博客的功能。

    yukong
  • <Solidity学习系列三>安全考量

    本文英文版原地址:http://solidity-cn.readthedoc... 因为本人英语能力有限,使用谷歌翻译,本篇好多地方不通顺。有能力的可以直接看英...

    用户3539187

扫码关注云+社区

领取腾讯云代金券