文件上传

需要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);
    }
}
01-14 18:28