感谢参加**软件有限公司程序编写能力考试,请按照本文档要求编写相关的应用程序,并在5个工作日内将程序源代码、编译结果、相关文档(如果有)发送到 hr@***soft.net(*小姐)收。
试题编码 | PKUHRTS012 | 测试内容 | J2EE开发人员 |
标准时间 | 5个工作日 |
1 基本要求
(一) 请编写JAVA代码实现本文档所要求的功能
(二) 本测试侧重考察JAVA中间应用程序编写能力,要求编写的JAVA组件可以成功部署到J2EE应用服务器上(TOMCAT,WEBLOGIC等)
(三) 为考察接口调用及结果考察,要求编写简单的前端应用(客户端、页面均可),调用编写的JAVA组件
2 功能要求
说明:在我们的应用程序编写中,所有的业务操作均通过XML标志实现前端和中间应用服务器的接口,如下示例:
<?xml version="1.0"?> <PKUDOC pkusoft="urn=schemas-pkusoft-com:fz" version="2.0"> <DATAINFO> <TABLE name="PERSON" operation="0"> <ID state="0">00003</ID> <NAME state="0">刘军</NAME> </TABLE> <TABLE name="PERSON" operation="1"> <ID state="5">00001</ID> <NAME state="0">张惠</NAME> </TABLE> <TABLE name="PERSON" operation="2"> <ID state="5">00002</ID> </TABLE> </DATAINFO> </PKUDOC> 说明:TABLE节点:表示要进行操作的数据库表名称,name属性为要操作的表的数据库名称,其子节点的节点名为要处理的字段名,子节点的值为字段的值 Operation 属性:表示要进行的数据库操作,0表示insert操作;1表示update操作;2表示delete操作 State 属性:0表示普通操作类型;5表示当update和delete该字段为操作的 where 条件 |
(XML1)
要求:
请按照上述的XML,编写一个JAVA组件,实现如下功能:
l 和前端的接口,接受前端程序提交的XML(XML1)。
l 解析XML,并依据XML的节点信息进行业务处理
l 业务处理包括三个内容:
n 增加一条新记录“刘军”,人员编号为“00003”
n 修改人员编号为“00001”的人员名字为“张惠”
n 删除编号问“00002”的人员
l 以上业务操作在同一事务中
l 业务处理只要求生成SQL语句,SQL可以生成文件或者显示在前端界面上。
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
/**
* xml操作工具类
* readStrToXML(String strXML) 把字符串转为xml文档
* readFile(String fileName) 读取xml文件
* getTheElementList(Element element,String elementName) 遍历XML文档,得到指定的元素集合
* parse2SQL(Element element) 解析一个的元素根据协议生成sql语句
* @author jseed
**/
public class XMLTools {
// 测试方法
public static void main(String[] args) {
List list=getTheElementList(readStrToXML(getXML()).getRootElement(),"TABLE");
for (int i = 0; i < list.size(); i++) {
org.dom4j.Element ele = (Element) list.get(i);
parse2SQL(ele);
}
}
/**
* 把字符串转为xml文档
* @param strXML:字符串
* @return Document
*/
public static Document readStrToXML(String strXML) {
try {
InputStream fl=new ByteArrayInputStream(strXML.getBytes("UTF-8"));
SAXReader reader = new SAXReader();
Document document = reader.read(fl);
System.out.println("读取XML成功");
return document;
} catch (Exception ep) {
ep.printStackTrace();
return null;
}
}
/**
* 读取xml文件
* @param fileName:文件名
* @return Document
*/
public static Document readFile(String fileName) {
File fl = new File(fileName);
try {
SAXReader reader = new SAXReader();
Document document = reader.read(fl);
System.out.println("读取XML成功");
return document;
} catch (Exception ep) {
ep.printStackTrace();
return null;
}
}
/**
* 遍历XML文档,得到指定的元素集合
* @param rootElement: 根元素
* @param elementName:指定元素名
* @return:指定元素名的元素集合
*/
public static List<org.dom4j.Element> getTheElementList(Element rootElement,String elementName){
nodeList.clear();
treeWalk(rootElement, elementName);
return nodeList;
}
/**
* 遍历XML文档,得到指定的元素
* @param element 元素
*/
private static void treeWalk(Element element,String elementName) {
for (int i = 0; i < element.nodeCount(); i++) {
Node node = element.node(i);
// 如果节点为一个元素 一个节点可以为以下三种类型
// 1元素(Element)
// 2文字(text 空行也算)
// 3注解(Comment)
if (node instanceof Element) {
String nodeName = node.getName();
// 如果节点名字为table就加入到nodeList中
if (nodeName.equals(elementName)) {
nodeList.add((Element)node);
}
// 递归
treeWalk((Element) node,elementName);
} else {
}
}
}
/**
* 解析一个的元素
*
* @param element :一个table元素
* @return:根据协议生成一条SQL语句
*/
public static String parse2SQL(Element element) {
String sql = null;
String insertField = null;
String insertValue = null;
String updateField = null;
String condition = null;
// 得到表名
String tableName = element.attributeValue("name");
// 得到操作类型
String operation = element.attributeValue("operation");
// 考虑到可能没有NAME元素 使用list的方式获得名,值
List<org.dom4j.Element> eleList = element.elements();
if (eleList.isEmpty()) {
return null;
}
java.util.Map<String, String> fieldMap = new java.util.HashMap<String, String>();
for (int i = 0; i < eleList.size(); i++) {
// 得到元素的名字
String eleName = eleList.get(i).getName();
// 元素的text
String eleTest = eleList.get(i).getText();
// 得到元素的state的属性的值
String eleAttribute = eleList.get(i).attributeValue("state");
if (eleAttribute.equals("0")) {
// 把用于普通操作的字段放入map
fieldMap.put(eleName, eleTest);
} else if (eleAttribute.equals("5")) {
// 得到条件
condition = eleName + "=" + eleTest;
}
}
// 迭代map
Iterator<String> it = fieldMap.keySet().iterator();
// 根据协议生成具体SQL
switch (Integer.valueOf(operation)) {
case 0:
while (it.hasNext()) {
String key = it.next();
insertField = key + "," + insertField;
insertValue = fieldMap.get(key) + "," + insertValue;
}
// 截取最后的一个逗号
insertField = insertField
.substring(0, insertField.lastIndexOf(","));
insertValue = insertValue
.substring(0, insertValue.lastIndexOf(","));
sql = "INSERT INTO " + tableName + "(" + insertField + ") VALUES ("
+ insertValue + ")";
break;
case 1:
while (it.hasNext()) {
String key = it.next();
updateField = key + "=" + fieldMap.get(key) + "," + updateField;
}
// 截取最后的一个逗号
updateField = updateField
.substring(0, updateField.lastIndexOf(","));
if (null == condition) {
sql = "UPDATE " + tableName + " SET (" + updateField + ")";
} else {
sql = "UPDATE " + tableName + " SET (" + updateField
+ ") WHERE " + condition;
}
break;
case 2:
if (null == condition) {
sql = "DELETE FROM " + tableName;
} else {
sql = "DELETE FROM " + tableName + " WHERE " + condition;
}
break;
default:
sql = "";
break;
}
//测试
System.out.println("-----------" + "SQL: " + sql);
return sql;
}
//测试用方法
public static String getXML() {
String xml = "<?xml version=\"1.0\"?>"
+ "<PKUDOC pkusoft=\"urn=schemas-pkusoft-com:fz\" version=\"2.0\">"
+ " <DATAINFO>" + " <TABLE name=\"PERSON\" operation=\"0\">"
+ " <ID state=\"0\">00003</ID>"
+ " <NAME state=\"0\">刘小小</NAME>" + "</TABLE>"
+ " <TABLE name=\"PERSON\" operation=\"1\">"
+ " <ID state=\"5\">00001</ID>"
+ " <NAME state=\"0\">张惠</NAME>" + "</TABLE>"
+ " <TABLE name=\"PERSON\" operation=\"2\">"
+ " <ID state=\"5\">00002</ID>" + "</TABLE>"
+ " </DATAINFO>" + " </PKUDOC>";
return xml;
}
// Element容器
private static java.util.List<org.dom4j.Element> nodeList = new java.util.ArrayList<org.dom4j.Element>();
}
有了这个工具类,就可以把XML 按照文档的协议转成SQL了
但是根据文档的要求 还需要部署到web容器上,需要一个客户端
我的思路是做一个web service,客户端用swing写个小界面就可以啦