一:一般为啥要把jsp页面放在WEB-INF呐?
这样主要是为了网站的安全的角度来说的,WEB-INF是安全目录Tomcat 默认的访问路径是WebRoot下的index.jsp,放在WEB-INF下的页面一般不配置是无法访问的。
你的站点肯定有些页面是需要经过登录验证或其他验证后才能访问的啊,这些页面就放在web-inf里。
如果是能不经过验证就访问的页面,比如主页、登录页、欢迎页这种,就不要放在web-inf里
二: 下面来看如何访问Web-INF下的页面?
在创建JavaWeb工程时有个web.xml的部署描述符,在下面有个这样可以定制首页的:做如下配置来看:
一般的Web.xml中默认的
工程目录如下:
便可以访问了:
在浏览器中输入如下地址
访问访问成功后的页面:
在SpringMVC的视图解析器中也是配置的WEB-INF下的页面;
最后追加的一句:使用如下的地址也是访问不到的:
http://localhost:8080/JSTLTest/WebRoot/WEB-INF/jsp/test.jsp
来看具体的案例:SSM整合实现用户登录的例子中对WEN-INF下的页面的访问实现:开发环境MyEclipse 2016 CI 7
1:
这个是基于Maven 下的SSM亏框架的整合:实现的功能是用户登录:
来看web.xml中的写法:
来看如何访问这个小Demo:
浏览器中的地址的写法:
http://localhost:8080/TestSSM/
这样就访问成功页面了,用Maven创建项目的时候使用web-app的项目名称上会多出Maven Webapp的访问的时候不用加的,只用你项目的名称即可;
下面来看WEB-INF下的JSP页面如何实现跳转的(用a标签实现跳转)
1:一般来说将JSP页面放在Webapp下就比较容易实现了,加项目的路径就可以了或者是添加<%=basePath>绝对路径就可以了;
2:这里使用SpringMVC的控制器实现:
首先是之前的定制首页中可以用控制器实现的:
首先新建一个Controller类
@Controller
public class PageController {
//打来首页,可以取代web.中定义首页的
//这个只是一个视图,模型数据可以在形参里面来表示的
//这里是访问的根路径
@RequestMapping(value="/",method=RequestMethod.GET)
public String showLogin(){
System.out.println("进入页面控制器啦");
return "login";
}
//页面跳转的控制器
@RequestMapping("/upload")
public String showUpload(){
System.out.println("进入跳转页面控制器");
return "upload";
}
}
这个就可以不用写的:
这样部署项目启动服务器就可以访问了;
http://localhost:8080/TestSSM 就可以访问了
来看跳转的:main.jsp位于WEB-INF下,upload.jsp位于WEB-INF下
1:
2:页面控制器里面写:
@RequestMapping("/upload")
public String showUpload(){
System.out.println("进入跳转页面控制器");
return "upload";
}
之前那个视图解析器是这样配置的:
jsp中的相对路径和绝对路径
所谓相对路径,就是相对于自己的目标文件位置。例如“s1.htm” 文件里引用了“bg.jpg”图片,如果“bg.jpg”图片相对于“s1.htm”来说,是在同一个目录的,那么只要在“s1.htm”文件里使用以下代 码后,在浏览器里都能正确地显示图片。以后只要这两个文件的相对位置没有变(也就是说还是在同一个目录内),那么无论上传到Web服务器的哪个位置,都能正常显示
相对路径还可以相对服务器而言,但地址要以"/"开头
1 2 3 4 |
|
<%
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
采用绝对路径时,页面中的超链接都要加上<%=basePath%>,会显得很麻烦。
这里我们就可以直接使用相对路径(即: 相对于base标签)
${pageContext.request.contextPath} 等价于 <%=request.getContextPath()%> 或者可以说是<%=request.getContextPath()%>的EL版 意思就是取出部署的应用程序名或者是当前的项目名称。