Web项目的WEB-INF目录使用说明

在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代码   收藏代码
  1. <link href="css/login_css.css" rel="stylesheet" type="text/css">  
  2.   
  3. <script type="text/javascript" src="js/login_js.js"></script>  
  4.   
  5. <img alt="" src="image/1.jpg">  
  6.   
  7.    

 

 

2、register.jsp页面去访问css,js和图片的时候,也是不需要添加WEB-INF目录的,也就是忽略WEB-INF目录,访问的时候和index.jsp页面所在的路径访问资源文件是一样的:

 

 

Html代码   收藏代码
  1. <link href="css/register_css.css" rel="stylesheet" type="text/css">  
  2.   
  3. <script type="text/javascript" src="js/register_js.js"></script>  
  4.   
  5. <img alt="" src="image/2.jpg">  

 

 

3、register.jsp页面去转向index.jsp页面,即注册页面有一个链接,转向到登录界面,由于index.jsp页面没有在WEB-INF下,所以可以直接访问index.jsp页面的路径,

 

 

 register.jsp:

 

 

Html代码   收藏代码
  1. <tr>  
  2.   
  3.     <td></td>  
  4.   
  5.     <td colspan="2" style="float: left; ">  
  6.   
  7.         <button type="button" >注册</button>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
  8.   
  9.         <button type="button"  onclick="goLogin()">去登录</button>  
  10.   
  11.     </td>  
  12.   
  13. </tr>  

 

 

 

在register.jsp页面中定义了一个botton,然后响应一个onclick事件,

我们在register_js.js中定义这个goRegister ()的js事件:

 

regitster_js.js:

 

 

Js代码   收藏代码
  1. function goLogin(){  
  2.   
  3.     location.href="index.jsp";  
  4.   
  5. }  

 

 

 

这样就可以访问到WebContent目录中的index.jsp页面了。

 

4、index.jsp(登录页面)有一个链接,指向register页面,如果点击链接,就跳转到register.jsp中进行注册,因为register.jsp在WEB-INF下,所以不可以直接使用a标签去访问WEB-INF路径下的文件:

 

 

Html代码   收藏代码
  1. <a href="WEB-INF/register/register.jsp">去注册</a>  

 

 

,或者js的location.href去访问:

 

Js代码   收藏代码
  1. function goRegister(){    
  2.   
  3.     location.href="WEB-INF/register/register.jsp";  
  4.   
  5. }  

 

这样两种方式都是直接请求了WEB-INF路径,都是无法跳转的。

 

我们可以建立一个action,struts的action中没有DispatcherAction,但是我们可以通过通配符来让一个action的不同方法返回不同的页面,然后我们去请求这个action中的相应方法即可由这个action从服务器端请求到WEB-INF下的页面了:

 

下面详细说明如果进行自定义的分发action来进行页面的分发:

 

DispatcherAction.java:

 

Java代码   收藏代码
  1. package com.yun.test.webinf.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4. publicclass DispatcherAction extends ActionSupport{  
  5.     public String goRegister(){  
  6.   
  7.         return"goRegister";  
  8.   
  9.     }  
  10. }  

 

 

这个action中,我们定义了一个goRegister的方法,这个方法没有任何逻辑代码,只是返回一个字符串,然后在struts.xml中我们让这个字符串指向我们要访问的WEB-INF下的register.jsp页面:

 

struts.xml:

 

Xml代码   收藏代码
  1. <action name ="dispatcher" class="com.yun.test.webinf.action.DispatcherAction" >  
  2.   
  3.     <result name ="goRegister">WEB-INF/register/register.jsp</result >  
  4.   
  5.     <result name ="input">/index.jsp</result >  
  6.   
  7. </action >  

  

 

然后我们可以在页面中进行请求DispatcherAction的goRegister方法,然后这个action的goRegister方法就会把页面转向到WEB-INF下的register.jsp页面了:

我们在index.jsp中定义了一个botton,然后给这个botton注册一个点击事件:

 

 

index.jsp:

 

 

 

Html代码   收藏代码
  1. <tr>  
  2.   
  3.     <td></td>  
  4.   
  5.     <td colspan="2" style="float: left; ">  
  6.   
  7.         <button onclick="checkValues()">登录</button>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
  8.   
  9.         <button type="button" id="button1" onclick="goRegister()">去注册</button>  
  10.   
  11.     </td>  
  12.   
  13. </tr>  
  14.   
  15.    

 

 

在index_js.js中定义这个点击事件为location.href到定义的action的goRegister.action方法中:

login_js.js:

 

 

Js代码   收藏代码
  1. function goRegister(){  
  2.   
  3.     location.href="dispatcher!goRegister.action";  
  4.   
  5. }  

 

 

当然,也可以直接在页面中使用a标签来请求这个action的goRegister方法:

 

 

Html代码   收藏代码
  1. <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路径,如:

 

 

 

Html代码   收藏代码
  1. <frameset cols="30%,70%">  
  2.   
  3.     <frame src="main/main1.jsp">  
  4.   
  5.     <frame src="main/main1.jsp">  
  6.   
  7. </frameset>  

 

 

这样还是不能访问,也必须使用服务端的action分发的方式进行指定jsp文件的路径。

 

 

代码如下:

 

main.jsp:

 

 

 

Html代码   收藏代码
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.   
  3.     pageEncoding="UTF-8"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8. <title>main</title>  
  9. </head>  
  10. <frameset cols="30%,70%">  
  11.   
  12.     <frame src="dispatcher!goMain1.action">  
  13.   
  14.     <frame src="dispatcher!goMain2.action">  
  15.   
  16. </frameset>  
  17. </html>  

 

 

struts.xml:

 

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!DOCTYPE struts PUBLIC  
  4.   
  5.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  6.   
  7.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  8.   
  9.       
  10.   
  11. <struts >  
  12.   
  13.     <package name ="test" extends ="struts-default" >  
  14.   
  15.         <action name ="dispatcher" class ="com.yun.test.webinf.action.DispatcherAction" >  
  16.   
  17.             <result name ="goRegister">WEB-INF/register/register.jsp</result >  
  18.   
  19.             <result name ="goMain1">WEB-INF/main/main1.jsp</result >  
  20.   
  21.             <result name ="goMain2">WEB-INF/main/main2.jsp</result >  
  22.   
  23.             <result name ="input">/index.jsp</result >  
  24.   
  25.         </action >  
  26.   
  27.         <action name ="login" class ="com.yun.test.webinf.action.LoginAction" >  
  28.   
  29.             <result name ="success">WEB-INF/main.jsp</result >  
  30.   
  31.             <result name ="input">/index.jsp</result >  
  32.   
  33.         </action >  
  34.   
  35.         <action name ="register" class ="com.yun.test.webinf.action.RegisterAction" >  
  36.   
  37.             <result name ="success">WEB-INF/main.jsp</result >  
  38.   
  39.             <result name ="input">WEB-INF/register/register.jsp</result >  
  40.   
  41.         </action >  
  42.   </package>  
  43. <!-- 定义struts标签为无默认样式 -->  
  44.   
  45.     <constant name="struts.ui.theme" value="simple" />  
  46.   
  47. </struts>  
  48.   
  49.    

 

 

DispatcherAction.java:

 

 

Java代码   收藏代码
  1. package com.yun.test.webinf.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. publicclass DispatcherAction extends ActionSupport{  
  6.     public String goRegister(){  
  7.         return"goRegister";  
  8.   
  9.     }  
  10.   
  11.     public String goMain1(){  
  12.         return"goMain1";  
  13.     }  
  14.   
  15.     public String goMain2(){  
  16.   
  17.         return"goMain2";  
  18.   
  19.     }  
  20. }  

 

 

这样,这个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:

 

 

 

Html代码   收藏代码
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.   
  3.     pageEncoding="UTF-8"%>  
  4.   
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  6.   
  7. <html>  
  8.   
  9. <head>  
  10.   
  11. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  12.   
  13. <title>register</title>  
  14.   
  15. <link href="css/register_css.css" rel="stylesheet" type="text/css">  
  16.   
  17. <script type="text/javascript" src="js/register_js.js"></script>  
  18.   
  19. </head>  
  20.   
  21. <body>  
  22.     <div id="content" >  
  23.   
  24.     <form action="register.action" id="registerForm"  method="post">  
  25.         <table>  
  26.   
  27.             <tr>  
  28.   
  29.                 <td width="150px;" style="text-align:center; ">注册名</td>  
  30.   
  31.                 <td width="80px;" style="text-align: left;"><input type="text" name="user.username"  id="username" ></td>  
  32.   
  33.                 <td width="400px;" style="text-align: left;"><font color="red">* 请输入用户名</font></td>  
  34.   
  35.             </tr>  
  36.   
  37.             <tr>  
  38.   
  39.                 <td width="100px;" style="text-align:center; ">注册密码</td>  
  40.   
  41.                 <td width="80px;" style="text-align: left;"><input type="password" name="user.password" size="22" id="password"></td>  
  42.   
  43.                 <td width="400px;" style="text-align: left;"><font color="red">* 请输入密码</font></td>  
  44.   
  45.             </tr>  
  46.   
  47.             <tr>  
  48.   
  49.                 <td></td>  
  50.   
  51.                 <td colspan="2" style="float: left; ">  
  52.   
  53.                     <button type="button"  onclick="checkValues()">注册</button>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
  54.   
  55.                     <button type="button"  onclick="goLogin()">去登录</button>  
  56.   
  57.                 </td>  
  58.   
  59.             </tr>  
  60.   
  61.         </table>  
  62.   
  63.    
  64.   
  65.      </form>  
  66.   
  67.     </div>  
  68.   
  69.     <img alt="" src="image/2.jpg">  
  70.   
  71. </body>  
  72.   
  73. </html>  
  74.   
  75.    

 

struts.xml:

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!DOCTYPE struts PUBLIC  
  4.   
  5.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  6.   
  7.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  8. <struts >  
  9.   
  10.     <package name ="test" extends ="struts-default" >  
  11.   
  12.         <action name ="dispatcher" class ="com.yun.test.webinf.action.DispatcherAction" >  
  13.   
  14.             <result name ="goRegister">WEB-INF/register/register.jsp</result >  
  15.   
  16.             <result name ="goMain1">WEB-INF/main/main1.jsp</result >  
  17.   
  18.             <result name ="goMain2">WEB-INF/main/main2.jsp</result >  
  19.   
  20.             <result name ="input">/index.jsp</result >  
  21.   
  22.         </action >  
  23.   
  24.         <action name ="login" class ="com.yun.test.webinf.action.LoginAction" >  
  25.   
  26.             <result name ="success">WEB-INF/main.jsp</result >  
  27.   
  28.             <result name ="input">/index.jsp</result >  
  29.   
  30.         </action >  
  31.   
  32.         <action name ="register" class ="com.yun.test.webinf.action.RegisterAction" >  
  33.   
  34.             <result name ="success">WEB-INF/main.jsp</result >  
  35.   
  36.            <result name ="input">WEB-INF/register/register.jsp</result >  
  37.   
  38.         </action >  
  39.   
  40.    
  41.   
  42.     </package>  
  43.   
  44.    
  45.   
  46.     <!-- 定义struts标签为无默认样式 -->  
  47.   
  48.     <constant name="struts.ui.theme" value="simple" />  
  49.   
  50. </struts>  
  51.   
  52.    

 

RegisterAction.java:

 

 

 

Java代码   收藏代码
  1. package com.yun.test.webinf.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4.   
  5. import com.yun.test.webinf.entity.User;  
  6. public class RegisterAction extends ActionSupport{  
  7.          private User user;  
  8.          public void setUser(User user) {  
  9.                    this.user = user;  
  10.   
  11.          }  
  12.   
  13.          public User getUser() {  
  14.                    return user;  
  15.   
  16.          }  
  17.   
  18.          @Override  
  19.   
  20.          public String execute() throws Exception {  
  21.   
  22.                    if("lisi".equals(user.getUsername())&&"lisi".equals(user.getPassword())){  
  23.   
  24.                             return SUCCESS;  
  25.   
  26.                    }  
  27.   
  28.                    return INPUT;  
  29.   
  30.          }  
  31.   
  32.            
  33.   
  34. }  

 

 

 

 

接下来对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文件中配置

 

Xml代码   收藏代码
  1. <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文件中配置        

 

Xml代码   收藏代码
  1. <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目录中的文件的,如果符合要求的情况下也可以使用,如:

 

Html代码   收藏代码
  1. <jsp:forward page = "/WEB-INF/jsp/test/test.jsp" />  
  2.   
  3. <a href="javascript:<jsp:forward page='WEB-INF/xxxx.jsp'/>"></a>  
  4.   
  5. <jsp:include page="WEB-INF/xxx.jsp">  

 

 

都是可以访问WEB-INF下的jsp文件的。但是局限性很大,还是建议使用action分发的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值