~~
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='
name′andDept=′{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主键设为自增长,插入一致有问题,最后修改了一下表格设计就恢复了,还未弄明白。