基于 iPortal 开发新的资源是指开发一个独立于 iPortal 现有资源的新资源。本案例中将演示如何开发一个新闻资源(/iportal/helloworld/news),所使用的示范代码位于:%SuperMap iPortal_HOME%\samples\code\CustomPortal\Custom_Portal。

在开发新的资源前,请搭建好 iPortal 定制开发环境

第一步:打开示范代码工程中 Custom_Portal\WebContent\WEB-INF\iportaldata\iportal.db 数据库文件,新建 news_info 表,并将新闻资源的信息存入该表中 ,表中字段如下:

字段 类型

id

INTEGER

newsTitle

TEXT

addUser

TEXT

addTime

INTEGER

modifyUser

TEXT

modifyTime

TEXT

content

TEXT

commentInfo

TEXT

newsIcon

TEXT

第二步: 添加并实现 DAO 层接口。示例中 NewsInfoDao.java(位于 src > com.supermap.iportal.web.custom.dao 包下)是 DAO 层定义,NewsInfoDaoImpl.java(位于 src > com.supermap.iportal.web.custom.dao.impl 包下)是 DAO 接口的具体实现。由于示例工程中使用的是 sqlite 数据库,在 src > com.supermap.iportal.web.database.sqlite 包中添加了 DAO 接口对应的 Mapper 映射文件,如果您使用的不是 sqlite 数据库,则需要增加对应数据库的包(如 MySQL 数据库的对应包名为 com.supermap.iportal.web.database.mysql ) 并新建对应的 Mapper 文件。示例中通过 DAO 层实现了对数据库的查询,获取新闻信息。

第三步:打开 IportalServletHandler.java 文件(位于 src > com.supermap.server.host.webapp.handlers 包下面),IportalServletHandler 是路由过滤器,代码结构如下所示:

/**

 * helloworld 资源

 *

 */

@Override

public void handle(HttpServletRequest req,HttpServletResponse  res) throws ServletException, IOException{

   String path = getPathInfo(req);

   if(path.startsWith("/helloworld")){

       WebAppRequestDispatcher dispatcher = new WebAppRequestDispatcher("/helloworld",  this.iportalServlet);

       dispatcher.forward(req,res);

    }else{

       return;

    }

  this.setHandleFinished(req);

}

这里把定制新资源的根入口路径设置为“/helloworld”,根入口路径用户可以根据自己的需求设置为需要的路径名称,

第四步:打开 IportalHelloWorldResource.Java 文件(位于  src > com.supermap.iportal.web.custom.rest.resource.impl 包下面),该文件是定制新资源的根入口,当发送 http://localhost:8091/iportal/helloworld 请求时会进入到 IportalHelloWorldResource.Java 入口资源中,代码结构如下所示:

@Path("/")

public class IportalHelloWorldResource extends IportalPagesJaxrsResourceBase{

    public IportalHelloWorldResource(@Context ServletConfig servletConfig) {

        super(servletConfig);

    }

    public IportalHelloWorldResource(){

    }

/**

 * news 资源

 * @return

 */

@Path("/news")

public IportalNewsResource getIportalCustomResource(){

return new IportalNewsResource();

}

}

其中,”/news”指向的资源为新的子资源 IportalNewsResource,当发送 http://localhost:8091/iportal/helloworld/news 请求时会指定到资源 IportalNewsResource 中,默认执行的 GET 请求指定到 IportalNewsResource 资源中的该资源,IportalNewsResource.java 代码结构如下:

/**

*    新闻 资源

 *

 */

public class IportalNewsResource extends IportalPagesJaxrsResourceBase {

NewsInfoComponent newsInfoComponent = (NewsInfoComponent) beanFactory.getBean("newsInfoComponent");

/**

 * 新闻模块信息

 * @param request

 * @return

 */

@GET

@Template(name = "newsInfo.ftl")

public NewsInfo getResource(@Context HttpServletRequest request) {

NewsInfo newsInfo = new NewsInfo();

int id=1;

newsInfo = newsInfoComponent.getNewsInfo(id);

if (newsInfo == null) {

throw new HttpException(Status.CLIENT_ERROR_NOT_FOUND, "id 为 1 的新闻数据没有查到");

}

return newsInfo;

}

}

其中粗体代码的解释如下:

@GET:定义请求方式为 GET 请求,支持 HTML、json、rjson 等格式的表述。

@Template(name = "newsInfo.ftl"):定义模板文件为 newInfo.ftl,该模板文件位于 Custom_Portal\WebContent\WEB-INF\classes\templates 路径下,模板文件示例如下:

<!DOCTYPE html>

<html>

    <head>

        <#include "iportalCommonMeta_zh_CN.ftl">

        <title></title>

        <#include "iportalCommonLink_zh_CN.ftl">

    </head>

    <body>

        <#include "iportalHeader_zh_CN.ftl">

        <div class="container">

        <div class="menu">

        测试新闻

        <div class="text_menu">${resource.content.newsTitle}</div>

</div>

        </div>

        <#include "iportalFooter_zh_CN.ftl">

        <script type="text/javascript" src="${simpleRootPath}/static/jquery/jquery-1.10.2.min.js" ></script>

        <script type="text/javascript" src="${simpleRootPath}/static/bootstrap/js/bootstrap.min.js" ></script>

        <script type="text/javascript" src="${simpleRootPath}/static/js/underscore-min.1.4.4.js"></script>

        <script type="text/javascript" src="${simpleRootPath}/static/js/backbone-min.js"></script>

        <script type="text/javascript" src="${simpleRootPath}/static/js/iportalHeader.js"></script>

    </body>

</html>

访问 localhost:8091/iportal/helloworld/news.json,返回的 json 格式表述如下: