zoukankan      html  css  js  c++  java
  • 解决jsp访问jsp与Servlet访问jsp路径存在的差异性比较

    在开发JSP与Struts时会遇到:
    
    解决jsp访问路径与Servlet访问路径不比配问题:
    
    第一种解决方法:
    
    例子: xx.jsp 该jsp存在于WEB的目录为:/admin/login.jsp 此jsp中的使用的图片路径为: ../image/bg.gif ../css/css.css 以上为正常写法,当然如果你的WEB项目下只有.jsp没有Servlet或是Action之类的Servlet是不会有问题的。
    
    但问题就出现在此项目中有了Servlet,例如Struts的Action. 如现Servlet时,通过某jsp跳到某jsp还可以,但当通过jsp访问到servlet,在通过servlet访问某它jsp时。会出现图片和样式都找不到了。
    
    问题出现了,当通过.jsp访问另一个jsp时,他们的相对路径是相同的所以他们访问服务器资源的../image/bg.gif都是可用的, 但是当通过Servlet访问.jsp时的相对路径是image/bg.gif。
    
    这说明Servlet的相对路径就是你WEB项目的根路径。而jsp的相对路径,就是你访问的那个.jsp的当前路径,而不是根。
    
    所以解决办法是这样的所项目中所有的访问到资源的地方都改成:
    
    1、 修改后的写法: image/bg.gif css/css.css
    
    (修改后只有通过Servlet也就Action访问某jsp时,该jsp显示正常,而通过jsp访问其它jsp则会显示不正常,上面说了这是因为他们的相对路径不同)
    
    但修改后不是所有的jsp都是通过Servlet进去的。所以问题又出现了。hehe.^_^
    
    所以可以使用这种方式: 2、
    
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath();//注意这里这里是获取服务路径 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";//然后在加上端口 %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head>     <base href="<%=basePath%>"><!-- 然后把路径放到base 标签中,看到了吧,给我感觉不只java其它的语言也应该有此问题吧? hehe -->     <title>My JSP 'MyJsp.jsp' starting page</title> </head> <body> </body> </html>
    
    按照以上的做法,把所有jsp前面+上<%=basePath%> 这样就可以保证每个jsp的相对路径是根了。这样就和Servlet一致了。
    
     
    
     
    
    第二种解决方法:
    
    具体就不详细举例了: 大体思路: 1、写一个Servlet,该Servlet主要就起到导航做用.例如: public final class LinksAction extends HttpServlet {
    
    public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{    //注意这里使用的是request.getParameter("urlName")而不是request.getAttribute("urlName")    try{     if(isJsp(request.getParameter("link"))){      //System.out.println(request.getParameter("link"));      request.getRequestDispatcher(request.getParameter("link")).forward(request,response);     }else{      System.out.println("您好1");      request.getRequestDispatcher("/index.jsp").forward(request,response);      }    }catch(Exception e){     e.printStackTrace();    } } /* *该方法为了防止前get方法接收一个其它uri的地址, *判断里面是否包含有.jsp的字符串。 */ public boolean isJsp(String uri){    if(uri.indexOf(".jsp")>0){     return true;    }else{     return false;    }  } } 2、配置该Servlet <servlet> <servlet-name>link_action</servlet-name> <servlet-class>com.javass.service.LinksAction</servlet-class> </servlet> <servlet-mapping> <servlet-name>link_action</servlet-name> <url-pattern>/forword.jsp</url-pattern> </servlet-mapping> 3、使用该Servlet(不过这样有点大了,hehe,我最早先就这样用.还把.Servlet映射了.jsp的后缀hehe,很想很搞啊.) <a href="forword.jsp?link=<bean:message key='links5'/>" target="right"><bean:message key='public.static.page.addSupplier'/></a>
    
    大家都知道把jsp放到WEB-INF/下面这样对.jsp的代码是安全的。(但同样问题是在WEB-INF/下的.jsp访问其它.jsp是无法访问的,只有通过Servlet才能进到WEB-INF下) 所以通过以上方法,可以有效的访问WEB-INF/下的jsp.
    
     
    
    第三种解决方法:
    
    1、把所有jsp都放在WEB-INF下面。    但WEB-INF下是不可以直接访问其它的jsp,
    
    2、在WEB-INF/下的.jsp访问其它.jsp是无法访问的,所以需要通过Servlet才能进到WEB-INF下。    在这里我们使用一个Action代替.. Action: public class IndexAction extends BaseAction { public ActionForward execute(ActionMapping mapping,     ActionForm actionForm, HttpServletRequest request,     HttpServletResponse httpServletResponse) {     return mapping.findForward(str); } }
    
    3、在Struts-Config.xml中配置forward <!--业务员功能 --> <!--业务员功能**************************************个人资料管理**************************************-->
        <forward name="vendition/vendition_manage/vendition_update"     path="/WEB-INF/WBE-
    
    JSP/vendition/vendition_manage/vendition_update.jsp" />     <forward name="vendition/vendition_manage/vendition_manage"     path="/WEB-INF/WBE-
    
    JSP/vendition/vendition_manage/vendition_manage.jsp" />     <forward name="vendition/vendition_manage/vendition_update_pass"    path="/WEB-INF/WBE-JSP/vendition/vendition_manage/vendition_update_pass.jsp"
    
    /> <!--业务员功能**************************************客户跟踪服务**************************************-->
        <forward name="vendition/client_manage/client_add"     path="/WEB-INF/WBE-JSP/vendition/client_manage/client_add.jsp" />     <forward name="vendition/client_manage/client_manage"    path="/WEB-INF/WBE-JSP/vendition/client_manage/client_manage.jsp" />     <forward name="vendition/client_manage/client_update"    path="/WEB-INF/WBE-JSP/vendition/client_manage/client_update.jsp" />     <forward name="vendition/client_manage/client_show"    path="/WEB-INF/WBE-JSP/vendition/client_manage/client_show.jsp" />     <forward name="vendition/client_manage/search_client"    path="/WEB-INF/WBE-JSP/vendition/client_manage/search_client.jsp" />     <forward name="vendition/client_manage/insurance_client" path="/WEB-INF/WBE-JSP/vendition/client_manage/search_insurance_client.jsp" />   
    
    4、在外部使用 <a href="index.do?action=vendition/vendition_manage/vendition_manage" target="main" >个人资料管理</a>
    
    转自:http://hi.baidu.com/53665366/item/494d244f8201f7eda4c06679
    
  • 相关阅读:
    修改oracle用户密码永不过期
    mysql中的union操作(整理)
    mysql条件查询and or使用实例及优先级介绍
    vue实现购物清单列表添加删除
    vue实现全选框效果
    vue实现穿梭框效果
    legend3---13、vue是真的好用
    黑马在线教育项目---34-37、webuploader实现用户头像的异步上传
    lareval重命名created_at和updated_at字段
    js的dom操作(整理)(转)
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/3072863.html
Copyright © 2011-2022 走看看