开发Portlet第二步:如何将Crystal静态Portlet转变成基于测试数据的动态Portlet?
当基于Crystal的静态Portlet开发完成后,在与后台服务联调前,还需要将Portlet转换成基于测试数据的动态Portlet。具体步骤如下:
分步指南
- 复制Portlet项目,并修改相关的pom.xml、src/main/webapp/WEB-INF/liferay-plugin-package.xml、src/main/webapp/WEB-INF/liferay-plugin-package.properties文件中的Atifact-ID、module-id等信息,区别原静态Portlet项目,防止两个项目重复,导致不能在一个环境中运行;
- 修改src/main/webapp/WEB-INF/portlet.xml、src/main/webapp/WEB-INF/liferay-portlet.xml、/static-development-portlet/src/main/webapp/WEB-INF/liferay-display.xml中的portlet-name等信息,区别原项目的portlet-name信息,防止与原静态portlet不能在一个环境中运行;
- 修改src/main/webapp/WEB-INF/spring下****-portlet.xml文件名,保持****部分与相应portlet-name性息(去除横杠)一致;
- 查看****-portlet.xml文件中定义的包路径是否是项目所需,否则修改;
- 查看src/main/java下的包路径是否跟****-portlet.xml文件中定义的包路径一致,否则修改;
创建测试数据项目:
- 创建Java Maven项目****-service-stub,结构如下:
- 修改pom.xml文件,添加远程服务api包依赖:
- 根据api实现相关服务的实现类,但方法内部只需返回设计的测试数据即可,如下:
@Service
public class ApplicationManager implements ApplicationService {
/* (non-Javadoc)
* @see com.gsoft.portlet.uum.application.ApplicationService#list()
*/
@Override
public List<Application> list() {
List<Application> list = new ArrayList<Application>();
for(int i = 0; i < 20; i++){
Application app = new Application();
app.setId(new Long(i));
app.setName("Name " + i);
app.setCode("code " + i);
app.setUrl("http://localhsot/" + i);
app.setDisabled(i %3 == 0 ? true : false);
list.add(app);
}
return list;
}
/* (non-Javadoc)
* @see com.gsoft.portlet.uum.application.ApplicationService#getById(java.lang.Long)
*/
@Override
public Application getById(Long id) {
Application app = new Application();
app.setId(10L);
app.setName("Name 10");
app.setCode("code 10");
app.setUrl("http://localhsot/10");
return app;
}
}
修改静态Portlet项目为动态测试Portlet:
- 在Porltet项目中引入测试数据项目及远程服务接口;
修改src/main/java下相应Portlet类,调用远程api及测试数据服务,返回测试数据;
@Controller
public class ApplicationManagementPortlet extends AbstractCrystalPortlet { @Resource
private AuthSystemService authSystemService;
@RequestMapping
public String view(Model model, RenderRequest request) {
List<AuthSystemDto> result = authSystemService.finaAllAuthSystemList();
request.setAttribute("result", result);
return "view";
}
@RequestMapping(params = "action=add")
public String view4add(Model model, @Param String rediract) {
model.addAttribute("rediract", rediract);
return "add";
} @RequestMapping(params = "action=edit")
public String view4edit(Model model, @RequestParam String rediract,@RequestParam Long id) {
model.addAttribute("rediract", rediract);
AuthSystemDto authSystemDto = authSystemService.findOne(id);
model.addAttribute("system", authSystemDto);
return "add";
} @RequestMapping(params = "action=del")
public String delete(Model model, RenderRequest request, @RequestParam Long id) {
authSystemService.deleteAuthSystem(id);
return "pop_up_success";
}
@RequestMapping(params = "action=editState")
public String editState(Model model, RenderRequest request, @RequestParam Long id,@RequestParam String state) {
AuthSystemDto authSystemDto = new AuthSystemDto();
authSystemDto.setId(id);
if(StringUtils.equals(UserRepConstants.UserRepState.DISABLE, state)) {
authSystemDto.setState(UserRepConstants.UserRepState.ENABLE);
} else {
authSystemDto.setState(UserRepConstants.UserRepState.DISABLE);
}
authSystemService.updateAuthSystemState(authSystemDto );
return "pop_up_success";
} @RequestMapping(params = "action=save")
public String save(Model model, @ModelAttribute("authSystem")AuthSystemDto authSystem, @RequestParam String rediract){
if(StringUtils.isEmpty(authSystem.getState())) {
authSystem.setState("1");
}
if(authSystem.getId() == null) {
authSystemService.saveAuthSystem(authSystem);
}else {
authSystemService.updateAuthSystem(authSystem);
}
model.addAttribute("rediract", rediract);
return "pop_up_success";
} @RequestMapping(params = "action=check")
public ModelAndView checkDupCode(Model model, RenderRequest request, @RequestParam Long id,@RequestParam String code) throws JsonProcessingException {
AuthSystemDto system = new AuthSystemDto();
system.setCode(code);
system.setId(id);
Boolean exists = authSystemService.existsAuthSystemCode(system);
Map<String, Object> result = new HashMap<String, Object>();
result.put("success", Boolean.TRUE);
result.put("data", exists);
return ajax(result);
}
}- 修改src/main/webapp/WEB-INF/jsp下相关jsp文件,增加标签,获取后台portlet类返回的数据,并依据原静态HTML代码格式,动态生成相应的代码。
开发Portlet第二步:如何将Crystal静态Portlet转变成基于测试数据的动态Portlet?的更多相关文章
- 全动态Portlet点击后选中样式
1 背景概述 在配置公司云平台的帮助信息过程中,由于使用的全动态portlet的数据URL获取到的是静态数据,没有办法在后台做选中的逻辑判断,所以需要在前台来控制选中列表的样式,这里将对前台选中列表 ...
- IOS开发中制作属于自己的静态库.a、资源库.bundle、.framework
一.什么是库 库实际上是一种代码共享的方式,主要用于代码重用和源码隐藏,通常分为动态库和静态库. 静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复 ...
- 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包
前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”) ...
- [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve)
[开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve) 1.滑动平均概念 滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值看成一个队列 ,队列的长度固定为N ...
- 【JAVA】JSP+layui框架 静态表格转化成数据表格
<table lay-filter="demo" class="layui-table" id="excTable"> < ...
- Android开发之常用必备工具类图片bitmap转成字符串string与String字符串转换为bitmap图片格式
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...
- iOS开发——高级篇——换肤、静态库
一.换肤 1.思路1> 解决方案1,使用颜色作为图片素材的命名关键字 问题1:要保证每套图片的文件名 颜色+ 名称.png的格式比较麻烦 问题2:如果要将某一个图片应用到其他皮肤不方便2> ...
- 安卓开发, 遇到WebView不能加载静态网页, WebView显示 "net::ERR_PROXY_CONNECTON_FAILED"
http://blog.csdn.net/zhouchangshi/article/details/44454695 Android开发中遇到网络连接问题, 要找WebView中显示一个静态的网页, ...
- android应用开发-从设计到实现 3-4 静态原型的状态栏
静态原型的状态栏 状态栏Symbol 状态栏似乎非常复杂,有wifi信号.手机信号.时间.电量等信息,幸好Sketch原生就自带的现成组件,你能够直接拿过来就用了.当然.你也能够自己一个一个去画,只是 ...
随机推荐
- mysql-5.6.23-winx64.zip版本安装记录
*操作系统:Win7 64位旗舰版 一.解压至任意目录,此处以“E:\mysql-5.6.23-winx64”为例: 二.设置环境变量:新建变量名 MYSQL_HOME,值为解压的路径 E:\mysq ...
- ajax传值方式为数组
js: function responseJson1(){ var array=[1001,1002]; var str=""; //获取table对象 ...
- 【leetcode】Min Stack(easy)
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...
- POJ 3597 Polygon Division (DP)
题目链接 题意:把一个正多边形分成数个三角形或者四边形,问有多少种方案. 题解: 如果分出的全为三角形的话,那就是正多边形三角剖分问题.它的结果就是Catalan数.现在也可以划分出四边形的话,可以采 ...
- XLL 框架库中的函数
这个框架库,可以让编写 XLL 更加容易.包含了管理 XLOPER/XLOPER12 内存的简单函数,创建临时 XLOPER/XLOEPR12 ,强制调用回调函数 (Excel4,Excel4v,Ex ...
- 使用WKWebView替换UIWebView
开发App的过程中,常常会遇到在App内部加载网页,通常用UIWebView加载.这个自iOS2开始使用的网页加载器一直是开发的心病:加载速度慢,占用内存多,优化困难.如果加载网页多,还可能因为过量占 ...
- ERROR ITMS-90032 “Invalid image path”
在用 Application Loader上传spa 文件的时候出现这样的错误:ERROR ITMS-90032: "Invalid image path No image found at ...
- CSS伪类
CSS伪类:控制元素的某种状态 语法:元素名称:伪类名称{属性:值} CSS伪类控制链接状态 状态 语法 未访问的链接 a:link{color:#ff00ff} 已访问的链接 a:visited{c ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)(set容器里count函数以及加强for循环)
题目链接:http://codeforces.com/contest/722/problem/D 1 #include <bits/stdc++.h> #include <iostr ...
- Cannot return from outside a function or method
最近发现myeclipse10中有几处bug 比如: Cannot return from outside a function or method onClick="return chec ...