文件上传
需要jar包:
Apache的common-file-upload、common-io包
common-file-upload
ServletFileUpload类
创建:
new ServletFileUpload()
主要方法:
boolean isMultipartContent(ServletHttpRequest req)
判断请求中是否有上传内容
注意:
在页面form标签中,添加属性:enctype="multipart/form-data"
在表单中添加文件域:
<input type="file" name="image" >
setFileSizeMax(long len)
设置每个文件上传的总大小
setSizeMax(long len)
设置所有文件上传的总大小
FileItemIterator getItemIterator(ServletHttpRequest req)
获得文件项目的迭代器
FileItemIterator类
boolean hasNext()
后面是否还有数据
FileItemStream next()
获得下一个表单项
FileItemStream类
boolean isFormField()
是否是一般的表单项
InputStream openStream()
打开输入流,读取数据
String getFieldName()
返回表单项的名称
common-io包
Streams工具类
String asString(InputStream in)
String asString(InputStream in,String encoding)
从输入流中读取字符串
void copy(InputStream in,OutputStream out,boolean isClose)
从输入流读取数据写入输出流,isClose是否关闭流
public static final String UPLOAD_DIR = "D:\\xpp\\apache-tomcat-8.0.52\\webapps\\upload\\";
//判断表单中是否有上传内容
if(ServletFileUpload.isMultipartContent(req)){
//创建上传对象
ServletFileUpload upload = new ServletFileUpload();
//限制文件上传的总大小
upload.setSizeMax(30 * 1024 * 1024);
//限制每个文件的总大小
upload.setFileSizeMax(10 * 1024 * 1024);
try {
User user = new User();
//获得文件项目的迭代器
FileItemIterator iter = upload.getItemIterator(req);
//循环迭代表单项目
while(iter.hasNext()){
//获得表单项
FileItemStream item = iter.next();
//判断是否是一般的表单项
if(item.isFormField()){
//读取表单的值
String value = Streams.asString(item.openStream(),"UTF-8");
//判断表单项的名称
switch(item.getFieldName()){
case "username":user.setUsername(value);break;
case "realname":user.setRealname(value);break;
case "address":user.setAddress(value);break;
case "tel":user.setTel(value);break;
}
}else{
//如果不是一般表单项,就保存文件
File file = new File(UPLOAD_DIR+UUID.randomUUID()+".jpg");
OutputStream out = new FileOutputStream(file);
switch(item.getFieldName()){
case "pic":user.setPic(file.getName());break;
//保存其他图片项目名称
}
Streams.copy(item.openStream(), out, true);
}
}
//保存到数据库
UserService userService = new UserServiceImpl();
userService.addUser(user);
System.out.println("上传完毕");
} catch (FileUploadException e) {
e.printStackTrace();
}
eCharts
前端图表框架
<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="main" style="width: 600px;height:400px;"></div>
<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: 'Hello 入门示例'
},
tooltip: {},
legend: {
data:['销量123']
},
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
},
yAxis: {},
series: [{
name: '销量123',
type: 'line',
data: [15, 20, 36, 10, 10, 20]
}]
};
// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>
案例:使用图表统计每个保姆的工作量
后台:
1)编写查询SQL语句
select n.name 保姆姓名,count(*) 工作次数 from tb_nanny n,tb_work w
where n.nanny_id = w.nanny_id group by n.nanny_id;
2)编写新的实体类包装保姆姓名和工作量
DTO(Data Transfer Object)用于包装数据实现数据传输
3)编写DAO、Service 实现保姆工作量查询、
4)添加保姆Servlet,添加方法,执行查询得到对象集合,将集合转换为JSON数组,以流的方式发送给Ajax客户端
前端:
1)Ajax去请求Servlet获得JSON的字符串
[{"nannyName":"张大姐","workCount":4},{"nannyName":"李大姐","workCount":1},{"nannyName":"王大姐","workCount":1},{"nannyName":"赵大姐","workCount":2},{"nannyName":"刘大姐","workCount":1},{"nannyName":"周大姐","workCount":1}]
2)使用JSON.parse(字符串)将字符串转换为JSON数组
(JSON.stringify(对象或数组)转换为字符串)
3)创建两个数组,分别获得JSON数组中的一部分数据
4)调用echarts,将数组做为参数
XML解析
Extendsible Markup Language (可扩展标记语言)
可读性好
作用:
1)用于配置参数
2)用于网络数据通信
特点:
1)标签可以自定义
2)区分大小写
3)成对出现
4)有且只有一个根节点
XML的解析
使用DOM4J包
SAXReader 读取器
创建:
new SAXReader()
方法:
- Document read(InputStream in)
读取XML文档
Document XML文档 - Element getRootElement()
获得根节点
Element XML的节点 - List elements()
获得所有的子节点 - Element element(“子节点名称”)
获得指定的子节点 - String getName()
获得节点的名字 - String getText()
获得节点中的文字 - Attribute getAttribute("属性名")
获得节点中的属性
Attribute 节点中的属性 - String getName()
获得属性名 - String getValue()
获得属性值
案例:解析c3p0-config的内容,创建JDBC的连接
1)创建SAXReader对象
2)调用read读取文档
3)获得文档的根节点
4)获得根节点下的子节点,进行遍历
5)读取子节点中的文字和属性
public class Dom4jTest {
public Connection readC3P0(){
String driver = null;
String url = null;
String user = null;
String password = null;
//创建SAXReader对象
SAXReader reader = new SAXReader();
try {
//读取src下的文档
Document doc = reader.read(Dom4jTest.class.getClassLoader().getResourceAsStream("c3p0-config.xml"));
//获得根节点
Element root = doc.getRootElement();
//获得根节点下,名字为default-config的子节点
Element config = root.element("default-config");
//获得所有子节点
List<Element> elements = config.elements();
for(Element ele : elements){
if(ele.getName().equals("property")){
//判断当前property节点的name属性的值
String value = ele.attribute("name").getValue();
switch(value){
case "driverClass":driver = ele.getText();break;
case "jdbcUrl":url = ele.getText();break;
case "user":user = ele.getText();break;
case "password":password = ele.getText();break;
}
}
}
System.out.println(driver);
System.out.println(url);
System.out.println(user);
System.out.println(password);
Class.forName(driver);
return DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Test
public void testReadXML(){
Connection conn = readC3P0();
System.out.println(conn);
}
}