系统的代码目录结构及add.jsp代码如图所示:
图二 系统的代码目录结构及add.jsp代码
${pageContext.request.contextPath}用于解决使用相对路径时出现的问题,它的作用是取出所部署项目的名字。
对于图片文件,如图二所示“ p a g e C o n t e x t . r e q u e s t . c o n t e x t P a t h / b o o k c o v e r / 101. j p g ” 使 用 的 是 绝 对 路 径 , {pageContext.request.contextPath}/bookcover/101.jpg”使用的是绝对路径, 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属性也常常会使用
p
a
g
e
C
o
n
t
e
x
t
.
r
e
q
u
e
s
t
.
c
o
n
t
e
x
t
P
a
t
h
来
表
示
请
求
路
径
。
如
图
二
中
【
没
有
使
用
框
架
】
的
f
o
r
m
表
单
的
a
c
t
i
o
n
属
性
为
:
a
c
t
i
o
n
=
"
{pageContext.request.contextPath}来表示请求路径。如图二中【没有使用框架】的form表单的action属性为:action="
pageContext.request.contextPath来表示请求路径。如图二中【没有使用框架】的form表单的action属性为:action="{pageContext.request.contextPath
}/servlet/addBookServlet"。要理解这个请求地址,必须先了解web.xml【注意:web.xml必须放在WEB-INF文件夹下,原因见博客:http://blog.youkuaiyun.com/sun9528/article/details/72423112】的写法:
①完全匹配:以“/”开头,以字母(非“”)结束
如:上面提到的本项目中:/servlet/addBookServlet
②目录匹配:以“/”开头且以“/”结尾
如:/test/
/
③扩展名匹配:以“.”开头,以扩展名结束
如:.do
④“/”用来表明对应的Servlet为应用默认的Servlet。在这种情况下Servlet路径是请求的URI去掉上下文路径并且路径信息为null。
本项目中“商品添加”功能的web.xml配置如下:
<servlet>
<servlet-name>AddBookServlet</servlet-name>
<servlet-class>com.itheima.web.servlet.AddBookServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddBookServlet</servlet-name>
<url-pattern>/servlet/addBookServlet</url-pattern>
</servlet-mapping>
当点击了页面提交表单的命令之后,一个请求发送到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。然后由动作类在进行一些后台操作。