论坛首页 Java企业应用论坛

破解JDeveloper 10g使用ADF框架时jsp/jspx文件可视化编辑器丢失所见即所得功能的难题

浏览 3434 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-06  

用JDev进行JSF开发的朋友可能都遇到过这样一个问题:原来可以正常使用的所见即所得的jspx/jsp编辑器突然不再工作,显示了一张当前页面的元素树的列表,就象下面的这样:

 

怎么回事呢?这还得从JDEV 10g对编辑页面的渲染说起。根据我从网上查到的资料来看,JDEV渲染JSF页面时,由于某些原因并不直接解析jsp/jspx页面源码,而是通过一个内置的web环境来动态执行和显示的,即JDEV全读取web.xml、faces-config.xml等配置文件,并根据这些配置文件中的信息来渲染页面内容并显示在编辑器内。

换句话说,导致上述问题的原因是修改了项目的web.xml或faces-config.xml,在里面添加了部分内容,从而导致JDEV无法正常渲染页面。

 但有些内容是必须添加的,如进行权限判断的filter。怎么办?在开发过程中把添加的内容屏蔽掉是一个办法,但在程序发布的时候还得恢复。有没有其它的办法呢?当然有!

根据JDEV页面渲染的原理,我们可以在添加的filter、JSF listener等程序中对运行环境进行判断。如果当前是真正的web运行,就正常执行,否则就实现短路。怎么进行运行环境判断呢?参考从网上找到的信息,可以通过HttpServletRequest的getServerPort方法。在真正的web环境中,这个方法返回的值肯定大于0(TCP/IP的端口是从1到65535的),而在模拟环境中这个值应该是-1,即小于0。下面以一个Filter为例子:

java 代码
  1. import javax.servlet.Filter;   
  2. import javax.servlet.FilterConfig;   
  3. import javax.servlet.ServletException;   
  4. import javax.servlet.ServletRequest;   
  5. import javax.servlet.ServletResponse;   
  6. import javax.servlet.FilterChain;   
  7.   
  8. import java.io.IOException;   
  9.   
  10. import javax.servlet.http.HttpServletRequest;   
  11. import javax.servlet.http.HttpSession;   
  12. import javax.servlet.http.HttpServletResponse;   
  13.   
  14. import org.apache.log4j.Logger;   
  15.   
  16. public class SecurityFilter implements Filter {   
  17.   
  18.   
  19.     private Logger logger = Logger.getLogger(this.getClass());   
  20.     public void init(FilterConfig filterConfig) throws ServletException {   
  21.         logger.info("SecurityFilter initialized");   
  22.     }   
  23.   
  24.     public void doFilter(ServletRequest request, ServletResponse response,    
  25.                          FilterChain chain) throws IOException,    
  26.                                                    ServletException {   
  27.         /*  
  28.          *   
  29.          * Due to Oracle JDev 10.1.3.x's limitation, we must test the environment that   
  30.          * filter runs in. Otherwise,JDeveloper: ADF Faces Editor Shows in Outline View, not WYSIWYG  
  31.          * See also below page for more information:  
  32.          * http://www.orablogs.com/fnimphius/archives/001822.html  
  33.          * http://forums.oracle.com/forums/thread.jspa?messageID=1752303?  
  34.          *   
  35.          * @date 2007-06-06  
  36.          */  
  37.   
  38.         if (request.getServerPort() < 0)    
  39.         {   
  40.           chain.doFilter(request, response);   
  41.           return;   
  42.         }   
  43.   
  44.         HttpServletRequest req = (HttpServletRequest)request;   
  45.         HttpServletResponse res = (HttpServletResponse)response;   
  46.         HttpSession session = req.getSession(true);   
  47.            
  48.         String contextpath = req.getContextPath();   
  49.         String http = req.getRequestURI();   
  50.         String id = (String)session.getAttribute("loginId");   
  51.         if (http.equals(contextpath + "/faces/login.jspx")) {   
  52.             chain.doFilter(request, response);   
  53.         } else if ((id == null || "".equals(id)) && (http.endsWith(".jspx"))) {   
  54.             res.sendRedirect(contextpath + "/faces/login.jspx");   
  55.         } else {   
  56.             chain.doFilter(request, response);   
  57.         }   
  58.     }   
  59.   
  60.     public void destroy() {   
  61.         logger.info("SecurityFilter destroied");   
  62.     }   
  63.   
  64. }   
  65.   

对于JSF的Listener,根据实际情况的不同,需要将上面的逻辑添加到beforePhase或afterPhase方法中。

另外,如果是因修改web.xml引起,还得注意加入的元素在web.xml中的位置,比如加入了一个新的Filter,那么这个与这个Filter对应的filter-mapping定义应在adfFilter的定义下面。举例如下:

 

 

相信通过这个办法能够解决JDEVELOPER 10G在编辑JSP/JSPX页面方面的所见即所得功能缺失的问题。还要说明的是,ORACLE公司JDEVELOPER开发团队已经注意到这个问题,并许诺在下个主要版本即11G中予以解决。

参考:http://www.orablogs.com/fnimphius/archives/001822.html

  • 大小: 23.2 KB
  • 大小: 63.5 KB
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics