基于 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 格式表述如下: