Web项目的WEB-INF目录使用说明以及重定向与转发
写这篇文章的原因是看到了Tomcat下面的Webapps下面的,就想看一下。
总结一下这篇文章的内容:
WEB-INF下面的内容都是只能由服务器级别才能访问,客户端并不能访问。什么是客户端级别?什么是服务器级别呢?
转发就是服务器级别,浏览器的地址不会变,因为,客户端发送一个请求,服务器受理之后,发现要请求内容还要再去别的请求,那么转发就是服务器自己去处理完成。不麻烦客户端(浏览器)了,所以客户端上面的地址栏不会改变。
重定向:就是客户端级别的。服务器收到请求后,发现还要去请求别的内容,但是服务器自己不想处理,那么就告诉客户端,你自己去处理吧,那么客户端就去请求那个别的内容了。所以客户端(浏览器)地址栏就会改变了。
------------------------------------------------------------------------------------------------------------------------------------------------------
以下的内容来自:博客转载自:http://ykyfendou.iteye.com/blog/2094317
在web项目中,为了安全,可能需要把jsp文件放在WEB-INF目录下,这样如果我们的页面中出现超链接a标签或者js的location.href去直接转向到WEB-INF下的某一个jsp页面,那么就会引用不到,因为这样的请求方式是客户端的请求,而WEB-INF页面只对服务端开放,对客户端是不可见的。这时候我们可以使用action,来进行转向,我们先去请求一个action,然后由这个action分发到这个WEB-INF下的页面就可以了。我们可以自己定义一个类似struts1的DispatcherAction的一个action来分发页面。
由于WEB-INF下对客户端是不可见的,所以相关的资源文件,如css,javascript和图片等资源文件不能放在WEB-INF下,那么如何从WEB-INF下引用非WEB-INF下的文件,以及js,html的frame的框架如何去访问WEB-INF下的jsp呢?
下面对WEB-INF目录的一些问题进行详细说明:
以一个项目为例:
如下这样一个代码目录:我们把除index.jsp外其他的jsp文件放在WEB-INF下,把css,javascript,图片放在了webRoot(WebContent)目录下,然后main.jsp是一个frame的html框架,包含了main1.jsp和main2.jsp两个文件。


1、index.jsp页面访问css,js,图片等文件的时候,自然不用说,因为它不在WEB-INF下,正常的访问即可:
Html代码:
<link href="css/login_css.css" rel="stylesheet" type="text/css"> <script type="text/javascript" src="js/login_js.js"></script> <img alt="" src="data:image/1.jpg">
2、register.jsp页面去访问css,js和图片的时候,也是不需要添加WEB-INF目录的,也就是忽略WEB-INF目录,访问的时候和index.jsp页面所在的路径访问资源文件是一样的:
Html代码:
<link href="css/register_css.css" rel="stylesheet" type="text/css"> <script type="text/javascript" src="js/register_js.js"></script> <img alt="" src="data:image/2.jpg">
3、register.jsp页面去转向index.jsp页面,即注册页面有一个链接,转向到登录界面,由于index.jsp页面没有在WEB-INF下,所以可以直接访问index.jsp页面的路径,
register.jsp:
html代码:
<tr>
<td></td>
<td colspan="2" style="float: left; ">
<button type="button" >注册</button>
<button type="button" onclick="goLogin()">去登录</button>
</td>
</tr>
在register.jsp页面中定义了一个botton,然后响应一个onclick事件,
我们在register_js.js中定义这个goRegister ()的js事件:
regitster_js.js:
js代码:
function goLogin(){
location.href="index.jsp";
}
这样就可以访问到WebContent目录中的index.jsp页面了。
4、index.jsp(登录页面)有一个链接,指向register页面,如果点击链接,就跳转到register.jsp中进行注册,因为register.jsp在WEB-INF下,所以不可以直接使用a标签去访问WEB-INF路径下的文件:
Html代码:
<a href="WEB-INF/register/register.jsp">去注册</a>
,或者js的location.href去访问:
js代码:
function goRegister(){
location.href="WEB-INF/register/register.jsp";
}
这样两种方式都是直接请求了WEB-INF路径,都是无法跳转的。
我们可以建立一个action,struts的action中没有DispatcherAction,但是我们可以通过通配符来让一个action的不同方法返回不同的页面,然后我们去请求这个action中的相应方法即可由这个action从服务器端请求到WEB-INF下的页面了:
下面详细说明如果进行自定义的分发action来进行页面的分发:
DispatcherAction.java:
package com.yun.test.webinf.action; import com.opensymphony.xwork2.ActionSupport;
publicclass DispatcherAction extends ActionSupport{
public String goRegister(){ return"goRegister"; }
}
这个action中,我们定义了一个goRegister的方法,这个方法没有任何逻辑代码,只是返回一个字符串,然后在struts.xml中我们让这个字符串指向我们要访问的WEB-INF下的register.jsp页面:
struts.xml:
<action name ="dispatcher" class="com.yun.test.webinf.action.DispatcherAction" >
<result name ="goRegister">WEB-INF/register/register.jsp</result >
<result name ="input">/index.jsp</result >
</action >
然后我们可以在页面中进行请求DispatcherAction的goRegister方法,然后这个action的goRegister方法就会把页面转向到WEB-INF下的register.jsp页面了:
我们在index.jsp中定义了一个botton,然后给这个botton注册一个点击事件:
index.jsp:
Html代码:
<tr>
<td></td>
<td colspan="2" style="float: left; ">
<button onclick="checkValues()">登录</button>
<button type="button" id="button1" onclick="goRegister()">去注册</button>
</td>
</tr>
在index_js.js中定义这个点击事件为location.href到定义的action的goRegister.action方法中:
login_js.js:
JS代码:
function goRegister(){
location.href="dispatcher!goRegister.action";
}
当然,也可以直接在页面中使用a标签来请求这个action的goRegister方法:
<a href="dispatcher!goRegister.action">去注册</a>
这样我们就可以通过action的转发,成功的请求道WEB-INF下的jsp文件了。
注意请求action的方式,dispatcher!goRegister.action 这个!是一个分发字符,!之前的部分是action的名字,!之后的部分是这个action的某个我们要请求的方法的名字。然后这个action中必须要定义一个同名的方法,就不需要使用execute方法了。然后这个同名方法,返回的是一个String字符串,这个字符串在struts.xml中指向为我们想要跳转的路径。这就是一个请求分发的action。
我们还可以自己定义分发的分隔符,可以是下划线等,分发action详见Struts2实现分发的action一节
5、jsp页面中的frame框架中想把多个WEB-INF下的页面设置为框架的内容的时候,即使main.jsp和main1.jsp,main2.jsp同在WEB-INF目录下,也不可以直接去指定WEB-INF路径,如:
<frameset cols="30%,70%">
<frame src="main/main1.jsp">
<frame src="main/main1.jsp">
</frameset>
这样还是不能访问,也必须使用服务端的action分发的方式进行指定jsp文件的路径。
代码如下:
main.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>main</title>
</head>
<frameset cols="30%,70%">
<frame src="dispatcher!goMain1.action">
<frame src="dispatcher!goMain2.action">
</frameset>
</html>
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 ="test" extends ="struts-default" >
<action name ="dispatcher" class ="com.yun.test.webinf.action.DispatcherAction" >
<result name ="goRegister">WEB-INF/register/register.jsp</result >
<result name ="goMain1">WEB-INF/main/main1.jsp</result >
<result name ="goMain2">WEB-INF/main/main2.jsp</result >
<result name ="input">/index.jsp</result >
</action >
<action name ="login" class ="com.yun.test.webinf.action.LoginAction" >
<result name ="success">WEB-INF/main.jsp</result >
<result name ="input">/index.jsp</result >
</action >
<action name ="register" class ="com.yun.test.webinf.action.RegisterAction" >
<result name ="success">WEB-INF/main.jsp</result >
<result name ="input">WEB-INF/register/register.jsp</result >
</action >
</package>
<!-- 定义struts标签为无默认样式 -->
<constant name="struts.ui.theme" value="simple" />
</struts>
DispatcherAction.java:
package com.yun.test.webinf.action;
import com.opensymphony.xwork2.ActionSupport;
publicclass DispatcherAction extends ActionSupport{
public String goRegister(){
return"goRegister";
}
public String goMain1(){
return"goMain1";
}
public String goMain2(){
return"goMain2";
}
}
这样,这个main页面就可以通过action分发使用frame框架了。
6、同在WEB-INF目录下的register.jsp和main.jsp中怎么跳转呢?我们会在register.jsp中提交表单,然后在action中进行处理,如果注册成功,会跳转到main页面,这时的跳转也会涉及到WEB-INF目录,因为目标路径main.jsp也在WEB-INF下,所以我们在跳转的时候也必须写上WEB-INF的目录路径才可以,而且必须是请求分发,而不能是redirct的方式。
如代码:
register.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>register</title>
<link href="css/register_css.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="js/register_js.js"></script>
</head>
<body>
<div id="content" >
<form action="register.action" id="registerForm" method="post">
<table>
<tr>
<td width="150px;" style="text-align:center; ">注册名</td>
<td width="80px;" style="text-align: left;"><input type="text" name="user.username" id="username" ></td>
<td width="400px;" style="text-align: left;"><font color="red">* 请输入用户名</font></td>
</tr>
<tr>
<td width="100px;" style="text-align:center; ">注册密码</td>
<td width="80px;" style="text-align: left;"><input type="password" name="user.password" size="22" id="password"></td>
<td width="400px;" style="text-align: left;"><font color="red">* 请输入密码</font></td>
</tr>
<tr>
<td></td>
<td colspan="2" style="float: left; ">
<button type="button" onclick="checkValues()">注册</button>
<button type="button" onclick="goLogin()">去登录</button>
</td>
</tr>
</table>
</form>
</div>
<img alt="" src="data:image/2.jpg">
</body>
</html>
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 ="test" extends ="struts-default" >
<action name ="dispatcher" class ="com.yun.test.webinf.action.DispatcherAction" >
<result name ="goRegister">WEB-INF/register/register.jsp</result >
<result name ="goMain1">WEB-INF/main/main1.jsp</result >
<result name ="goMain2">WEB-INF/main/main2.jsp</result >
<result name ="input">/index.jsp</result >
</action >
<action name ="login" class ="com.yun.test.webinf.action.LoginAction" >
<result name ="success">WEB-INF/main.jsp</result >
<result name ="input">/index.jsp</result >
</action >
<action name ="register" class ="com.yun.test.webinf.action.RegisterAction" >
<result name ="success">WEB-INF/main.jsp</result >
<result name ="input">WEB-INF/register/register.jsp</result >
</action >
</package>
<!-- 定义struts标签为无默认样式 -->
<constant name="struts.ui.theme" value="simple" />
</struts>
RegisterAction.java:
package com.yun.test.webinf.action; import com.opensymphony.xwork2.ActionSupport; import com.yun.test.webinf.entity.User;
public class RegisterAction extends ActionSupport{
private User user;
public void setUser(User user) {
this.user = user; } public User getUser() {
return user; } @Override public String execute() throws Exception { if("lisi".equals(user.getUsername())&&"lisi".equals(user.getPassword())){ return SUCCESS; } return INPUT; } }
接下来对WEB-INF页面中的注意事项进行说明:
1. 把页面资源文件只能放在WebContent目录内,,如 CSS,JS,image等.不能放在WEB-INF下,因为WEB-INF是对客户端隐藏的,所以放在WEB-INF下会造成页面的布局等文件引用不到的情况。
2. 页面文件一般放在WEB-INF目录下面,这样可以限制访问,提高安全性.如JSP,html文件,放在WEB-INF目录下就可以避免客户端直接在地址栏上输入路径进行访问了。基于不同的功能 ,把JSP 放置在WEB-INF下的不同的目录中。
3. 只能用转向方式来访问WEB-INF目录下的JSP,不用采用重定向的方式请求该目录里面的任何资源。
4.转向方式:
4.1、请求转发:
如struts.xml文件中配置
<result name ="goMain2">WEB-INF/main/main2.jsp</result >
或在Action中写
request.getRequestDispatcher("/WEB-INF/main/main2.jsp").forward(request, response);
的方式都是服务器读取了该页面内容,并发送到客户端的,客户端的地址不变,然后内容跳转了。这样的方式是可以访问到WEB-INF目录下的jsp文件的。
4.2、重定向方式:
如struts.xml文件中配置
<result name ="goMain2" type="redirect">WEB-INF/main/main2.jsp</result >
或在action中
response.sendRedirect("WEB-INF/main/main2.jsp ");
都属于重定向的方式,重定向的含义就是服务器把地址发给客户端,让客户端去访问,这样还是在客户端访问的WEB-INF目录,所以是无法访问到WEB-INF目录下的jsp文件的。
5、有一些标签,也是可以访问到WEB-INF目录中的文件的,如果符合要求的情况下也可以使用,如:
<jsp:forward page = "/WEB-INF/jsp/test/test.jsp" /> <a href="javascript:<jsp:forward page='WEB-INF/xxxx.jsp'/>"></a> <jsp:include page="WEB-INF/xxx.jsp">
都是可以访问WEB-INF下的jsp文件的。但是局限性很大,还是建议使用action分发的方式。
Web项目的WEB-INF目录使用说明以及重定向与转发的更多相关文章
- Visual Studio中用于ASP.NET Web项目的Web服务器
当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Expr ...
- 转:Web项目的WEB-INF目录使用说明以及重定向与转发
原文地址:https://www.cnblogs.com/shenxiaoquan/p/5819359.html 原文内容: 总结一下这篇文章的内容: WEB-INF下面的内容都是只能由服务器级别才能 ...
- 使用 java替换web项目的web.xml
创建一个接口: package my.web; public interface SpringWeb { void config(); } 实现类: package my; import my.web ...
- Idea创建Maven Web项目的web.xml版本问题
问题描述:创建Maven Web项目时,选择MavenWebapp模板时,自动生成的web.xml文件版本为1.4,如图所示 如何才能修改为常用的4.0版本的xml文件呢? 这个文件是从Maven仓库 ...
- maven web项目的web.xml报错The markup in the document following the root element must be well-formed.
maven项目里面的web.xml开头约束是这样的 <?xml version="1.0" encoding="UTF-8"?> <web-a ...
- 如何修改MyEclipse项目的web context-root
修改一个MyEclipse项目的名称很容易,右键点项目->rename就行了. 但此时项目的web context-root 还没有改变,需要右键点项目->properties->M ...
- Eclipse 启动Tomcat后web项目的classes的子文件夹中没有calss文件
Eclipse 启动Tomcat后web项目的classes的子文件夹中没有calss文件. 经网上查得以下方法可解决 把properties属性里的java compiler-->buildi ...
- 一个电商项目的Web服务化改造
一个电商项目的Web服务化改造 项目,早期是随便瞎做的,没啥架构,连基本的设计也没. 有需求,实现需求,再反复修改. 大致就是这么做的. 最近,项目要重新架构,和某boss协商的结果是,采用阿里开源的 ...
- eclipse 使用tomcat运行JavaWeb项目,文件修改后为何不用重启tomcat? (运行web项目的4种方式)探究
1.情景说明 在eclipse中,为什么Java文件修改后,重启tomcat class文件才能生效? 为什么jsp修改后,不需重启tomcat就能立即生效? 为什么静 ...
随机推荐
- vscode - 移动端适配(cssrem)
建议使用Chrome浏览器. 1.第一步,安装扩展以及配置 2.第二步,使用(记得按一下↓)
- windows下flv视频网站进度条随意拖放[转]
网站中视频都转换成flv格式,奈何flv格式无法拖拽,此问题纠结了好久,最终得以解决.现将解决思路记录下来,大多数源于网上找到的. 视频拖拽满足要求 1.播放器要支持 2.flv视频要有关键帧和met ...
- TP 查询语句中如何使用 FIND_IN_SET 这样的查询方法
TP 查询语句中如何使用 FIND_IN_SET 这样的查询方法 $condition['_string'] = 'FIND_IN_SET('.$citys.',city)';
- Android Studio优秀插件汇总
- 升级Eclipse出错的解决办法“Updating Software” has encountered a problem: An error occurred while uninstalling
运行 eclipse 把 eclipse exe 修改为 eclipse.exe.back 再运行 updates 升级成功
- 【BIRT】报表显示不全
使用BIRT开发了一张报表,预期效果如下 但是开发完成后预览效果如下: 最后的合计竟然没有了,那么怎么处理呢 鼠标点击Layout窗口空白部分,找到布局,切换为自动布局,如下图所示:
- Android 自己定义View (四) 视频音量调控
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24529807 今天没事逛eoe,看见有人求助要做一个以下的效果,我看以下一哥们说 ...
- Git-学习笔记(常用命令集合)
这里引用一下百度百科里Git的内容: Git --- The stupid content tracker, 傻瓜内容跟踪器.Linus Torvalds 是这样给我们介绍 Git 的. Git 是用 ...
- 用bcdedit.exe重建bcd
使用下面方法之前需要bcdedit.exe和bootsect.exe两个文件,bootsect.exe文件在vista和windows 7的安装光盘的boot目录下,而bcdedit.exe文件可以在 ...
- Python title() 方法
描述 Python title() 方法返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写. 语法 title() 方法语法: S.title() 参数 无. ...