今天是9月27号,是我来到公司的第三周,这周我需要完成的任务是有两个:1.在用户,用户组,角色,项目管理,基线管理,配置管理,构件管理,版本管理的日志中添加详细信息,完善功能;2.在日志查找中添加一个下拉框,进行分类查询。
第一个功能非常简单,不需要什么技术,只需要用Ctrl+H查找日志,就可以完成。只是代码非常的零碎,需要一个一个添加。
第二个功能就有了难度。只要是公司也不知道使用的是什么框架,我感觉就是用java硬写的,感觉十分的难受。在添加下拉框时,要用到界面元素,这个是我之前没有接触过的,这是java常用的面板组件。
下拉框组件(JComboBox)
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class demo extends JFrame{
JPanel jp1;
JLabel jl1;
JComboBox jcb;
public static void main(String[] args) {
demo d = new demo();
}
public demo() {
jp1 = new JPanel();
jl1 = new JLabel("你的籍贯:");
String[] jg = {"北京","上海","黑龙江"};
jcb = new JComboBox(jg);
jp1.add(jl1);
jp1.add(jcb);
this.add(jp1);
this.setSize(300, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
这是一个下拉框实现的事例demo。
我在网上查看资料,弄了半天才看懂,接下来要在项目中添加这个功能。
一、客户端
首先,在客户端添加这个组件,找到日志查看的方法类JBLogShow,在其中先写上
JLabel typeLb = new JLabel();
JComboBox typeCb = new JComboBox();
在界面上,构建一个下拉框。
在初始化界面中,将内容添加到下拉框中,并新建一个值改变的事件
typeMap = new LinkedHashMap<String,String>();
typeMap.put("系统", "系统");
typeMap.put("角色", "R");
typeMap.put("用户", "U");
typeMap.put("用户组", "G");
typeMap.put("项目管理", "1");
typeMap.put("基线管理", "2");
typeMap.put("配置管理", "3");
typeMap.put("构件管理", "4");
typeMap.put("版本管理", "5");
typeName = typeMap.keySet();
Iterator e = typeName.iterator();
while(e.hasNext()){
typeCb.addItem(e.next());
}
//下拉框值改变事件
typeCb.addItemListener(new java.awt.event.ItemListener(){
public void itemStateChanged(java.awt.event.ItemEvent e){
if(e.getStateChange() == ItemEvent.SELECTED){
typeCb_itemStateChanged(e);
}
}
});
这样就在客户端上写入了一个静态的下拉框
之后就是完成下拉框值改变事件:
void typeCb_itemStateChanged(ItemEvent e) {
String s = (String) typeCb.getSelectedItem();
userType = typeMap.get(s);
System.out.println(userType);
Thread t=new Thread()
{
public void run()
{
settleTask(5);
}
};
t.start();
}
之后调用线程方法,调用settleTask方法,向服务器传输数据:
else if(type==5)
{ // 5:查询
setTypeTable(doc);
}
生成XML任务串:
else if(type==5)
{// 5.分类查询
strBuf.append("<userType>");
strBuf.append(userType);
strBuf.append("</userType>");
}
最后,客户端接收服务端传过来的数据,并将数据显示出来:
private void setTypeTable(Document doc) {
// 设置空表,不能编辑
DefaultTableModel model=new DefaultTableModel(mTableHeader,0)
{
public boolean isCellEditable(int row,int column)
{
return false;
}
};
table.setModel(model);
setTableSize();
// 解析xml字符串
NodeList logList=doc.getElementsByTagName("logTypeList");
Object[] tableContent=new Object[9];
String nodeName,nodeValue="";
for(int n=0;n<logList.getLength();n++)
{
for(int t=0;t<9;t++)
{
tableContent[t]="";
}
Node node=logList.item(n).getFirstChild();
while(node!=null)
{
nodeName=node.getNodeName();
if(node.hasChildNodes())
{
nodeValue=node.getFirstChild().getNodeValue();
if(nodeName.equals("ID"))
{
tableContent[0]=nodeValue;
}
else if(nodeName.equals("configName"))
{
tableContent[1]=nodeValue;
}
else if(nodeName.equals("creator"))
{
tableContent[2]=nodeValue;
}
else if(nodeName.equals("configAction"))
{
tableContent[3]=nodeValue;
}
else if(nodeName.equals("startTime"))
{
tableContent[4]=nodeValue;
}
else if(nodeName.equals("endTime"))
{
tableContent[5]=nodeValue;
}
else if(nodeName.equals("result"))
{
tableContent[6]=nodeValue;
}
else if(nodeName.equals("reason"))
{
tableContent[7]=nodeValue;
}
else if(nodeName.equals("accessorip"))
{
tableContent[8]=nodeValue;
}
else
{}
}
node=node.getNextSibling();
}
model.insertRow(n,tableContent);
}
}
这样,客户端这边就完成了,之后就要写服务端的代码了。
二、服务端
在服务端,首先需要接收客户端传过来的数据
// 10.userType 用户分类
returnInfo[10]="";
if(doc.getElementsByTagName("userType").getLength()>0&&doc.getElementsByTagName("userType").item(0).hasChildNodes())
{
returnInfo[10]=doc.getElementsByTagName("userType").item(0).getFirstChild().getNodeValue();
}
在接收完数据之后,就应该在doIt方法中写入要完成的功能:
首先判断下拉选是否进行,再判断是哪种日志,之后就可以从数据库中将配置项的值和ID拿出来,判断configName是否是以下拉选的值开头的,
if(!"".equals(this.requestInfo[10])){
String sql;
if(iLogType==2){
sql = "select FIELD1,FIELD2 from AUDIT"+exeUser.getId()+" order by FIELD1";
}else{
sql = "select FIELD1,FIELD2 from AUDIT"+exeUser.getId()+" order by FIELD1";
}
Statement st=JBGlobal.JBGlobalCon.createStatement();
ResultSet rs = st.executeQuery(sql);
ResultSetMetaData m=rs.getMetaData();
int columns=m.getColumnCount();
while(rs.next()){
for (int i = 0; i < columns; i++) {
configName = rs.getString("FIELD2");
}
if(configName != null&&configName.startsWith(this.requestInfo[10])){
int id = Integer.parseInt(rs.getString("FIELD1"));
this.resultXML+=this.getLogListXML(exeUser,iLogType,this.requestInfo[10],id);
}
}
}
如果都成功,就会调用getLogListXML方法:
private String getLogListXML(JBUser exeUser,int type,String userType,int id) throws Exception {
if(exeUser==null)
{
return "";
}
StringBuffer stringBuffer=new StringBuffer();
Statement st=null;
ResultSet rs=null;
String sSQL=null;
try
{
st=JBGlobal.JBGlobalCon.createStatement();
if(configName.startsWith(userType)){
if(type==2){
sSQL="select FIELD1,FIELD2,FIELD3,FIELD4,FIELD5,FIELD6,FIELD7,FIELD8,FIELD9 from AUDIT"+exeUser.getId()+" where FIELD1 = "+id+" order by FIELD1";
}else{
sSQL="select FIELD1,FIELD2,FIELD3,FIELD4,FIELD5,FIELD6,FIELD7,FIELD8,FIELD9 from AUDIT"+exeUser.getId()+" where FIELD1 = "+id+" order by FIELD1";
}
}
rs=JBGlobal.JBGlobalCon.executeQuery(sSQL,st);
while(rs.next())
{
stringBuffer.append("<logTypeList>");
stringBuffer.append("<ID>"+rs.getInt("FIELD1")+"</ID>");
stringBuffer.append("<configName>"+(rs.getObject("FIELD2")==null?"":rs.getString("FIELD2"))+"</configName>");
stringBuffer.append("<creator>"+(rs.getObject("FIELD3")==null?"":rs.getString("FIELD3"))+"</creator>");
stringBuffer.append("<configAction>"+(rs.getObject("FIELD4")==null?"":rs.getString("FIELD4"))+"</configAction>");
stringBuffer.append("<startTime>"+(rs.getObject("FIELD5")==null?"":rs.getString("FIELD5"))+"</startTime>");
stringBuffer.append("<endTime>"+(rs.getObject("FIELD6")==null?"":rs.getString("FIELD6"))+"</endTime>");
stringBuffer.append("<result>"+(rs.getObject("FIELD7")==null?"":rs.getString("FIELD7"))+"</result>");
stringBuffer.append("<reason>"+(rs.getObject("FIELD8")==null?"":rs.getString("FIELD8"))+"</reason>");
stringBuffer.append("<accessorip>"+(rs.getObject("FIELD9")==null?"":rs.getString("FIELD9"))+"</accessorip>");
stringBuffer.append("</logTypeList>");
}
}
catch(Exception e)
{
throw e;
}
finally
{
JBCon.HXConn.closeAll(rs,st,null);
}
return stringBuffer.toString();
}
将数据写成XML字符串,传递给服务器。
总结:
这次任务我大概用了六、七天完成的。第一个任务两天就搞定了,只要是第二个任务花的时间长,有四、五天。在写下拉框时,前端还好说,主要是传递数据过程和后端比较费劲。在传输数据时,已经传递好了,还不知道,知道邓哥帮我查看时,才发现原来是服务端的判断条件写错了。这花了我一天半的时间也没有找出来。主要是要用debug来查看。我之前没有用debug,写的非常费劲。之后使用debug查看我写的代码,查出错误,查找漏洞,代码写的就非常的好,写的也很顺利。这就让我记住,要善用debug,这样就会提高代码的编写速度和时间。