辅助框架
json
jsonObject
jsonArray
-
jackson
-
gson:gson 2.8jar;
public static void main(String[] args) { String str = "{\"id\":22,\"name\":\"ocean\"}"; Type o = new Gson().fromJson(str, Type.class); System.out.println(o.getName()); System.out.println(new Gson().toJson(o)); }
调试junit 4.1
-
引用
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency>
-
使用
public class test1 { @Test public void exe() { //不能有返回值和参数 System.out.println(123); } }
-
断言
批量方法测试时,验证结果是否成功
TestCase.assertEquals(1>0, 100>0);
-
类单元测试
- 创建junit/junit test cast
- under test 选择要测试的类
- next 选择测试的方法
-
注解
- 每个测试方法都运行
- @Before
- @After
- 只能注解static方法,执行一次
- @BeforeClass
- @AfterClass
- @RunWith:运行期,框架环境测试
- @Ignore:方法排除
- @Test
日志 log4j(sel4j)
-
相当于system.out.print(),可以分类输出到文件
-
7级信息输出
- DEBUG:输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的
- INFO: 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。
- WARN: 输出警告信息;表明会出现潜在错误的情形。
- ERROR:输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。
- FATAL: 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。
- ALL level:打开所有日志记录开关;是最低等级的,用于打开所有日志记录。
- OFF level:关闭所有日志记录开关;是最高等级的,用于关闭所有日志记录
-
Appender
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
-
layout 显示样式
- org.apache.log4j.HTMLLayout(以HTML表格形式布局)
- org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
-
定义:
- 指定名称
Logger log = Logger.getLogger("root");
- 指定当前类名称
Logger log = Logger.getLogger(LogTest.class);
- 指定名称
-
使用:
方法名是信息登记名称
log.debug("")
-
指定输出位置
System.setOut(new PrintStream(new File("c:a.log")));
xml dom4j
Document doc =DocumentHelper.createDocument();
Element root=doc.addElement("aaaa");
//add() 节点,属性,备注,文本(接口 ctrl+t 实现类)
Element el1=new DefaultElement("bbbb");
el1.add(new DefaultAttribute("asd", "egg记得给人家"));
root.add(new DefaultText("dddddddddddddd"));
root.add(el1);
XMLWriter writer =new XMLWriter( new FileOutputStream("c:/a.xml"),
OutputFormat.createPrettyPrint());
writer.write(doc);
writer.close();
读取:
File file = new File("E:\\testData.xml");
SAXReader reader=new SAXReader();
Document doc=reader.read(file); //读取xml文件到Document中
Element rootElement=doc.getRootElement();//获取xml文件的根节点
爬虫
-
请求发送
- GET
Connection conn = Jsoup.connect(url); Document doc = conn.get();
- POST
Connection conn= Jsoup.connect(url); conn.data(key,value); // 可循环添加 conn.header("Cookie",cookie); //插入cookie , 头文件的形式 Document doc = conn.post();
- GET
-
解析html,得到element
//选择器,查出集合 Elements els = doc.select(".all-img-list>li"); for(Element el:els) { String t = el.select(".book-mid-info h4 a").first().text(); DBHelper.executeUpdate("insert into type(name) values(?)", t); }
-
获取内容
- text()
- html()
- attr()
- children()
-
反爬虫:
- Ajax 重定向
- token签名认证
- http header数据
- 动态页面(每次访问类名自动更换),(class,标签)动态
-
API
- 交警、保险
- bat公司,头条,淘宝,360
- 定制产品,短信,地图,人工智能
- API数据中心-app key
Maven
maven test验证jar是否正确
项目构建框架,自动导入依赖jar包
- pom: 项目对象模板
pom.xml设置加入编译路径 - 仓库
- 公共仓库:官方
- 私人库:user/.m2/repository 文件夹
- 私服:公司库
- 查找:百度
https://mvnrepository.com/
- 目录结构:
- main:主目录
- java:源码
- resource:配置文件,最终到编译路径
- webapp:站点文件夹
- test:单元测试目录
- java:测试源码
- target:目标文件,自动生成
- main:主目录
- 打包方式
- war:网站发布文件
- jar包
- pom:父项目
- 包scope
- provided:(最常用)全部阶段可用,无传递性
- test:测试和编译时使用
- runtime:运行和测试时使用
- system:(一般不用)
- compile:全部阶段可用
- 命令mvn
- build:编译,重置target文件夹
- clean:清理缓存,最好经常使用
- install:加入到本地仓库,打包jar
- package:生成war文件
- deploy:发布到远程仓库
layUI前端框架
-
功能:包含所有bootstrap功能,css样式,js组件管理(Ajax数据更新)
-
table 数据表格:
-
换页查询:url,cols
<table id="demo" lay-filter="test"></table> layui.use('table', function(){ var table = layui.table; table.render({ elem: '#demo' ,height: 312 ,url: 'Book/index' //数据接口 ,page: true //开启分页 ,cols: [[ //表头 {field: 'id', title: 'ID', width:80, sort: true, fixed: 'right'} ,{field: 'name', title: '用户名', width:280}
-
json数据接收
StringBuilder s = new StringBuilder("{\"code\": 0,\r\n" + " \"msg\": \"\",\r\n" + " \"count\": 1000,\"rows\":"); s.append(objectMapper.writeValueAsString(o)); s.append("}"); resp.getWriter().write(s.toString()); 加入属性 ,parseData:function (res){ return { "code":res.code, "msg":res.msg, "count":res.count, data:res.rows } }
-
行按钮
<script type="text/html" id="barDemo"> <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a> <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a> </script> 列属性加入 ,{fixed: 'right', title:'操作', toolbar: '#barDemo', width:150,align:'center'} 事件 //obj 行 obj.data 行数据 data.id 列 //test 是table的lay-filter="test" 属性 table.on('tool(test)', function(obj){ var data = obj.data; if(obj.event === 'del'){ ///lay-event 属性 layer.alert("已删除id为"+data.name); } });
-
-
提示框
layer.confirm('真的删除行么', function(index){ layer.close(index); }); layer.alert("已删除id为"+data.name);
-
form表单
-
提交
layui.use('form', function(){ var form = layui.form; form.on('submit(formDemo)', function(data){ layer.msg(JSON.stringify(data.field)); return false; }); });
-
赋值
form.val("formTest", json)
-
表单验证
<input type="text" lay-verify="required|phone|number"> 自定义校验器 form.verify({ username: function(value, item){ //value:表单的值、item:表单的DOM对象 if(!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)){ return '用户名不能有特殊字符'; } if(/(^\_)|(\__)|(\_+$)/.test(value)){ return '用户名首尾不能出现下划线\'_\''; } if(/^\d+\d+\d$/.test(value)){ return '用户名不能全为数字'; } } //我们既支持上述函数式的方式,也支持下述数组的形式 //数组的两个值分别代表:[正则匹配、匹配不符时的提示文字] ,pass: [ /^[\S]{6,12}$/ ,'密码必须6到12位,且不能出现空格' ] });
-
-
select Ajax获取
<div class="layui-form" lay-filter="boardFilter"> layui.form.render('select','boardFilter');