1 平台WEB服务快速发布
平台2.0提供了快速发布WEB服务的功能。通过配置界面,配置一下可以快速地将查询SQL,数据操作SQL(Insert,Update,Delete),数据库函数,Java方法发布为WEB服务。
WEB服务地址:http://localhost:8080/xip/services/platformWS?wsdl
方法:executeSQL
参数:sqlKey以此值来获取唯一一条WS配置信息。
paramListWS中的参数值以JSON串传入。
JSON格式为{‘param1′:’param1_val’,’param2′:’param2_val’}
1.1 查询SQL
1.1.1 平台中配置
其中${}括起部分为参数,在WS执行此SQL之前会用传入参数paramList中对应的参数值替换掉此部分内容。如果此参数值为字符型,需要自行添加单引号来实现。
1.1.2 调用WS示例
package com.xz.service;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
public class CXFTest {
public static void main(String[] args) {
//基于CXF调用WS测试代码
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
//WS发布地址,其中根据实际情况替换相应内容
Client client = dcf.createClient(“http://localhost:8080/xip/services/platformWS?wsdl”);
Object[] objects;
try {
//executeSQL方法的两个参数,第一个是关键码,第二个是WS所需参数的Json串
String params[] = {“GXF002”, “{’emp_name’:’高’}”};
objects = client.invoke(“executeSQL”, (Object[]) params);
System.out.println(objects[0].toString());
} catch (Exception ex) {
Logger.getLogger(CXFTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
1.2 数据操作SQL
1.2.1 平台中配置
其中${}括起部分为参数,在WS执行此SQL之前会用传入参数paramList中对应的参数值替换掉此部分内容。如果此参数值为字符型,需要自行添加单引号来实现。
数据操作中的SQL可以为Insert、Update和Delete三种
1.2.2 调用WS示例
package com.xz.service;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import java.util.UUID;
public class CXFTest {
public static void main(String[] args) {
//基于CXF调用WS测试代码
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
//WS发布地址,其中根据实际情况替换相应内容
Client client = dcf.createClient(“http://localhost:8080/xip/services/platformWS?wsdl”);
Object[] objects;
try {
//executeSQL方法的两个参数,第一个是关键码,第二个是WS所需参数的Json串
String id = UUID.randomUUID().toString();
String params[] = {“GXF004”, “{‘id’:'”+id+”‘,’code’:’编码”+id+”‘,’name’:’名称”+id+”‘}”};
objects = client.invoke(“executeSQL”, (Object[]) params);
System.out.println(objects[0].toString());
} catch (Exception ex) {
Logger.getLogger(CXFTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
1.3 数据库函数
1.3.1 平台中配置
其中${param}作为参数,需要在paramList这个参数中以Json串形式传入,如”{‘param’:’This is WS call database function Test’}”
1.3.2 调用WS示例
package com.xz.service;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
public class CXFTest {
public static void main(String[] args) {
//基于CXF调用WS测试代码
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
//WS发布地址,其中根据实际情况替换相应内容
Client client = dcf.createClient(“http://localhost:8080/xip/services/platformWS?wsdl”);
Object[] objects;
try {
//executeSQL方法的两个参数,第一个是关键码,第二个是WS所需参数的Json串
String params[] = {“GXF001”, “{‘param’:’This is WS call database function Test’}”};
objects = client.invoke(“executeSQL”, (Object[]) params);
System.out.println(objects[0].toString());
} catch (Exception ex) {
Logger.getLogger(CXFTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
1.3.3 数据库函数示例
–供WS调用函数示例
FUNCTION wstest(param VARCHAR2) RETURN VARCHAR2 IS
BEGIN
–返回值格式如下,其中flag 0表示成功,1为失败,在result下还可以加入其它内容,根据自己业务需要自己添加
RETURN ‘<result><flag>0</flag><msg>WEB服务测试函数执行成功。参数值为:’ || param || ‘</msg></result>’;
END;
1.4 Java方法
1.4.1 平台中配置
1.4.2 调用WS示例
package com.xz.service;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
public class CXFTest {
public static void main(String[] args) {
//基于CXF调用WS测试代码
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
//WS发布地址,其中根据实际情况替换相应内容
Client client = dcf.createClient(“http://localhost:8080/xip/services/platformWS?wsdl”);
Object[] objects;
try {
//executeSQL方法的两个参数,第一个是关键码,第二个是WS所需参数的Json串
String params[] = {“GXF003”, “{‘param’:’This is the demo for WS calling Java method.’}”};
objects = client.invoke(“executeSQL”, (Object[]) params);
System.out.println(objects[0].toString());
} catch (Exception ex) {
Logger.getLogger(CXFTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
1.4.3 Java方法示例
package com.xzsoft.xip.platform.conc;
publicclass ConcTest {
/**
* concTestest:(供并发调用的Java方法示例)
*
* @param name
* 传入参数name
* @parammsg
* 传入参数msg
* @return返回XML字符串
* @author GuoXiuFeng
* @versionVer 1.0
* @sinceVer 1.0
*/
public String concTest(String name, String msg) {
// 返回结果格式如下,其中flag 0表示成功,1表示失败,并发程序根据flag来标定并发是否执行成功。msg为提示信息
return“<result><flag>0</flag><msg>” + name + ” write ” + msg + “</msg></result>”;
}
/**
* wsTest:(供WS调用Java方法示例)
*
* @param param
* 传入参数
* @return返回XML字符串
* @author GuoXiuFeng
* @versionVer 1.0
* @sinceVer 1.0
*/
public String wsTest(String param) {
// 返回字符串格式如下,其中flag为0表示成功,1为失败,msg为提示信息,在result下面可以根据业务需要添加需要的返回内容。其中flag和msg是两个默认必须返回的两项。
return“<result><flag>0</flag><msg>” + param + “</msg></result>”;
}
}
2 平台二次开发
2.1 业务界面弹出功能帮助
基于Web Builder或Extjs4.1开发界面,可以通过引入/platform/util/platformUtil.js文件调用方法showFunHelpWin弹出功能帮助页面
参数
funId 功能树id
type 帮助类型 r:只读 rw:读写
title 窗口标题
2.2 自定义登录初始化接口
实现接口com.xzsoft.xip.platform.cust.PlatformCustInterface中的custLoginInit方法
示例代码
package com.xzsoft.xip.platform.cust;
import javax.servlet.ServletContextEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class PlatformCust implements PlatformCustInterface {
@Override
public void custLoginInit(HttpServletRequest request, HttpServletResponse response) {
System.out.println(“Cust login init”);
}
@Override
public void custContextInitialized(ServletContextEvent event) {
System.out.println(“Cust context initial”);
}
@Override
public void custContextDestroyed(ServletContextEvent event) {
System.out.println(“Cust context destroyed”);
}
}
配置系统参数
参数值不为空,则在登录初始化的过程中动态加载此参数配置的类,并调用custLoginInit方法。配置类如果没有实现接口PlatformCustInterface将会报错,平台将不再执行此类下的任何方法。
2.3 WEB工程启动初始化接口
实现接口com.xzsoft.xip.platform.cust.PlatformCustInterface中的custContextInitialized方法
示例代码
package com.xzsoft.xip.platform.cust;
import javax.servlet.ServletContextEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class PlatformCust implements PlatformCustInterface {
@Override
public void custLoginInit(HttpServletRequest request, HttpServletResponse response) {
System.out.println(“Cust login init”);
}
@Override
public void custContextInitialized(ServletContextEvent event) {
System.out.println(“Cust context initial”);
}
@Override
public void custContextDestroyed(ServletContextEvent event) {
System.out.println(“Cust context destroyed”);
}
}
配置系统参数
参数值不为空的时候,在WEB工程启动的时候平台会加载此参数指定的类并调用方法custContextInitialized,如果未实现接口PlatformCustInterface则不会被执行,但不影响平台正常启动。
2.4 WEB工程关闭清理接口
实现接口com.xzsoft.xip.platform.cust.PlatformCustInterface中的custContextDestroyed方法
示例代码
package com.xzsoft.xip.platform.cust;
import javax.servlet.ServletContextEvent;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class PlatformCust implements PlatformCustInterface {
@Override
public void custLoginInit(HttpServletRequest request, HttpServletResponse response) {
System.out.println(“Cust login init”);
}
@Override
public void custContextInitialized(ServletContextEvent event) {
System.out.println(“Cust context initial”);
}
@Override
public void custContextDestroyed(ServletContextEvent event) {
System.out.println(“Cust context destroyed”);
}
}
配置系统参数
参数值不为空的时候,在WEB工程关闭的时候平台会加载此参数指定的类并调用方法custContextDestroyed,如果未实现接口PlatformCustInterface则不会被执行,但不影响平台正常关闭。
2.5 平台菜单打开页面URL传入参数
userId 用户ID
roleId 角色ID
funId 功能ID
appId 应用ID
userName 登录用户名
roleCode 角色编码
funCode 功能编码
appCode 应用编码
2.6 平台常用Session变量
平台所有Session变量都存放在Session中的XzSessionVars中,XzSessionVars是一个HashMap
empName 员工姓名
AUTH_MODAL 平台授权模式
userId 用户ID
userName 登录用户名
roleId 角色ID
roleCode 角色编码
roleName 角色名称
2.7 非平台2.0工程集成到平台2.0的实现
将校验是否在平台2.0登录的过滤器放到要集成的工程里
过滤器源码
package com.xzsoft.xip.platform.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.net.util.Base64;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
/**
* ClassName:CheckLoginFilter Function:
* 验证是否在平台2.0登录的过滤器。放到需要集成到平台2.0的web工程里(必须Java Web工程)
*
* @author GuoXiuFeng
* @versionVer 1.0
* @sinceVer 1.0
* @Date 2015年4月16日下午2:26:50
*
*/
publicclass CheckLoginFilter implements Filter {
@Override
publicvoid destroy() {
// TODO Auto-generated method stub
}
@Override
publicvoid doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
HttpSession session = request.getSession();
String loginName = (String) session.getAttribute(“xzLoginName”);
String userName = (String) request.getParameter(“userName”);
if (loginName != null) {
chain.doFilter(request, response);
return;
} else {
if (userName != null) {
// 平台2.0提供的WEB服务验证用户是否登录,具体URL根据实际情况进行相应替换
String checkLoginUrl = “http://www.xzsoft.info:8080/xip2/services/platformWS?wsdl”;
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
org.apache.cxf.endpoint.Client client = dcf.createClient(checkLoginUrl);
Object[] objects;
Object[] args = { userName };
try {
objects = client.invoke(“hasLogined”, args);
String hasLogined = (String) objects[0];
if (“Y”.equals(hasLogined)) {
// 将登录用户名写入Session
session.setAttribute(“xzLoginName”, userName);
// 这里可以执行要集成到平台2.0的工程的登录初始化操作
chain.doFilter(request, response);
return;
}
} catch (Exception e) {
}
}
}
String url = request.getRequestURL().toString();
String queryStr = request.getQueryString();
if (queryStr != null) {
url = url.concat(“?”).concat(queryStr);
}
// 如果Session内没有登录用户信息,通过调用平台2.0WEB服务校验URL中的userName是否在平台2.0已经登陆过,如果没有登录。以上两个条件都满足则跳到平台2.0的登录页面
// 在平台2.0登录后,平台会调回到原来页面地址。并在URL后加入userName信息
response.sendRedirect(“http://www.xzsoft.info:8080/xip2/login/login.jsp?url=” + Base64.encodeBase64String(url.getBytes()));
}
@Override
publicvoid init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
2.8 移动APP登录
登录访问URL:
http://ip:port/webproject/platformAction.do?method=appLogin
参数:loginName登录用户名
password登录用户口令(MD5加密后的口令)
返回值:Json串。
登录成功返回{“flag”:”0”,”msg”:“loginKeyCode”} loginKeyCode是平台返回一个UUID需要APP进行记录。在以后移动APP向系统发请求时需要带上参数loginKeyCode和userName两个参数。否则平台将会拦截请求并返回{“flag”:”1”,”msg”: “未登录,无法完成请求!”}
登录失败{“flag”:”1”,”msg”: “登录失败原因”}
3 WB快速开发
3.1 WB在页面可以获取的变量
WB在页面可以通过{##} 和{??} 应用的变量
XIP.empName 员工姓名
XIP.AUTH_MODAL 平台授权模式
XIP.userId 用户ID
XIP.userName 登录用户名
XIP.roleId 角色ID
XIP.roleCode 角色编码
XIP.roleName 角色名称
sys.date 系统当前日期含时间(页面初始化那一时间点)
sys.now 字符串格式的当前时间(页面初始化那一时间点)
sys.id 获取ID,此ID在页面初始化时获得,页面不刷新,此值不变
sys.lang 页面语言
sys.uuid 获取UUID,此ID在页面初始化时获得,页面不刷新,此值不变
3.2 获取UUID
在js代码中直接调用Wb.getUuid()
3.3 执行数据库过程
在js代码中调用
Wb.executeProcedure(appCode,procedureName,params,callback)
参数
appCode 应用编码
procedureName 过程名(如果是包中过程,需要带包名)
callback 回调函数
示例代码
Wb.executeProcedure(‘xip’,’test’,’guoxiufeng,test’,function(obj){
if(obj.flag!==null&&obj.flag===0){
Ext.Msg.alert(“Success”,obj.msg);
}else{
Ext.Msg.alert(“Faild”,obj.msg);
}
});