java 笔记有关bug方面

~~

java 笔记有关bug方面

近期自己出现的bug处理问题进行总结分析:
其中一些是理解不深,还有一些是细节处理不当造成的。
1.junit测试方面
a.@Test 忘记写报错unrooted Tests,太不仔细。
b.springmvc 容器单元测试(直接eg)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(“classpath:applicationContext.xml”) // 指定工厂配置文件的位置
public class UserServiceImplTest extends TestCase {
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Resource
private MenuDao menuDao;
//测试连接
@Test
public void testMenu( ) {
System.out.println(“nihao”);
SqlSession seq = sqlSessionFactory.openSession();
2.java.lang.unstatisfiedlinkerror:…can’t load AMD64:
jdk tomcat 版本兼容问题,删除tomcat bin 目录下的tcnative-1.dll即可。
3. 前端页面错误调试:
可以借助浏览器断点测试,
利用浏览器开发者模式功能进行代码逐行或逐过程进行测试。
4. strust 与mybatis 整合问题总结:
a.方法传参数时必须加注解才能识别。
例子:ArrayList selectAllQudao(@Param(value=“page”)Integer page);
b. 有关mabatis动态sql :
模糊查询:

and tel like concat(’%’,tel)

sql传参最好用"#",不用
符号
mysql 数据库使用limit 分页查询时传递参数不支持这种算式limit(20*pagesize(nowpage-1),pagesize);数据库会报错,最好在后台定义变量对计算结果收参在传给sql。
where 与if 标签嵌套使用:()
例子:

select *,case when city=‘北京’ then concat(‘0’,tel) left(tel,1)==‘0’ then concat(‘0’,tel) when left(tel,1)>1
and length(tel)==8 then concat(‘0’,tel) else concat(‘00’,tel) end as tel1
from zjcf_kehu


principal=’ n a m e ′ a n d D e p t = ′ {name}'and Dept=' nameandDept={dept}’ and ((to_days(now())-to_days(lasttime))>=0
or lasttime=’’ or lasttime is null) and isuseful=‘绑定’


order by level asc lasttime,r_time desc


limit #{page}, 20

c.strust 跳转控制
action 方法都带后缀.action,没用spring ,整合过程比较长,因为是公司的老项目七八年的strust1 项目,重构起来不久费劲,放弃继承DispatchAction,改为继承ActionSupport,action 参数传递采用set/get方法
6.poi 数据导入导出:
注意字段名必须一致,不然会有数据丢失。
直接上导入代码:

@RequestMapping(value="/upload.do")
	@Transactional(propagation=Propagation.REQUIRED)
	public String upload(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException, FileUploadException{
		@SuppressWarnings("deprecation")
		String savePath =request.getRealPath("/WEB-INF/upload");       
		//上传时生成的临时文件保存目录              
		@SuppressWarnings("deprecation")
		String tempPath = request.getRealPath("/WEB-INF/temp");   
		File tmpFile = new File(tempPath);             
		if (!tmpFile.exists()) {               
			//创建临时目录                   
			tmpFile.mkdir();                }    
			//消息提示           
			String message = "";                            
				//使用Apache文件上传组件处理文件上传步骤: 
				//1、创建一个DiskFileItemFactory工厂    
				DiskFileItemFactory factory = new DiskFileItemFactory();     
				//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。       
				factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB  
				//设置上传时生成的临时文件的保存目录                    
				factory.setRepository(tmpFile);                
				//2、创建一个文件上传解析器                 
				ServletFileUpload upload = new ServletFileUpload(factory);                                               
				//解决上传文件名的中文乱码                   
				upload.setHeaderEncoding("UTF-8");                   
				//3、判断提交上来的数据是否是上传表单的数据                
				if(!ServletFileUpload.isMultipartContent(request)){       
					//按照传统方式获取数据                       
					return message;                 
					}                                       
				//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB   
				upload.setFileSizeMax(1024*1024);                    
				//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB   
				upload.setSizeMax(1024*1024*10);                                        
				//                                                          
				//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项                 
				List<FileItem> list = upload.parseRequest(request);  
				for(FileItem item : list){                        
					//如果fileitem中封装的是普通输入项的数据         
              if(item.isFormField()){                          
            	  String name = item.getFieldName();     
            	  //解决普通输入项的数据的中文乱码问题              
            	  String value = item.getString("UTF-8");
            	 // String value = item.getString("gbk");          
            	  //value = new String(value.getBytes("iso8859-1"),"UTF-8");  
            	  System.out.println(name + "=" + value);                  
            	  }else{//如果fileitem中封装的是上传文件                         
            		  //得到上传的文件名称,                         
            		  String filename = item.getName();  
            		  System.out.println(filename+"..filename");  
            		  if(filename==null || filename.trim().equals("")){  
            			  continue;                            }          
            		  //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt                            //处理获取到的上传文件的文件名的路径部分,只保留文件名部分                      
            		  	filename = filename.substring(filename.lastIndexOf("\\")+1);                     
            		  	//得到上传文件的扩展名                         
            		  String fileExtName = filename.substring(filename.lastIndexOf(".")+1);                         
            		  //如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法       
            		  System.out.println("上传的文件的扩展名是:"+fileExtName);                        
            		  //获取item中的上传文件的输入流                           
            		  InputStream in = item.getInputStream();  
            		  //得到文件保存的名称                            
            		  String saveFilename = makeFileName(filename);   
            		  //得到文件的保存目录                       
            		  String realSavePath = makePath(saveFilename, savePath);  
            		  //创建一个文件输出流                            
            		  FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename); 
            		  //创建一个缓冲区                         
            		  byte buffer[] = new byte[1024];                     
            		  //判断输入流中的数据是否已经读完的标识                        
            		  int len = 0;                          
            		  StringBuffer sb = new StringBuffer();  
            		  //循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据 
            		  while((len=in.read(buffer))>0){                                
            			  //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
            			  //                            	
            			  System.out.println(realSavePath);   
            			  System.out.println();                              
            			  sb.append(new String(buffer,0,len));                        
            			 // logger.info(sb.toString());//                               
            			 // System.out.println(sb.toString());//                       
            			  sb.setLength(0);                           
            			  out.write(buffer, 0, len);                          
            			  }//                           
            		  System.out.println(sb.toString()+"-----");                        
            		  String ss = sb.toString();                            
            		  //  System.out.println(sb.);                 
            		  //关闭输入流                         
            		  in.close();                          
            		  //关闭输出流                           
            		  out.close();    
            		  //删除处理文件上传时生成的临时文件                  
            		  // item.delete();                      
            		 /* Savedb saveData2DB = new Savedb(); //写入数据库     
            		  saveData2DB.save(realSavePath + "\\" + saveFilename);  */
            		  ReadExcel xlsMain = new ReadExcel();       
        			  Qudao qudao = null;        
        			  List<Qudao> list1 = xlsMain.readXls(realSavePath + "\\" + saveFilename);  
        			  List<Qudao> Importlist=new ArrayList<Qudao>();
        		
        			  int j=operusersService.showMaxid()+1;
        			  for (int i = 0; i < list1.size(); i++) {          
        				 qudao = list1.get(i); 
        				  //工具类将servcie dao 注入普通类 不然无法注入 此处不需要
        				
        				  //添加进数据库
        				 qudao.setId(j);
        				 Importlist.add(qudao);
        				 j++;
        				//  operusersService.insertqd(qudao);
        				  System.out.println("list1.size()-====="+list1.size());     
        				  System.out.println("qudao-====="+qudao);     
            		  
            		  System.out.println("end");                             
            		  message = "success";                     
            		  } 
        			  
        			  
        				  operusersService.insertqdBatch(Importlist);
        			  
             		  System.out.println("end");  
             		  System.out.println("Importlist====="+Importlist);  
             		//  message = "success";  
        			            
				}
				}
			
                       
			/*request.setAttribute("message",message);*/               
			//returnResultJson(response,message);              
			//request.getRequestDispatcher("/uploadImport.jsp").forward(request, response);
		 
			
			
				PrintWriter pw = null;		
				pw = response.getWriter();		
			//JSONObject resultmessage = JsonUtil.generate(obj);		
			response.setCharacterEncoding("UTF-8");			
			response.setContentType("application/json");			
			response.setHeader("Cache-Control", "no-cache");		
			pw.write(pw.toString());
			return "uploadImport";		
			 
			 
			}
     private String makeFileName(String filename){  //2.jpg       
		//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名       
		return UUID.randomUUID().toString() + "_" + filename;    }          
	private String makePath(String filename,String savePath){        
		//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址      
		int hashcode = filename.hashCode();      
		int dir1 = hashcode&0xf;  //0--15 一级目录     
		int dir2 = (hashcode&0xf0)>>4;  //0-15  二级目录     
		//构造新的保存目录       
		String dir = savePath + "\\" + dir1 + "\\" + dir2;  
		//upload\2\3  upload\3\5       
		//File既可以代表文件也可以代表目录     
		File file = new File(dir);      
		//如果目录不存在      
		if(!file.exists()){           
			//创建目录          
			file.mkdirs();      
			}        
		return dir;   
			}     	
  
          

~~
这个导入功能我调试测试了半天一致只能导入第一行数据,后来发现Mysql数据库id主键设为自增长,插入一致有问题,最后修改了一下表格设计就恢复了,还未弄明白。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值