发表用户:讨论贴
收集整理:James.Liu
相关讨论:http://www.mygis.com.cn/forum/dispbbs.asp?boardID=11&ID=6622
信息原始来源:James MapInfo技术论坛

文章标题:IntraServletContainerRenderer组件该如何使用?

chenyu2004

小弟最近在做一个webgis方面的项目,结构:瘦客户端/胖服务器,使用MapXtreme for java地图组件,在服务器响应客户端的请求并返回图像时使用IntraServletContainerRenderer返回。返回代码如下:

    private void responseimg(MapJ mymap,  HttpServletRequest request,HttpServletResponse response) {
      ServletContext mxtServletContext = getServletConfig().getServletContext().getContext("/mapxtreme47/servlet/mapxtreme");

        if (null == mxtServletContext) {
          // 采取适当的错误处理步骤
        }
        try {
          IntraServletContainerRenderer isRenderer =
              new IntraServletContainerRenderer(mxtServletContext, "mapxtreme", request,
                                               response);
          ImageRequestComposer imageRC = ImageRequestComposer.create(mymap, 256, Color.white, "image/gif");
          isRenderer.render(imageRC);

        }
        catch (Exception e) {

        }

    }

上面的代码中在运行时mxtServletContext得到的值总是空又不知道该如何采取错误处理步骤,是不是由于ServletContext mxtServletContext = getServletConfig().getServletContext().getContext("/mapxtreme47/servlet/mapxtreme");这个语句的参数不对?我的mapxtremeurl定义为“http://sztx10:8088/mapxtreme47/servlet/mapxtreme”哪位朋友做过此方面的工作或的建议请帮帮小弟。谢了先! 

fireline99

我也想用这个方法,不过没成功要修改TOMCAT的配置文件。这是因为TOMCAT设置了服务的保护,不允许应用之间的调用,要修改一个参数的。

chenyu2004

我已经改过了<Context?crossContext="true"?....</Context>把crossContext改为true就可以了,但是还是不行主要是IntraServletContainerRenderer构造函数中的前二个参数的确切意义不是很明白,哪位朋友能给举个例子?

chenyu2004

IntraServletContainerRenderer。这一特性为将栅格图像返回到客户机提供了一种可选途
径。这一渲染器在渲染器和MapXtremeServlet 之间不需要套接字连接,但是这对于
MapXtremeImageRenderer 而言却是不可或缺的。
这一部署选项的优点在于栅格图像可以直接发送到客户机。MapXtremeServlet 不需要将图
像写入到中间层,然后再令中间层将其重写回客户机。但是其限制是应用程序必须部署在
和MapXtremeServlet 相同的容器之中。

上面这段话是资料中的原句。采用它的好处就是“栅格图像可以直接发送到客户机”,如果我理解正确的话。所以小弟想使用MapXtremeImageRenderer 这个组件。请大伙帮帮我!!

chenyu2004

最近上网找了找相关资料,代码和我的基本一样,就是说代码中的参数因该没有什么问题,关键还是crossContext的设置,但小弟已经把MapXtreme中带的TomCat中的server.xml文件的这个参数改为true了,为什么没有起作用呢,请版主观注、请大家帮忙!

songqian

注意在server.xml里加上 <Context path="/myMap" docBase="myMap" debug="0"
                 reloadable="true" crossContext="true">
   </Context>
其中path是自己的工程而不是mapxtreme47,应该是好用的。希望你也能解决该问题 

chenyu2004

我的工程的目录结构是
F:\newdirectory\newcnccgis\cnccgis\--------bak
                                                  |-----classes
                                                  |-----src------Mapservice.java
                                                  |-----TomCat
                                                  |-----webgis------images
                                                                  |-----maps
                                                                  |-----scripts
                                                                  |-----WEB_INF
                                                                  |-----map.jsp
                                                                  |-----layer.jsp
请问path该怎么写。现在我的server.xml中是这样配的。
<Context path="/webgis" docBase="webgis" debug="0"  reloadable="true" crossContext="true">
......
</Context> 

songqian

还不好用嘛?path就是你要放到tomcat/webapps下的工程名或者是.war名。看来你的工程应该是webgis了,那你的path应该是对的。把你的webgis工程考到mapxtreme自带的tomcat/webapps下,然后修改此tomcat的server.xml文件。我就是这样做的,好用。

James.Liu

MapXtremeImageRenderer 用得比较多,其实和IntraServletContainerRenderer要获得的效果是相同的,只是具体实现的技术细节不同而已,前者用得多,后者用得比较少,主要是 Servlet Container有一定的限制。

下面MapInfo提供的代码中有每个参数的解释

/* Assumptions:
The variable mapj is of type MapJ and has loaded a map.
The variable req is of type HttpServletRequest.
The variable res is of type HttpServletResponse.
// Retrieve the current servlet's ServletConfig object
ServletConfig thisServletConfig = getServletConfig();
// Retrieve the current servlet's ServletContext object from the
//thisServletConfig object
ServletContext thisServletContext =
thisServletConfig.getServletContext();
/* NOTE: Retrieve the MapXtremeServlet's ServletContext object from
the thisServletContext object. The value of getContext is dependent on
how you deploy the MapXtremeServlet in your servlet container, and is
the URI of the MapXtremeServlet. To access the MapXtremeServlet in this
deployment you would use http://stockholm:8080/mapxtreme47/mapxtreme.
ServletContext mxtServletContext = thisServletContext.getContext(
"/mapxtreme47/mapxtreme");

// Check to make sure the mxtServletContext is not null
// (This may be null due to servlet container security)
if(null == mxtServletContext)
{
// Take appropriate error handling steps
}
// Create the IntraServletContainerRenderer
try
{
/* NOTE: The argument of "mapxtreme" on the next line is the name of
the MapXtremeServlet, as defined by the deployment of the servlet
*/
IntraServletContainerRenderer isRenderer = new
IntraServletContainerRenderer(mxtServletContext, "mapxtreme", req,
res);
// Create the ImageRequestComposer
ImageRequestComposer imageRC = new ImageRequestComposer(
mapj, 256, Color.blue, "image/gif");
// Render the image
isRenderer.render(reqEnv);
}
catch(Exception e)
{
// Take appropriate error handling steps

chenyu2004

谢谢songqian、版主、谢谢大家,终于搞定了,虽然速度和使用MapXtremeImageRenderer没有什么变化,但是你们帮助了我

fireline99

我也实验成功了,谢谢!
不过速度还是没有得到提高