在進行XMLRpc測試不是很方便,於是寫了一個測試頁面,具體使用方式為:在應用的web.xml中多加入一個Servlet:
<servlet><servlet-name>XmlrpcUtilServlet</servlet-name><servlet-class>com.suntek.vms.app.vvmagent.xmlrpc.XmlrpcUtilServlet</servlet-class></servlet><servlet-mapping><servlet-name>XmlrpcUtilServlet</servlet-name><url-pattern>/rpcservices</url-pattern></servlet-mapping>
對應的XmlrpcUtilServlet類如下:
/** * XML-Rpc測試類別 * * @author Administrator<br/> * @version <br/> * @email: zcg@suntektech.com<br/> * @datetime: 2012-8-24 <br/> */@SuppressWarnings("rawtypes")public class XmlrpcUtilServlet extends HttpServlet implementsXmlRpcMessageListener {/** * */private static final long serialVersionUID = 1L;private static LogProxy logger = LogHandler.getLogger();private static ConcurrentHashMap<String, String> messageStore = new ConcurrentHashMap<String, String>();private static Method[] methods = null;private static int flag = 0;private static final String URL = "http://127.0.0.1:"+ System.getProperty(BootConstants.APP_RPC_PORT) + "/"+ System.getProperty(BootConstants.APP_TYPE) + "/xmlrpc";protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {String type = request.getParameter("type");if (type == null) {index(request, response);return;} else {rpcHandle(request, response);}response.setContentType("text/html");PrintWriter writer = response.getWriter();String reqString = messageStore.get("REQUEST");flag = 0;String respString = messageStore.get("RESPONSE");reqString = format(reqString);respString = format(respString);StringBuilder builder = new StringBuilder();builder.append("<body style='font-family:Arial;'>");builder.append("<div style='font-size:16px;font-weight:bold;'>Request</div>");builder.append("<div style='width:80%'><textarea style='font-size:14px;width:800px;height:280px;'>").append(reqString).append("</textarea></div><br/>");builder.append("<div style='font-size:16px;font-weight:bold;'>Response</div>");builder.append("<div style='width:80%'><textarea style='font-size:14px;width:800px;height:280px;'>").append(respString).append("</textarea></div>");builder.append("</body>");writer.write(builder.toString());writer.flush();}private void index(HttpServletRequest request, HttpServletResponse response)throws IOException {try {StringBuilder builder = new StringBuilder();builder.append("<body style='font-family:Arial;'>");builder.append("<div style='padding:10px;'>");for (Method m : getMethods()) {String name = m.getName();if (name.charAt(0) <= 90 && name.charAt(0) >= 65) {Class[] pTypes = m.getParameterTypes();String returnType = m.getReturnType().getSimpleName();String[] typeArr = new String[pTypes.length];for (int i = 0; i < pTypes.length; i++) {typeArr[i] = pTypes[i].getSimpleName();}String action = "http://" + request.getLocalAddr() + ":"+ request.getLocalPort() + "/"+ System.getProperty(BootConstants.APP_TYPE)+ "/rpcservices?type=" + name;builder.append("<form style='margin:0;padding:0;' action='").append(action).append("' method='post'>");builder.append("<div style='border:1px solid #ccc;margin:5px; width:350px; height:200px; float:left;'>");builder.append(returnType).append(" ").append(name);builder.append("<input type='submit' value='invoke'/><br/>");builder.append("<div style='margin-left:35px;'>");builder.append("<table>");for (int i = 0; i < pTypes.length; i++) {String pType = typeArr[i];builder.append("<tr>");builder.append("<td>").append(pType).append("</td>");builder.append("<td>").append("<input type='text' name='param_").append(i).append("' style='border:1px solid #ccc;width:200px; height:20px;'/>").append("</td>");builder.append("</tr>");}builder.append("</table>");builder.append("</div>");builder.append("</div>");builder.append("</form>");}}builder.append("</div>");builder.append("</body>");response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.write(builder.toString());writer.flush();} catch (Exception e) {e.printStackTrace();}}private void rpcHandle(HttpServletRequest request,HttpServletResponse response) {try {String method = request.getParameter("type");Enumeration<String> enums = request.getParameterNames();List<String> valList = new ArrayList<String>();while (enums.hasMoreElements()) {String key = enums.nextElement();if (!key.equals("type")) {String value = request.getParameter(key);valList.add(value);}}int length = valList.size();String[] objects = new String[length];for (Method m : getMethods()) {String name = m.getName();if (name.equals(method)) {Class[] classes = m.getParameterTypes();for (int i = 0; i < length; i++) {objects[i] = classes[i].getSimpleName();}}}List<Object> params = new ArrayList<Object>();for (int i = 0; i < length; i++) {if (objects[i].equals("Integer") || objects[i].equals("int")) {params.add(Integer.parseInt(valList.get(i)));} else if (objects[i].equals("Long")|| objects[i].equals("long")) {params.add(Long.parseLong(valList.get(i)));} else {params.add(valList.get(i));}}getClient().execute("SwVvmg." + method, params);} catch (Exception e) {e.printStackTrace();}}private XmlRpcClient getClient() throws Exception {XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();config.setServerURL(new URL(URL));config.setEnabledForExtensions(true);XmlRpcClient client = new XmlRpcClient();client.setConfig(config);client.setListener(this);return client;}public void onMessage(String xmlContent) {flag++;if (flag == 1) {messageStore.put("REQUEST", xmlContent);}if (logger.isTraceEnabled()) {logger.trace("[XmlrpcUtilServlet.onMessage] Request: "+ format(xmlContent));}}private Method[] getMethods() throws Exception {if (methods == null) {InputStream input = XmlrpcUtilServlet.class.getResourceAsStream("/resources/xmlrpc-config.properties");Properties properties = new Properties();properties.load(input);String c = properties.getProperty("SwVvmg");Class cla = Class.forName(c);methods = cla.getMethods();}return methods;}public static ConcurrentHashMap<String, String> getMessageStore() {return messageStore;}public static String format(String str) {try {SAXReader reader = new SAXReader();// 注釋:建立一個串的字元輸入資料流StringReader in = new StringReader(str);Document doc = reader.read(in);// 注釋:建立輸出格式OutputFormat formater = OutputFormat.createPrettyPrint();// 注釋:設定xml的輸出編碼formater.setEncoding("utf-8");// 注釋:建立輸出(目標)StringWriter out = new StringWriter();// 注釋:建立輸出資料流XMLWriter writer = new XMLWriter(out, formater);// 注釋:輸出格式化的串到目標中,執行後。格式化後的串儲存在out中。writer.write(doc);writer.close();// 注釋:返回我們格式化後的結果return out.toString();} catch (Exception e) {e.printStackTrace();return "";}}}
頁面效果如下,在xmlrpc-config.properties配置中公布的類中的方法都可以在頁面中展現出來,這樣就可以很方便的對每個XMLRpc的方法進行單元測試了。
測試的效果如下: