第七周day09 1. 多表查询(通常要给表起个别名,方便调用字段) (1) 交叉连接(结果是笛卡尔积,用的比较少) ① select * from 表1 cross join 表2; ② select * from 表1,表2; (2) 内连接 ① select * from 表1 inner join 表2 on 条件;(显式) ② select * from 表1,表2 where 条件;(隐式) (3) 外连接 ① select * from 表1 left outer join 表2 on 条件;(左连接,可以不写outer) 1) 解释:把表2信息拼接到表1,如果表1有多余的信息,也会把表1显式完整 ② select * from 表1 right outer join 表2 on 条件;(右连接,可以不写outer) 1) 解释:把表1信息拼接到表2,如果表1有多余的信息,不会显示多余的信息 2. 内连接和外连接的区别:内连接只查询两个表的公共的信息,外连接以一个表为基准查询所有信息 dye101. JDBC (1) 概念:sun公司提供的一组接口,各大数据库厂商他们来实现这组接口 (2) 作用:我们可以通过jdbc来操作数据库,因为各大厂商都实现了jdbc,所以我们不用去记很多的方法。只需要掌握jdbc,就可以去操作各大数据库 (3) 怎么使用: ① 贾琏欲执事 2. 基本步骤 (1) 加载驱动:class forname(“com.mysql.jdbc.Driver”) (2) 获得连接:Connection con=DriverMannager.getConnection(“jdbc:mysql://数据库地址:端口:数据库”,”账户”,”密码”); (3) 获得执行SQL语句的对象:Statement sta=con.createStatement() (4) 编写SQL语句:String str=”select * from emp” (5) 执行SQL语句:ResultSet rs=sta.executeQuery(str) (6) 因为是查询语句,所以可以遍历结果rs:while(rs.next()){ System.out.print(rs.getInt(“id”)); System.out.print(rs.getString(“ename”)); ... ... } (7) 释放资源: ① rs.close ② sta.close ③ con.close day111. JDBC中的事务管理 (1) 开启事务:setAutocommit(false); (2) 提交事务:commit(); (3) 回滚事务:rollback(); (4) 注意:管理的是JDBC,回滚并不会操作Java里的变量 2. 连接池 (1) 概念:一个容器,用来装连接对象 (2) 用处:可以节约资源,提高运行的性能 3. 今天需要掌握 (1) 配置文件的方式获得连接池 ① 德鲁伊 1) 需要一个配置文件,名字和位置可以自定义(详见教程笔记) ② c3p0 1) 需要一个配置文件,名字和位置都是固定的(详见教程笔记) 4. 用DBUtils进行增删改 (1) 创建QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource); (2) qr.updata(“sql语句”,代替问号); 如何创建一个JDBCUtils工具类 思路:1.添加c3p0的jar包 2.在成员变量位置创建一个私有静态的对象 3.创建一个获取Connection的方法 4.创建一个获取DataSource的方法(直接返回DataSource就行) 5.最后还是要创建一个方法来释放资源 关键字:ComboPooledDataSource getConnection getDataSource day121. 查询 (1) ArrayHandler ① 将一条记录封装到一个数组中,这个数组应该是Object[] ② QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource()); ③ Object[] obj=queryRunner.query(“select * from 表名 where id=?”,new ArrayHandler(),1) (2) ArrayListHandler ① 将多条记录封装到一个装有Object[]的list集合中。 ② 用法与ArrayHandler类似,只是接收用List<Object[]> (3) BeanHandler ① 前提: 1) 类名要和表中字段相同 2) 类中要有get,set方法 3) 实体类中要有无参构造 ② QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource()); ③ 自定义对象=queryRunner.query(“select * from 表名 where id=?”,new BeanHandler<自定义对象>(自定义对象.class),1) (4) BeanListHandler ① 与上同理,接收用自定义对象集合 (5) MapHandler(key是列名,value是值) ① QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource()); ② Map<String,Object> map=queryRunner.query(“select * from 表名 where id=?”,new MapHandler(),1) (6) MapListHandler ① 原理同上 2. XML (1) 概念:可扩展标记语言 (2) 功能 ① 保存数据------用关系型数据库替代 ② 传输数据------json替代 ③ 配置文件------目前还没有更好的一个替代(注解现在也在做配置) 3. XML语法 (1) 文档声明:通常出现在xml第一行第一列 (2) 写法:<?xml 属性名=”属性值” 属性名=”属性值” ?> ① 属性 ② 1) version:必须的,使用1.0 2) encoding:字符集,是使用浏览器打开的时候采用的默认的字符集的编码 3) standalone:描述xml文档是否需要依赖其他的文件 (3) 注释 ① <!-- -->跟html一样 (4) xml的元素 ① 规则 1) 不能以数字或者标点符号开头 2) 不能以xml开始 3) 不能包含空格 4) 只能有一个根标签 (5) xml的属性 ① 属性的名称规范与元素一致 ② 要用双引号包起来 (6) CDATA区 ① <![CDATA[这里的所有东西都当成字符串]]> 4. XML的解析 (1) 通过代码获得xml文档中想要的数据 (2) 解析方式 ① DOM解析:Document Object Model 1) 缺点:如果文档特别大,容易导致内存的溢出 2) 优点:对xml进行增删改的操作 ② SAX解析:Simple Api for XML 1) 缺点:不能对文档进行增删改的操作 2) 优点:如果文档特别大,不会出现内存溢出的情况 ③ DOM和SAX的区别:dom一次性将文档加载到内存,形成树形结构进行解析,sax事件驱动方式,一行一行进行解析 5. 使用DOM4j工具解析(还有其他不同组织的工具,今天只学习DOM4j) (1) 导入jar包,dom4j-1.6.1.jar (2) 创建解析器—— ① SAXReader reader=new SAXReader() (3) 解析文档获得代表文档的Document对象—— ① Document document=reader.read(“xml文档路径”) (4) 获得根节点—— ① Element root=document.getRootElement(); (5) 从根节点下查找其他的节点 ① Element ele=root.element(“元素”) (6) ↑↑↑这个方法不重要 6. 使用XPath (1) dom4j支持XPath的jar包 (2) dom4j的XPath支持的API ① document.selectNodes(String xPath)返回List ② document.selectSingleNode(String XPath)返回Node day131. C/S架构软件: (1) 概念:Client/Server客户端和服务器端的软件,都是需要在pc端安装的软件,比如qq,迅雷... (2) 优点:效果炫酷,速度快 (3) 缺点:服务器端更新,客户端需要更新(维护麻烦) 2. B/S架构软件 (1) 概念:Browser/Server浏览器端和服务器端的软件,不需要安装到pc端,只需要有一个浏览器即可,比如京东,网页版微信... (2) 优点:服务器端更新,客户端不用更新(维护方便) (3) 缺点:效果不是那么炫酷,所有的代码都在服务器端,导致服务器压力过大 ① 效果:使用HTML5和CSS3可以做出炫酷的效果 ② 服务器端压力:搭建服务器的集群,而且还有AJAX技术 3. WEB资源 (1) 静态资源: ① HTML,CSS,JS,图片... (2) 动态资源 ① PHP ② ASP ③ Servlet/JSP 4. 服务器 (1) 硬件:实际就相当于配置很高的电脑 (2) 软件:必须在一台电脑上安装服务器软件,这台电脑成为web服务器 (3) 常见的web服务器 ① Apache ② IIS ③ websphere ④ weblogic ⑤ Tomcat:Apache开发,免费 ⑥ Jboss 5. WEB动态资源目录结构 (1) 静态资源 (2) WEB-INF ① web.xml(必须的) ② classes(可选的) ③ lib(可选的) 6. Tomcat目录结构 (1) bin:Tomcat的执行的文件 (2) conf:配置文件 (3) lib:放第三方jar包的 (4) logs:运行日志 (5) temp:临时文件存放的路径 (6) webapps:发布的web项目的路径 (7) work:运行jsp的时候,jsp翻译成servlet的代码存放的路径 7. 发布一个web项目到Tomcat中 (1) 有三种方式 ① 直接将工程复制到webapps中 ② 配置Tomcat虚拟路径(不推荐,容易出错) 1) 在Tomcat/conf/server.xml文件中进行配置 2) 在<host>标签下配置: a. <Context path=”/itheima” docBase=”C:/website”/> ③ 配置Tomcat虚拟路径(推荐) 1) 在tomcat/conf/Catalina/localhost/xxx.xml 2) 配置<Context docBase=”C:/websete”/> (2) xxx作为虚拟路径名称 8. HTTP协议 (1) 概念:用来规定浏览器与服务器之间需要遵守的规则 (2) 作用:规范浏览器和服务器之间的数据传递 (3) 特点 ① 基于请求和响应的模型 ② 必须现有请求后有响应 ③ 请求和响应成对出现 (4) 默认端口号是80 (5) 版本 ① 1.0 ② 1.1 9. HTTP请求部分 (1) 请求行: ① 提交方式:常见的两种 1) get提交的参数会显示到地址栏上,post不会显示 2) get一般有大小限制,post没有大小限制 3) get没有请求体,post有请求体 ② 请求路径 ③ 协议版本 (2) 请求头: ① 一般都是key:value键值对的形式,一般情况下一个key对应一个value,也有一些事一个key对应多个value ② User-Agent:代表浏览器的类型——文件下载:下载中文文件:ie使用URLEncodor进行编码,火狐使用Base64编码 ③ Referer:代表的是网页的来源——防盗链 ④ If-Modified-Since:通常与响应中的头Last-Modified一起使用查找本地缓存 (3) 请求体: ① 就是post提交方式的提交参数 10. HTTP相应部分 (1) 响应行: ① 协议版本: ② 状态码: 1) 200:成功 2) 302:重定向 3) 304:查找本地缓存 4) 404:资源不存在 5) 500:服务器内部错误 ③ 状态码描述: (2) 响应头: ① 键值对形式 ② Last-Modified:与请求中的If-Modified-Since一起使用查找本地缓存 ③ Content-Dispostion:文件下载的时候使用的一个头信息 ④ Location:重定向的跳转路径 ⑤ Refresh:定时刷新/定时跳转 (3) 响应体: ① 显示浏览器的页面内容 11. Servlet概述 (1) 什么是Servlet ① 就是一个运行web服务器上的小的Java程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议 ② Servlet就是SUN公司提供的一个动态网页开发技术 (2) 作用 ① 处理从客户端浏览器发送的请求,并且可以对请求做出响应 12. 今日遇到的问题 (1) 记忆xml的书写格式 (2) 注意不要忘记在控制台那用Servlet导入项目,要不然会导致404错误 day141. 三层架构 (1) 优点 ① 开发人员可以值关注整个结构中的其中一次 ② 可以很容易的用心的实现来替换原有的层次的实现 ③ 可以降低层与层之间的依赖 ④ 有利于标准化 ⑤ 有利于各层逻辑的服用 ⑥ 结构更加明确 ⑦ 在后期维护的时候,极大地降低了维护成本和维护时间 (2) 缺点 ① 降低了系统性能 2. Servlet的生命周期 (1) 概念:Servlet从创建到销毁的过程 (2) 何时创建:用户第一次访问Servlet创建Servlet的实例 (3) 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候 (4) 描述:用户第一次访问Servlet的时候,服务器会出现一个Servlet的实例,那么Servlet中init方法就会执行,任何一次请求服务器都会创建一个新的线程范文Servlet中的service的方法,在service方法内部根据请求的方式的不同调用doxxx的方法,当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行 3. url-pattem的配置 (1) Url-pattern三种配置方式 ① 完全路径匹配: 1) 以/开始 比如:/aaa/ServletDemo ② 目录匹配 1) 以/开始,以*结束 比如:/aaa/bbb/* ③ 扩展名匹配 1) 不能以/开始,以*开始 比如:*.do *.action *.action ④ 错误写法: /*.do (2) 优先级 ① 完全路径匹配>目录匹配>扩展名匹配 day15(薄弱点加强复习)1. 在web项目下读取文件常用的方法 (1) getResourceAsStream(String path) ① 方法说明:根据提供的文件路径(String path)读取文件,然后返回这个文件的输入流(inputStream类型) ② 应用思路: 1) 获得ServletContext对象:ServletContext context=this.getServletContext(); 2) 用上面的对象调用方法:InputStream is=context.getReasourceAsStream(“/WEB-INF/classes/目标文件.扩展名”); a. 注意:由于开始路径已经固定,所以此方法传入的文件路径前面是固定的。 3) 利用properties的load方法:Properties pro=new Properties(); pro.load(is); 4) 读取value:String s=pro.getProperty(“key”); (2) getRealPath(String path) ① 方法说明:根据提供的路径(String path),返回一个相对于磁盘的绝对路径(String类型),比如:D:\百度网盘。 ② 应用思路: 1) 获得ServletContext对象:同上 2) 调用方法:String s=context.getRealPath(“/WEB-INF/classes/目标文件.扩展名”); a. 注意:这里传入的路径与上面的方法相同。 3) 然后就可以利用inputStream传入绝对路径s获取该目标文件的了 (3) 小结:以上两个方法都是ServletContext的方法所有都要先用Servlet获取ServletContext对象 (4) 类的加载器 ① 为什么要这样用:有时候需要在工具类里面读取这个文件 ② 思路 1) 创建工具类:ReadFileUtils 2) 然后固定用法:ReadFileUtils.Class.getClassLoader().getResourceAsStram(“目标文件.扩展名”); 3) 利用properties的load方法加载 4) 获取到数据该输出输出,该调用调用 2. ServletContext的功能 (1) 获取全局参数 ① 用处:一般一个web项目下可以有多个Servlet,但是每个Servlet之间的参数是不能互相调用的,配置了全局参数之后,每个Servlet都可以用这个全局参数。 ② 配置方法:在web.xml里面配置,可以配置多个 <context-param> <param-name>自定义</ param-name> <param-value>自定义</ param-value> </ context-param> ③ 获取方法1 1) 获取对象——ServletContext 2) 调用方法——getInitParameter(String 自定义) 3) 链式调用——String str=this.getServletContext().getInitParameter(“自定义”); ④ 获取方法2(获取所有name的值) 1) 链式调用——Enumeration<自定义类型> e=this.getServletContext().getInitParameterNames(); a. 注意接收类型 2) 需要遍历 a. while(e.hansMoreElements()){ String name=e.nextElements(); String value=this.getServletContext().getInitParameter(name) syso(name+” ”+value) } (2) 获取文件的MIHE类型 ① 用处:下载/上传文件的时候可能会用到 ② 方法:getMimetype(String 文件名) ③ 注意:传入的文件名可以不存在,只要有后缀名就可以获取 3. response的常用API (1) 响应行 ① status:设置状态码 1) 就是404、302那些,可以设置重定向那些 (2) 响应头 ① addDataHeader(): ② addHeader() ③ addIntHeader() ④ 以上针对一个key对多个value ⑤ setDataHeader() ⑥ setHeader() ⑦ setIntHeader() ⑧ 以上针对一个key对一个value (3) 响应体 ① getOutputStream():可以用来下载文件 ② getWriter():可以用来下载文本 4. 文件下载的方式 (1) 超链接:就是<a></ a>,不好用,如果浏览器支持文件格式,浏览器就会直接把文件打开 (2) 手动编写代码 ① 技巧:设置两个头(setHeader()),一个流 1) 第一个头:Content-Type:文件的MIME的类型 2) 第二个头:Content-Disposition:以下载的形式打开文件 3) 一个流:InputStream:文件输入流 5. 中文乱码问题 (1) response ① 字节流向浏览器输出中文乱码 1) 思路 a. 把中文转成字节流时候的编码与浏览器编码设置成一样的 2) 实现: a. 设置浏览器默认打开时候采用的字符集编码 a) response.setHeader(“Content-Type”,”text/html;charset=UTF-8”); b. 设置中文转成字节时候的编码 a) “中文”.getBytes(“UTF-8”) ② 字符流向浏览器输出中文乱码 1) 思路:设置字符缓冲区的编码 2) 实现: a. 设置浏览器默认打开时候采用的字符编码集(与上面一样) a) response.setHeader(“Content-Type”,”text/html;charset=UTF-8”); b. 设置字符缓冲区的编码 a) response.setCharacterEncoding(“UTF-8”); 3) 另外一种简单的方法 a. response.setContentType(“text/html;charset=UTF-8”); a) 这个方法直接包含了上面两段 (2) request接收中文参数的乱码 ① get方式提交 1) 思路: a. 用String的构造方法,先把接收的数据(request.getParameter(“name”))用ISO-8859-1解码,再用UTF-8编码 2) String tr=new String(request.getParameter(“name”).bytes(“ISO-8859-1”),”UTF-8”); ② post方式提交 1) request.setCharacterEncoding(“UTF-8”); 6. Request的常用API (1) 获得客户机信息 ① 获取请求方式:getMethod(); ② 获取请求路径: 1) getRequestURI();——以项目开头的 2) getRequsetURL;——以http开头的 ③ 获取主机地址:getRemoteAddr(); ④ 获取工程名:getContextPath(); (2) 获得从页面提交的数据 ① getParameter(); ② getParameterMap(); ③ getParameterNames(); ④ getParameterValues(); (3) 作为域对象存取数据 ① removeAttribute(); ② setAttribute(); ③ getAttribute(); 7. 重定向和转发 (1) 重定向:response.sendRedirect(“以工程名开头的路径”); (2) 转发:request.getRequestDispatcher(“不以工程名开头的路径”); (3) 区别: ① 重定向的地址栏会发生变化,转发的地址栏不会发生变化 ② 重定向两次请求两次响应,转发一次请求一次响应 ③ 重定向的路径需要加工程名,转发的路径不需要加工程名 ④ 重定向可以跳转到任意网站,转发只能挑战到服务器内部网站
|