公司任务——日志功能完善总结

今天是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,这样就会提高代码的编写速度和时间。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值