绝对路径${pageContext.request.contextPath}用法及其与web.xml中Servlet的url-pattern匹配过程

以系统的一个“添加商品”的功能为例加以说明,系统页面为add.jsp,如图一所示:


图一  添加商品界面

系统的代码目录结构及add.jsp代码如图二所示:


图二   系统的代码目录结构及add.jsp代码

${pageContext.request.contextPath}用于解决使用相对路径时出现的问题,它的作用是取出所部署项目的名字。

对于图片文件,如图二所示${pageContext.request.contextPath}/bookcover/101.jpg”使用的是绝对路径,${pageContext.request.contextPath}返回的是”/test”【注意:很多地方写的返回值是test/”,这是不对的】,拼接之后路径就变成:“/test/bookcover/101.jpg”。如果使用相对路径则为:“../../bookcover/101.jpg”(相对于add.jsp页面)。其他的CSS文件、Js文件、Jsp文件与图片文件相似,使用方法一样。

JavaWeb项目中,Jsp页面的form表单的action属性也常常会使用${pageContext.request.contextPath}来表示请求路径。如图二中【没有使用框架】的form表单的action属性为:action="${pageContext.request.contextPath }/servlet/addBookServlet"。要理解这个请求地址,必须先了解web.xml【注意:web.xml必须放在WEB-INF文件夹下,原因见博客:http://blog.csdn.net/sun9528/article/details/72423112】的写法:

①完全匹配:以“/”开头,以字母(非“*”)结束

   如:上面提到的本项目中:<url-pattern>/servlet/addBookServlet</url-pattern>

②目录匹配:以“/”开头且以“/*”结尾

   如:<url-pattern>/test/*</url-pattern>

   <url-pattern>/*</url-pattern>

③扩展名匹配:以“*.”开头,以扩展名结束

   如:<url-pattern>*.do</url-pattern>

④“/”用来表明对应的Servlet为应用默认的Servlet。在这种情况下Servlet路径是请求的URI去掉上下文路径并且路径信息为null

本项目中“商品添加”功能的web.xml配置如下:

[html]  view plain  copy
  1. <span style="font-size:18px;">  <servlet>  
  2.         <servlet-name>AddBookServlet</servlet-name>  
  3.         <servlet-class>com.itheima.web.servlet.AddBookServlet</servlet-class>  
  4.   </servlet>  
  5.     
  6.   <servlet-mapping>  
  7.         <servlet-name>AddBookServlet</servlet-name>  
  8.         <url-pattern>/servlet/addBookServlet</url-pattern>  
  9.   </servlet-mapping></span>  

当点击了页面提交表单的命令之后,一个请求发送到servlet容器,servlet容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url。访问的是http://localhost:8080/test/servlet/addBookServlet,我的应用上下文是test,容器会将http://localhost:8080/test去掉,剩下的/servlet/addBookServlet部分拿来做servlet的映射匹配。很明显可以通过图三的形式在web.xml中找到请求的动作类(url-pattern--->servlet-name--->servlet-class)。动作类为:com.itheima.web.servlet.AddBookServlet。然后由动作类在进行一些后台操作。


图三 url-pattern--->servlet-name--->servlet-class

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,在web.xml配置文件定义Servlet: ``` <servlet> <servlet-name>CustomerServlet</servlet-name> <servlet-class>com.example.CustomerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CustomerServlet</servlet-name> <url-pattern>/customer</url-pattern> </servlet-mapping> ``` 然后编写CustomerServlet类来处理请求和响应: ```java package com.example; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CustomerServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取客户信息 String name = request.getParameter("name"); String email = request.getParameter("email"); String phone = request.getParameter("phone"); // 设置属性 request.setAttribute("name", name); request.setAttribute("email", email); request.setAttribute("phone", phone); // 转发到diaplay.jsp页面 request.getRequestDispatcher("/display.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ``` 最后,在input.JSP页面添加表单: ```html <form action="${pageContext.request.contextPath}/customer" method="get"> <label for="name">Name:</label> <input type="text" id="name" name="name"><br> <label for="email">Email:</label> <input type="email" id="email" name="email"><br> <label for="phone">Phone:</label> <input type="text" id="phone" name="phone"><br><br> <input type="submit" value="Submit"> </form> ``` 这样,当用户提交表单时,Servlet会获取用户输入的信息并将其转发到diaplay.jsp页面,同时将信息存储在request对象以便在diaplay.jsp页面显示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值