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

  • Post author:
  • Post category:其他


在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. <


    script


    type

    =

    “text/javascript”


    src

    =

    “js/login_js.js”


    >


    </


    script


    >




  3. <


    img


    alt

    =

    “”


    src

    =

    “image/1.jpg”


    >



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. <


    script


    type

    =

    “text/javascript”


    src

    =

    “js/register_js.js”


    >


    </


    script


    >




  3. <


    img


    alt

    =

    “”


    src

    =

    “image/2.jpg”


    >

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


register.jsp:

Html代码

收藏代码



  1. <


    tr


    >




  2. <


    td


    >


    </


    td


    >




  3. <


    td


    colspan

    =

    “2”


    style

    =

    “float: left; ”


    >




  4. <


    button


    type

    =

    “button”


    >

    注册

    </


    button


    >

    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



  5. <


    button


    type

    =

    “button”


    onclick

    =

    “goLogin()”


    >

    去登录

    </


    button


    >




  6. </


    td


    >




  7. </


    tr


    >

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

我们在register_js.js中定义这个

goRegister

()的js事件:


regitster_js.js:

Js代码

收藏代码



  1. function

    goLogin(){


  2. location.href=

    “index.jsp”

    ;


  3. }

这样就可以访问到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. location.href=

    “WEB-INF/register/register.jsp”

    ;


  3. }

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

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

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


DispatcherAction.java:

Java代码

收藏代码



  1. package

    com.yun.test.webinf.action;



  2. import

    com.opensymphony.xwork2.ActionSupport;

  3. publicclass DispatcherAction

    extends

    ActionSupport{


  4. public

    String goRegister(){



  5. return


    “goRegister”

    ;


  6. }

  7. }

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


struts.xml:

Xml代码

收藏代码



  1. <


    action


    name

    =

    “dispatcher”


    class

    =

    “com.yun.test.webinf.action.DispatcherAction”


    >




  2. <


    result


    name

    =

    “goRegister”


    >

    WEB-INF/register/register.jsp

    </


    result


    >




  3. <


    result


    name

    =

    “input”


    >

    /index.jsp

    </


    result


    >




  4. </


    action


    >

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

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


index.jsp:

Html代码

收藏代码



  1. <


    tr


    >




  2. <


    td


    >


    </


    td


    >




  3. <


    td


    colspan

    =

    “2”


    style

    =

    “float: left; ”


    >




  4. <


    button


    onclick

    =

    “checkValues()”


    >

    登录

    </


    button


    >

    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



  5. <


    button


    type

    =

    “button”


    id

    =

    “button1”


    onclick

    =

    “goRegister()”


    >

    去注册

    </


    button


    >




  6. </


    td


    >




  7. </


    tr


    >



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


login_js.js:

Js代码

收藏代码



  1. function

    goRegister(){


  2. location.href=

    “dispatcher!goRegister.action”

    ;


  3. }

当然,也可以直接在页面中使用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. <


    frame


    src

    =

    “main/main1.jsp”


    >




  3. <


    frame


    src

    =

    “main/main1.jsp”


    >




  4. </


    frameset


    >

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

代码如下:


main.jsp:

Html代码

收藏代码



  1. <

    %@ page

    language

    =

    “java”


    contentType

    =

    “text/html; charset=UTF-8”




  2. pageEncoding

    =

    “UTF-8”

    %

    >


  3. <!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”

    >



  4. <


    html


    >



  5. <


    head


    >



  6. <


    meta


    http-equiv

    =

    “Content-Type”


    content

    =

    “text/html; charset=UTF-8”


    >



  7. <


    title


    >

    main

    </


    title


    >



  8. </


    head


    >



  9. <


    frameset


    cols

    =

    “30%,70%”


    >




  10. <


    frame


    src

    =

    “dispatcher!goMain1.action”


    >




  11. <


    frame


    src

    =

    “dispatcher!goMain2.action”


    >




  12. </


    frameset


    >



  13. </


    html


    >


struts.xml:

Xml代码

收藏代码



  1. <?


    xml


    version

    =

    “1.0”


    encoding

    =

    “UTF-8”


    ?>



  2. <!DOCTYPE struts PUBLIC


  3. “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”


  4. “http://struts.apache.org/dtds/struts-2.0.dtd”

    >






  5. <


    struts


    >




  6. <


    package


    name

    =

    “test”


    extends

    =

    “struts-default”


    >




  7. <


    action


    name

    =

    “dispatcher”


    class

    =

    “com.yun.test.webinf.action.DispatcherAction”


    >




  8. <


    result


    name

    =

    “goRegister”


    >

    WEB-INF/register/register.jsp

    </


    result


    >




  9. <


    result


    name

    =

    “goMain1”


    >

    WEB-INF/main/main1.jsp

    </


    result


    >




  10. <


    result


    name

    =

    “goMain2”


    >

    WEB-INF/main/main2.jsp

    </


    result


    >




  11. <


    result


    name

    =

    “input”


    >

    /index.jsp

    </


    result


    >




  12. </


    action


    >




  13. <


    action


    name

    =

    “login”


    class

    =

    “com.yun.test.webinf.action.LoginAction”


    >




  14. <


    result


    name

    =

    “success”


    >

    WEB-INF/main.jsp

    </


    result


    >




  15. <


    result


    name

    =

    “input”


    >

    /index.jsp

    </


    result


    >




  16. </


    action


    >




  17. <


    action


    name

    =

    “register”


    class

    =

    “com.yun.test.webinf.action.RegisterAction”


    >




  18. <


    result


    name

    =

    “success”


    >

    WEB-INF/main.jsp

    </


    result


    >




  19. <


    result


    name

    =

    “input”


    >

    WEB-INF/register/register.jsp

    </


    result


    >




  20. </


    action


    >



  21. </


    package


    >



  22. <!– 定义struts标签为无默认样式 –>




  23. <


    constant


    name

    =

    “struts.ui.theme”


    value

    =

    “simple”


    />




  24. </


    struts


    >




DispatcherAction.java:

Java代码

收藏代码



  1. package

    com.yun.test.webinf.action;



  2. import

    com.opensymphony.xwork2.ActionSupport;


  3. publicclass DispatcherAction

    extends

    ActionSupport{


  4. public

    String goRegister(){


  5. return


    “goRegister”

    ;


  6. }



  7. public

    String goMain1(){


  8. return


    “goMain1”

    ;

  9. }



  10. public

    String goMain2(){



  11. return


    “goMain2”

    ;


  12. }

  13. }

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

    =

    “UTF-8”

    %

    >



  3. <!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”

    >




  4. <


    html


    >




  5. <


    head


    >




  6. <


    meta


    http-equiv

    =

    “Content-Type”


    content

    =

    “text/html; charset=UTF-8”


    >




  7. <


    title


    >

    register

    </


    title


    >




  8. <


    link


    href

    =

    “css/register_css.css”


    rel

    =

    “stylesheet”


    type

    =

    “text/css”


    >




  9. <


    script


    type

    =

    “text/javascript”


    src

    =

    “js/register_js.js”


    >


    </


    script


    >




  10. </


    head


    >




  11. <


    body


    >



  12. <


    div


    id

    =

    “content”


    >




  13. <


    form


    action

    =

    “register.action”


    id

    =

    “registerForm”


    method

    =

    “post”


    >



  14. <


    table


    >




  15. <


    tr


    >




  16. <


    td


    width

    =

    “150px;”


    style

    =

    “text-align:center; ”


    >

    注册名

    </


    td


    >




  17. <


    td


    width

    =

    “80px;”


    style

    =

    “text-align: left;”


    >


    <


    input


    type

    =

    “text”


    name

    =

    “user.username”


    id

    =

    “username”


    >


    </


    td


    >




  18. <


    td


    width

    =

    “400px;”


    style

    =

    “text-align: left;”


    >


    <


    font


    color

    =

    “red”


    >

    * 请输入用户名

    </


    font


    >


    </


    td


    >




  19. </


    tr


    >




  20. <


    tr


    >




  21. <


    td


    width

    =

    “100px;”


    style

    =

    “text-align:center; ”


    >

    注册密码

    </


    td


    >




  22. <


    td


    width

    =

    “80px;”


    style

    =

    “text-align: left;”


    >


    <


    input


    type

    =

    “password”


    name

    =

    “user.password”


    size

    =

    “22”


    id

    =

    “password”


    >


    </


    td


    >




  23. <


    td


    width

    =

    “400px;”


    style

    =

    “text-align: left;”


    >


    <


    font


    color

    =

    “red”


    >

    * 请输入密码

    </


    font


    >


    </


    td


    >




  24. </


    tr


    >




  25. <


    tr


    >




  26. <


    td


    >


    </


    td


    >




  27. <


    td


    colspan

    =

    “2”


    style

    =

    “float: left; ”


    >




  28. <


    button


    type

    =

    “button”


    onclick

    =

    “checkValues()”


    >

    注册

    </


    button


    >

    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



  29. <


    button


    type

    =

    “button”


    onclick

    =

    “goLogin()”


    >

    去登录

    </


    button


    >




  30. </


    td


    >




  31. </


    tr


    >




  32. </


    table


    >






  33. </


    form


    >




  34. </


    div


    >




  35. <


    img


    alt

    =

    “”


    src

    =

    “image/2.jpg”


    >




  36. </


    body


    >




  37. </


    html


    >




struts.xml:

Xml代码

收藏代码



  1. <?


    xml


    version

    =

    “1.0”


    encoding

    =

    “UTF-8”


    ?>



  2. <!DOCTYPE struts PUBLIC


  3. “-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”


  4. “http://struts.apache.org/dtds/struts-2.0.dtd”

    >



  5. <


    struts


    >




  6. <


    package


    name

    =

    “test”


    extends

    =

    “struts-default”


    >




  7. <


    action


    name

    =

    “dispatcher”


    class

    =

    “com.yun.test.webinf.action.DispatcherAction”


    >




  8. <


    result


    name

    =

    “goRegister”


    >

    WEB-INF/register/register.jsp

    </


    result


    >




  9. <


    result


    name

    =

    “goMain1”


    >

    WEB-INF/main/main1.jsp

    </


    result


    >




  10. <


    result


    name

    =

    “goMain2”


    >

    WEB-INF/main/main2.jsp

    </


    result


    >




  11. <


    result


    name

    =

    “input”


    >

    /index.jsp

    </


    result


    >




  12. </


    action


    >




  13. <


    action


    name

    =

    “login”


    class

    =

    “com.yun.test.webinf.action.LoginAction”


    >




  14. <


    result


    name

    =

    “success”


    >

    WEB-INF/main.jsp

    </


    result


    >




  15. <


    result


    name

    =

    “input”


    >

    /index.jsp

    </


    result


    >




  16. </


    action


    >




  17. <


    action


    name

    =

    “register”


    class

    =

    “com.yun.test.webinf.action.RegisterAction”


    >




  18. <


    result


    name

    =

    “success”


    >

    WEB-INF/main.jsp

    </


    result


    >




  19. <


    result


    name

    =

    “input”


    >

    WEB-INF/register/register.jsp

    </


    result


    >




  20. </


    action


    >






  21. </


    package


    >






  22. <!– 定义struts标签为无默认样式 –>




  23. <


    constant


    name

    =

    “struts.ui.theme”


    value

    =

    “simple”


    />




  24. </


    struts


    >




RegisterAction.java:

Java代码

收藏代码



  1. package

    com.yun.test.webinf.action;



  2. import

    com.opensymphony.xwork2.ActionSupport;



  3. import

    com.yun.test.webinf.entity.User;


  4. public


    class

    RegisterAction

    extends

    ActionSupport{


  5. private

    User user;


  6. public


    void

    setUser(User user) {


  7. this

    .user = user;


  8. }



  9. public

    User getUser() {


  10. return

    user;


  11. }



  12. @Override




  13. public

    String execute()

    throws

    Exception {



  14. if

    (

    “lisi”

    .equals(user.getUsername())&&

    “lisi”

    .equals(user.getPassword())){



  15. return

    SUCCESS;


  16. }



  17. return

    INPUT;


  18. }




  19. }

接下来对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. <


    a


    href

    =

    “javascript:<jsp:forward page=’WEB-INF/xxxx.jsp’/>”


    >


    </


    a


    >




  3. <


    jsp:include


    page

    =

    “WEB-INF/xxx.jsp”


    >

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