当我刚开始学 struts2
框架时,我们在学校是有这个课的,我们用的教材是 《轻量级JavaEE 企业应用实战》
,这是 李刚 编写的疯狂系列中一本,这本书很厚,我们老师也差不多是讲这上面的内容。当我照着书上的教程学时,遇到了一个问题,就是我访问不了 WEB-INF 下面的 jsp页面
一般来说,如果不用 struts2 框架的话,本身是访问不了
WEB-INF
下面的所有的内容的,因为这个文件下面一般存放的是一些配置文件和一些库文件
,而这些文件是不能让用户直接访问到的。
但是如果你使用了 struts2
框架的话,是可以将 jsp页面
存放在 WEB-INF
这个目录下面的(struts 官方还推荐将页面放置于这个目录下面)。下面是我 struts.xml
配置文件中的代码:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default" namespace="/">
<action name="*">
<result name="success">/WEB-INF/{1}.jsp</result>
</action>
</package>
</struts>
下面上一张我的目录结构图:
大家可以看到我在
WEB-INF
的目录下面放了三个jsp文件,在WebContent
的直接子目录下也放了同样的三个文件(这三个文件与WEB-INF
同级),但是其中的内容不同,以便我们到时知道自己访问的是哪一个文件。
- 现在如果我在
WEB-INF
下的jsp 页面右键单击run as
的话,那么出来的页面是404页面
,显示这个页面是没有找到的。而且大家可以看到下面图中红线部分,这就是我们这个 jsp页面的访问路径。
- 而如果我们右键点击运行与
WEB-INF
同级的jsp页面,那么可以得到页面,如下图,可以看到图中红色部分的访问地址。
那么通过以上我们首先可以得出我们项目中的jsp页面在本地访问的地址是怎样的
http://localhost:8080/ + 项目名称 + jsp页面在WebContent 路径(不包括WebContent)
。
再看一下我们在 struts.xml
中的配置:
<action name="*">
<result name="success">/WEB-INF/pages/loginForm.jsp</result>
</action>
之前我理解的是
<action name="*">
可以拦截到所有的请求,从而跳转到/WEB-INF/pages/loginForm.jsp
, 通过实践才知道在web.xml
中的
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
以上才能拦截到所有的请求,然后拦截到所有请求以后,就交给一系列的拦截器开始处理,而<action name="*">
能拦截的只是以.action
结尾的jsp页面,比如 loginForm.action
页面,也能拦截到表单中action="loginForm"
,所以我猜测是不是表单就是以 XXX.action
的方式被提交给后台的。
但是如果你把浏览器中的地址改为 http://localhost:8080/login2/WEB-INF/pages/loginForm.action
那么你还是不能访问到 WEB-INF
下的页面,这是因为用户访问不了 WEB-INF
下的页面,但是我们如果在浏览器中随便输入,比如 http://localhost:8080/login2/XXX/loginForm.action
,那么我们就可以访问到 WEB-INF
下的页面了,可以看出在程序内部对http://localhost:8080/login2/WEB-INF/
这个目录进行了处理,如果用户的路径包含的话,就直接跳转到 404.
以下是其中的一些知识点:
1.web.xml
当程序启动时,会自动读取其中的配置。
2.WEB-INF
下存放的是 一些配置文件和一些库文件(包)。
3.struts.xml
是struts框架
的核心配置文件,可以在其中配置一些拦截器等。
4.用户是不能直接访问WEB-INF
下的文件的。
5.用户可以通过配置 action
来让框架将 WEB-INF
的页面显示出来。