Java-Web基础总结

上传人:gbs****77 文档编号:10011267 上传时间:2020-04-09 格式:DOC 页数:103 大小:537.56KB
返回 下载 相关 举报
Java-Web基础总结_第1页
第1页 / 共103页
Java-Web基础总结_第2页
第2页 / 共103页
Java-Web基础总结_第3页
第3页 / 共103页
点击查看更多>>
资源描述
一 Servlet 1 Servlet 概述 1 1 B S 架构 了解 1 什么是 B S 架构 客户端使用浏览器 服务端使用 web 浏览器 客户端跟服务器之间使用 HTTP 协议进行通讯 2 优点 客户端不需要单独安装 因为使用浏览器 C S 架构比较麻烦的是 需要单独安装每个客户端 并且一旦客户端版本发生改变 就需要再次安装 开发相对简单 C S 架构需要我们分别在 客户端和服务器端编写相 应的通信处理模块和自定义协议 而 B S 架构使用标准的 HTTP 协议 即不再 需要自定义协议 而且浏览器与 Web 服务器已经包含了相应的通信模块了 1 2 什么是 Servlet Sun 公司制订的一种用来扩展 Web 服务器功能的组件规范 1 扩展 web 服务器功能 早期 2000 年左右 的 Web 服务器 apache 的 web server 微软的 iis 只能够处理静态资源 即需要事先将 html 文件写好 不能够处理动态资 源的请求 即需要依据请求参数然后进行计算 生成相应的页面 为了让这些 web 服务器能够处理动态资源的请求 需要扩展他们的功 能 早期使用的是 CGI 技术 Common Gateway Interface 通用网关接口 可以使用很多语言编写 如 perl C C 等来开发 CGI 程序 但是 CGI 程序有 几个问题 比如开发比较复杂 因为需要程序员自己去分析请求参数 性能 不佳 因为当 Web 服务器收到请求之后 会启动一个 CGI 进程来处理请求 CGI 程序依赖平台 可移植性不好 现在 可以使用 Servlet 来扩展 当浏览器将请求发送给 Web 服务器 比如 apcahe 的 web server Web 服务器会向 Servlet 容器发送请求 Servlet 容器负责解析请求数据包 当然 也包括网络通讯相关的一些处理 然后将解析之后的数据交给 Servlet 来处理 Servlet 只需要关注具体的业务处理 不用关心网络通讯相关的问题 注意事项 可以不使用服务器 而直接向 Servlet 容器发送请求 因为 Servlet 容器里面也有个通信模块 所以也可直接把 Servlet 容器当作简单 的 Web 服务器来使用 2 组件规范 组件 是符合一定规范 并且实现部分功能的可以单独部署的软件模块 组 建必须要部署到容器里面才能运行 容器 也是符合一定规范 并且提供组件的运行环境的程序 注意事项 单个的组件 单个的容器都是没意义的 都不能单独运行 需要放在一起才能运行 1 3 什么是 Tomcat Tomcat 本身是一个 Servlet 容器 即可以提供 Servlet 运行环境的一个程序 但是 Tomcat 还提供了 Web 服务器所具有的所有功能 所以我们也称 Tomcat 是 一个 Web 服务器 Tomcat 的默认端口是 8080 1 安装 Tomcat www apache org 下载 Linux 系统下安装和配置的步骤 step1 解压到 home soft01 下 step2 配置环境变量 cd home soft01 vi bash profile JAVA HOME jdk 的主目录 CATALINA HOME tomcat 的主目录 PATH CATALINA HOME bin step3 启动 Tomcat cd home soft01 tomcat 主目录 bin sh startup sh 或者 sh catalina sh run 接下来 可以打开浏览器 输入 http localhost 8080 验证是 否配置成功 step4 关闭 Tomcat cd home soft01 tomcat 主目录 bin sh shutdown sh Windows 系统下安装和配置的步骤 step1 解压到某个盘下 step2 配置环境变量 JAVA HOME JDK 的主目录 必须配置 CATALINA HOME Tomcat 的主目录 可以不配置 PATH Tomcat 的 bin 目录 可以不配置 我的电脑 右键 属性 打开 系统属性 的 高级 选项卡 找到 环境变量 新建 用户变量 新建 JAVA HOME 注意事项 新建系统变量或新建用户变量均可 建议新建用户变量 新建 CATALINA HOME 可以不配置 新建 PATH 可以不配置 注意事项 如果环境变量中已经有 PATH 修改该 PATH 即可 使用 分号作 分隔 如下所示 PATH C Program Files Java jdk1 6 0 06 bin D apache tomcat 5 5 23 bin Windows 操作系统下以 分号为分隔符 linux 系统下以 冒号 为分隔符 step3 启动 Tomcat 进入启动 Tomcat 的 bin 目录下 双击 startup bat 接下来 可以打开浏览器 输入 http localhost 8080 验证是 否配置成功 step4 关闭 Tomcat 进入启动 Tomcat 的 bin 目录下 双击 shutdown bat 2 Tomcat 目录结构简介 bin 目录 存放启动和关闭服务器的一些脚本 命令 common 目录 共享 部署在该服务器上的所有程序都可以使用 的一 些 jar 包 conf 目录 存放服务器的一些配置文件 webapps 目录 部署目录 work 目录 服务器运行时 生成的一些临时文件 1 4 如何写一个 Servlet 不使用开发工具 step1 先写一个 Java 类 实现 Servlet 接口或者继承 HttpServlet 抽象类 public class HelloWorldServlet extends HttpServlet Tomcat 会自动调用 service 自己不用再去写方法调用了 所以必须把名 字写对 public void service HttpServletRequest request HttpServletResponse response throws ServletException IOException 异常必须写两个 不能写成 Exception 也不能再多个异常 设置一个消息头 content type 告诉浏览器返回的数据类型是一个 html 文 档 以及编码格式 此外 还可以告诉服务器 在使用 out 输出时 使用指定 的编码格式进行编码 response setContentType text html charset utf 8 通过响应对象 获得一个输出流 PrintWriter out response getWriter 调用流的方法进行输出 其实质是将处理结果写到了 response 对象上 out println Hello World out close 不调用也可以 因为 Servlet 方法执行完毕 容器会自动调用 out close 方法 out close step2 执行编译操作 javac d HelloWorldServlet java 但是会报错 找不到某些类 其中 d 代表把编译后的文件放在当前文件 夹下 把 Tomcat 安装目录中 common 中 lib 中的 servlet api jar 和刚编写类放一起 是编译时需要用的 jar 再次编译 javac cp servlet api jar d HelloWorldServlet java 其中 cp servlet api jar 表示告诉 Java 编译器去哪里找需要的 class 文件 到 servlet api jar 的 jar 包中找 step3 打包 即创建一个具有如下结构的文件夹 appname 文件夹名起应用名 WEB INF 必须大写 classes 文件夹 放 class 文件 lib 文件夹 放 jar 文件 可没有 web xml 部署描述文件 url pattern 将编译好的 class 文件放入 classes 文件夹中 如有包 则一起放入 web xml 文件内容 web app version 2 4 xmlns xmlns xsi http www w3 org 2001 XMLSchema instance xsi schemaLocation helloWorld Servletday01 HelloWorldServlet helloWorld hello step4 部署 将 step3 创建的文件夹拷贝到 Servlet 容器特定的文件夹下面 拷 贝到 Tomcat 的 webapps 目录下 注意事项 也可以将 step3 创建的文件夹使用 jar 命令进行压缩 生成 war 为后缀的文件 然后拷贝 step5 启动 Servlet 容器 访问 Servlet 访问格式 http ip port appname url pattern 比如在浏览器地址栏输入 http localhost 8080 web01 hello 1 5 使用 MyEclipse 开发 Servlet step1 配置 MyEclipse 使得 MyEclipse 能够管理 Tomcat 1 点击工具栏上的 Run Stop Restart MyEclipse Servers 图标旁边的下拉箭头 选择 Configure Server 2 在弹出的对话框 Preferences 中展开 MyEclipse Servers Tomcat Tomcat5 X 注意事项 选择你目前电脑上 Tomcat 的版本 此处以 Tomcat5 为例 3 将 Tomat server 选项置为 Enable 默认为 Disable 4 点击 Tomcat home directory 之后的 Browse 按钮 选择 Tomcat 主目录 确定 然后 Tomcat base directory 和 Tomcat temp directory 自动生成 点击 OK 注意事项 两项可改可不改的 Tomcat 下的 JDK Tomcat JDK name 是自己已安装的 JDK Tomcat 也 是 java 写的也得依赖 JDK 建议 Tomcat 下的 Launch Tomcat launch mode 设置为 Run model 默认 为 Debug mode 而该模式在有些时候会显示不正常 5 回到工具栏上的 Run Stop Restart MyEclipse Servers 图标旁边的下拉箭头 选择 Tomcat 5 x 点击 Start 6 当在控制台显示 Server startup in XXX ms 则 Tomcat 启动成功 注意事项 如果出现 Address already in use JVM Bind 异常 则说明 已经启动了一个 Tomcat 解决办法 运行 shutdown 命令 关闭之前开 启的 Tomcat step2 建立一个 Web Project Web 工程 填写 Project name JDK 最好选 5 0 其他选项默认 点击 Finish step3 编写 Java 类和 web xml 文件 step4 部署项目到 Tomcat 服务器 1 点击工具栏 Deploy MyEclipse J2EE Project to Server 按钮 2 弹出对话框 Project Deployments 点击 Add 按钮 3 弹出 New Deployment 对话框 选择 Tomcat 5 x 点击 Finish 最后点击 OK 注意事项 在对话框 Project Deployments 对话框有 4 个按钮 常用的 为 Add 按钮 在 Tomcat 服务器上增加新应用 Remove 按钮 删除 Tomcat 服务器上的新应用 Redeploy 按钮 重新部署该应用 一般每次修改后都需要重新部 署一下 step5 访问 Tomcat 服务器上的 Servlet 实例 访问格式 http ip port appname url pattern 比如在浏览器地址栏输入 http localhost 8080 web01 hello 注意事项 在 IDE 工具 集成开发环境 中启动 Tomcat 部署项目后 不需要重新 启动服务器 系统会自动部署 IDE 工具简化了 Servlet 的开发步骤 第 1 步 写一个 java 类 手动 第 2 步 编译 自动 第 3 步 打包 自动 第 4 步 部署 不用手动拷贝 点一下 第 5 步 启动服务器 访问 servlet 手动 默认情况下 应用名和工程名相同 工程 属性 MyEclipse Web Web Context 可修改部署后的应用名 新建 Web 工程时也可以手动在 Context root RUL 中更改应用名 1 6 Servlet 是如何运行的 比如 在浏览器地址栏输入 http ip port web01 hello web01 hello 为请求 资源路径 step1 浏览器依据 ip 和 port 建立与 Servlet 容器之间的连接 step2 浏览器将请求数据打包 即按照 http 协议的要求 将相关数据封装成一 个数据包 一般称之为请求数据包 并发送给 Servlet 容器 step3 Servlet 容器解析请求数据包 并将解析之后得到的数据放到已创建的 request 对象上 同时 容器也已经创建好了一个 response 对象 step4 Servlet 容器依据请求资源路径 即 web01 hello 找到 Servlet 的配置 然后创建 Servlet 对象 根据 xml 文件里配置的类而创建 step5 Servlet 容器接下来调用 Servlet 对象的 service 方法 并且会将事先创建 好的 request 对象和 response 对象作为 service 方法的参数传递给 Servlet 对象 step6 Servlet 可以通过 request 对象获得请求参数 进行相应的处理 然后将处 理结果写到 response 对象上 step7 Servlet 容器读取 response 对象上的数据 然后将处理结果打包 响应数 据包 并发送给浏览器 step8 浏览器解析响应数据包 将返回的数据展现给用户 1 7 常见错误及解决方式 1 404 是一个状态码 是一个三位数字 由服务器发送给浏览器 告诉 浏览器是否正确处理了请求 404 的意思是说 服务器依据请求资源路径 找不到对应的资源 解决 依据 http ip port appname url pattern 检查你的请求地址是否正确 仔细检查 web xml 特别要注意 servlet name 是否一致 2 500 服务器处理出错 一般是因为程序运行出错 解决 检查程序的代码 比如 是否继承 检查 web xml 类名要填写正确 3 405 服务器找不到对应的 service 方法 解决 检查 service 方法的签名 方法名 参数类型 返回类型 异常类型 1 8 根据请求次数显示结果和显示当前时间 eg1 在地址栏输入 http localhost 8080 web01 hello qty 5 后 获得 5 个 Hello World 注意事项 qty 请求参数名字 5 请求次数为 5 public void service HttpServletRequest request HttpServletResponse response throws ServletException IOException 读请求参数值 返回值是 String String qtyStr request getParameter qty int qty Integer parseInt qtyStr 转成 整数 String rs for int i 0 i qty i 处理请求 生成处理结果 rs Hello World 输出处理结果 设置一个消息头 content type 告诉浏览器返回的数据类型 是一个 html 文档 response setContentType text html PrintWriter out response getWriter 通过响应对象 获得一个输出流 调用流的方法进行输出 其实质是将处理结果写到了 response 对象上 out println rs out close eg2 在网页上显示当前时间 step1 Java 类中写 public void service HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html 告诉浏览器返回的数据类型是一个 html 文档 PrintWriter out response getWriter 通过响应对象 获得一个输出流 Date date new Date SimpleDateFormat sdf new SimpleDateFormat yyyy MM dd String now sdf format date out println now 输出到页面 out close step2 web xml 中写 Date Servletday01 DateDemo Date date 2 HTTP 协议 2 1 什么是 HTTP 协议 HTTP Hypertext transport protocol 是超文本传输协议 是一种应用层协 议 由 W3C 制定 它定义了浏览器 或者其他客户端 与 Web 服务器之间通 讯的过程及数据格式 2 2 通讯的过程 step1 浏览器建立与 Web 服务器之间的连接 Socket step2 浏览器要将请求数据打包 请求数据包 然后发送给 Web 服务器 step3 Web 服务器将处理结果打包 响应数据包 然后发送给浏览器 step4 Web 服务器关闭连接 注意事项 特点 一次请求 一次连接 优点 Web 服务器可以利用有 限的连接个数为尽可能多的客户服务 效率高 如果浏览器要再发请 求 就必须重新建立一个新的连接 2 3 数据格式 1 请求数据包 请求行 请求方式 请求资源路径 协议描述 若干消息头 消息头是一些键值对 一般由 W3C 定义 有特定的含 义 浏览器和服务器之间 可以通过发送消息头来传递一些特定的信息 比如 浏览器可以通过 user agent 消息头来通知服务器浏览器的类型和版本 实体内容 只有当请求方式为 post 时 浏览器才会将请求参数添加 到实体内容里面 如果请求方式为 get 浏览器会将请求参数添加到请求资源路 径的后面 2 响应数据包 状态行 协议描述 状态码 状态描述 若干消息头 服务器也可以发送一些消息头给浏览器 比如 content type 告诉浏览器服务器返回的数据类型和编码格式 字符集 比如 UTF 8 ISO 8859 1 实体内容 程序处理之后 返回的结果 3 截获数据包 使用 MyEclipse 中的 TCP IP Monitor TCP IP Monitor 相 当于一个代理服务器 它的原理图如下 2 4 TCP IP Monitor 的使用 1 Window Show View Other MyEclipse Common TCP IP Monitor 2 在 TCP IP Monitor 的空白处点右键 Properties 弹出对话框点 Add 增 加新的监视器 3 点击 Start 启动代理服务器 OK 4 测试 1 8 案例 eg1 地址栏输入 http localhost 8888 web01 hello qty 5 注意使用代理端口号 执行完毕 即可 查看 TCP IP Monitor 出现的内容 2 5 get 请求与 post 请求 1 哪些情况下 浏览器会使用 get 方式发请求 直接在浏览器地址输入某个地址 点击链接地址 表单默认的提交方法 2 哪些情况下 浏览器会用 post 方法发请求 设置表单的 method 属性值为 post 3 get 请求的特点 get 请求会将请求参数添加到请求资源路径的后面 因为请求行存放 的数据大小有限 也就是地址栏的最长字节数 所以 get 请求只能提交少量 的数据 get 请求会将请求参数显示在浏览器地址栏 不安全 比如 路由器 会记录整个地址 4 post 请求的特点 post 请求会将请求参数添加到实体内容里面 所以 可以提交大量的 数据 post 请求不会将请求参数显示在浏览器地址栏 相对安全一些 但是 post 请求并不会对请求参数进行加密处理 用 HTTPS 协议进行加密处理 注意事项 服务器不关心是用浏览器还是 Java 程序发送的请求 只要符 合协议格式 都会处理 2 6 如何读取请求参数 1 方法一 String request getParameter String paraName 如果 paraName 即参数名称 与实际的参数名称不一致 会获得 null 不报错 在使用表单提交数据时 如果用户没有填写任何的值 会获得空字符 串 2 方法二 String request getParameterValues String paraName 当有多个参数且名称相同时 使用该方法 比如 city bj 登录 mysql 使用 root 用户权限 查看当前所有的数据库 show databases 创建一个新的数据库 create database db chang default character set utf8 创建 db chang 数据库 默认是用 utf8 编码集 不能写减号 使用某个数据库 use db chang 查看当前数据库有哪些表 show tables drop table tablname 删表 建表 create table chang emp id int primary key auto increment name varchar 50 salary double age int insert into chang emp name salary age values tom 10000 23 注意事项 auto increment 自增长列 即插入记录时 数据库会自动为 该列赋一个唯一的值 相当于 Oracle 中的序列 sequence 2 使用 JDBC 访问数据库 step1 将 JDBC 驱动放到 WEB INF lib 下 step2 编写 JDBC 代码 需要注意异常的处理 2 8 案例 添加员工 访问 MySql 数据库 step1 addEmpMySql html 页面内容 添加员工 姓名 薪水 年龄 step2 ListEmpServlet java 中 service 方法内容 Connection conn null try Class forName com mysql jdbc Driver conn DriverManager getConnection jdbc mysql localhost 3306 db chang root Statement state conn createStatement ResultSet rs state executeQuery select from chang emp order by id response setContentType text html charset utf 8 PrintWriter out response getWriter out println out println id姓名薪水年龄 while rs next long id rs getLong id String name rs getString name double salary rs getDouble salary int age rs getInt age out println id name salary age out println out println 再次添加新员工 out close catch Exception e e printStackTrace finally if conn null try conn close catch SQLException e e printStackTrace step3 AddEmpMySql java 中 service 方法内容 request setCharacterEncoding utf 8 String nameStr request getParameter name String salaryStr request getParameter salary String ageStr request getParameter age PrintWriter out response getWriter Connection conn null 将员工信息插入到数据库 try Class forName com mysql jdbc Driver conn DriverManager getConnection jdbc mysql localhost 3306 db chang root 此处不妥 若插入中文数据 会出现乱码 具体措施详见第三章 PreparedStatement prep conn prepareStatement insert into chang emp name salary age values prep setString 1 nameStr prep setDouble 2 Double parseDouble salaryStr prep setInt 3 Integer parseInt ageStr prep executeUpdate response setContentType text html charset utf 8 out println 添加成功 out println 再次添加 不使用重定向 response sendRedirect list 使用重定向 详见第四章 out close catch Exception e 异常发生之后 首先记录日志 一般会将日志记录到文件里面 可以用一 些日志工具 比如 log4j 来记录 e printStackTrace 接下来 看异常能否恢复 如果能 则编写处理代码 如果不能 则提 示用户稍后重试 一般来说 系统异常是不能恢复的 所谓系统异常 指的是 不是因为程序的原因产生的异常 比如 数据库服务停止 连接数据库的网络 中断等 response setContentType text html charset utf 8 out println 系统繁忙 稍后重试 out println 重试 finally 与 step2 相同 此处略 step4 web xml 内容 为了省纸 采取如下格式 AddEmpMySql Servletday02 AddEmpMySql ListEmpServlet Servletday02 ListEmpServlet AddEmpMySql addempmysql ListEmpServlet list step5 在浏览器地址栏输入 http localhost 8080 应用名 list 则访问出员工列表 页面 异常 IllegalStateException 出现如下错误可以不用理会 是因为 Tomcat 热部署造成的 重新手动部署 一下即可 3 编码问题 3 1 Java 语言在内存当中默认使用的字符集 默认会用 Unicode 编码格式 字符集 来保存字符 3 2 编码 把 Unicode 这种编码格式对应的字节数组 转换成某种本地编码格式 比 如 GBK 对应的字节数组 从而保存 Unicode GBK 3 3 解码 把某种本地编码格式的字节数组转换成 Unicode 这种编码格式对应的字节 数组 GBK Unicode 注意事项 服务器默认使用 ISO 8859 1 编码格式 使用 1 个字节保存 无法存中文 因此中文会出现乱码 3 4 Servlet 如何输出中文 需要调用 response setContentType text html charset utf 8 其中 charset utf 8 表示 1 用来指定编码格式 只要支持中文即可 比如也可设置为 charset gbk 2 作用两个 生成一个 content type 消息头 告诉浏览器返回的数据类 型和编码格式 服务器在输出时 会使用指定的编码格式进行编码 3 5 如果表单有中文参数值 也需要注意编码问题 因为 当表单提交的时候 浏览器会对表单中的数据进行编码 会使用打 开表单时的编码格式进行编码 而服务器默认情况下 会使用 ISO 8859 1 去 解码 所以 会产生乱码问题 1 解决方式一 step1 先保证表单所在的页面按照指定的编码格式打开 即 已是 一种规范 模拟 content type 消息头 告诉浏览器正在解析的数据类型和编码格 式 step2 调用 request setCharacterEncoding utf 8 意思是告诉服务器 使 用指定的编码格式进行解码 注意事项 该方法只能用于 post 请求 注意代码放置顺序 在 request getParameter 方法前 2 解决方式二 step1 同方式一的第一步 step2 使用 new String str getBytes iso 8859 1 utf 8 比如 String name request getParameter uname name new String name getBytes iso 8859 1 utf 8 3 6 案例 根据请求正确显示中文 step1 表单页面 请输入数量 打招呼的人 step2 HelloWorldServlet 类中 service 方法写 request setCharacterEncoding utf 8 方式一 String qtyStr request getParameter qty 读请求参数值 int qty Integer parseInt qtyStr 转成整数 String uname request getParameter uname uname new String uname getBytes iso 8859 1 utf 8 方式二 String rs 处理请求 生成处理结果 for int i 0 i qty i rs 你好 uname 输出处理结果 设置一个消息头 content type 告诉浏览器返回的数据 类型是一个 html 文档 以及编码格式 此外 还可以告诉服务器 在使用 out 输出时 使用指定的编码格式进行编码 response setContentType text html charset utf 8 PrintWriter out response getWriter 通过响应对象 获得一个输出流 out println rs 调用流的方法进行输出 其实质是将处理结果写到了 response 对象上 out close 3 7 将中文数据插入到数据库 程序从内存 Unicode 编码格式 数据库中的某种本地格式 step1 要确保数据库支持中文 即正确设置数据库的字符集 例如 建 MySql 的数据库时设置编码 create database db chang default character set utf8 step2 JDBC 驱动必须能够正确地进行编码和解码 有些 MySql 的驱动不能够 正确进行编码和解码 默认使用 ISO 8859 1 进行编码和解码 可以在 JDBC 的 URL 后添加 useUnicode true 注意事项 MySql 中 utf 不能写 记得数据库名后有个 MySql 客户端也是一个程序 也会有编码问题 若你的程序中数据显示 正常 而 MySql 客户端中查询的数据为乱码 则更改下编码 使用 set names gbk 命令 4 重定向 4 1 什么是重定向 服务器发送一个 302 状态码及一个 Location 消息头 值是一个地址 称为 重定向地址 通知浏览器立即向重定向地址发请求 4 2 如何重定向 使用 response sendRedirect String url 4 3 注意两个问题 1 重定向之前 不要调用 out close 会报错 out println 添加成功 能看到这个输出 如果不写这个输出 则响应为 空白页 out close response sendRedirect list 看不到重定向结果 2 重定向之前 服务器会先清空 response 对象上缓存的数据 Servlet 只允 许同时发送一个响应 out println 添加成功 看不到这个输出 缓存数据被清空 响应一 response sendRedirect list 能看到重定向结果 响应二 out close 4 4 两个特点 1 重定向的地址是任意的 前提要存在否则报 404 2 重定向之后 浏览器地址栏的地址会变成重定向地址 5 DAO 5 1 什么是 DAO Data Access Object 即封装了数据访问逻辑的一个模块 5 2 如何写一个 DAO step1 实体类 为了方便对数据库中的记录进行操作而封装的一个普通的 Java 类 比如 有一个表 chang emp 可以根据表中的字段设计一个 Employee 类 属性名与表 中的字段名相同 且有 get set 方法 step2 声明 DAO 接口 声明一系列方法 这些方法不应该涉及任何具体的数据库访问技术 比如 EmployeeDAO 接口 public ResultSet findAll 错误的 因为 ResultSet 限制了只能是用 JDBC 来实现 public List findAll throws SQLException 错误的 因为限制了只能 是用 JDBC 来实现 SQLException 是 JDBC 的错误 public List findAll 正确的 public List findAll throws Exception 正确的 step3 DAO 实现 使用具体的技术来实现 DAO 接口 比如 EmployeeDAOJdbcImpl 类 step4 DAO 工厂 Connection conn DriverManager getConnection DriverManager 就是个工厂 类 调用者通过 DriverManager 工厂类获得一个符合 Connection 接口要求的对 象 conn 5 3 工厂类 封装了对象的创建细节 为调用者提供符合要求的对象 详细介绍见第六 章 6 工厂设计模式 6 1 什么是工厂 工厂是一个设计模式 所谓设计模式 是为解决一类相同或者相似的问题 提出的一套解决方案 并且会对这个解决方案命名 比如工厂就是一个常用的 设计模式 6 2 使用工厂设计模式的好处 1 工厂为调用者提供符合接口要求的对象 对这对象一般称为产品 这 样做的好处是 调用者不用了解对象的创建细节 这样 当对象创建过程发生 改变 不会影响到调用者 2 工厂也可以从配置文件来获得接口与其对应的实现类的配置信息 这样 当实现类发生改变时 也不用再去修改工厂类的源代码了 6 3 如何使用工厂模式 现在做这样一个假设 假如我们的底层数据访问不再使用 JDBC 而采用 Hibernate 框架技术 后续会学习 此处做了解 那么我们需要为 EmployeeDAO 增加一个实现 EmployeeDAOHibernateImpl java 并且修改之前的代码 DelEmpServlet AddEmpServlet ListEmpServlet LoadEmpServlet ModifyEmp Servlet 都要做相应修改 new 的地方都要换成 EmployeeDAOHibernateImpl 对象 6 4 案例 添加新功能 并使用 DAO 和工厂模式 step1 创建 DBUtil java 类 专门用于连接和关闭数据库 public static Connection getConnection throws Exception Connection conn null try Class forName com mysql jdbc Driver conn DriverManager getConnection jdbc mysql localhost 3306 db chang useUnicode true catch Exception e e printStackTrace throw e return conn public static void close Connection conn if conn null try conn close catch SQLException e e printStackTrace step2 创建 Employee java 实体类 有 id name salary age 四个属性 以及 get set 方法 step3 创建 DAO 接口 EmployeeDAO public List findAll throws Exception public void add Employee e throws Exception public void delete long index throws Exception public void modify Employee e throws Exception public Employee findById long id throws Exception step4 创建 DAO 接口的实现类 EmployeeDAOJdbcImpl public List findAll throws Exception 查找所有员工 List employees new ArrayList Connection conn DBUtil getConnection Statement state conn createStatement ResultSet rs state executeQuery select from chang emp order by id while rs next int id rs getInt id String name rs getString name double salary rs getDouble salary int age rs getInt age Employee e new Employee e setId id e setName name e setSalary salary e setAge age employees add e DBUtil close conn return employees public void add Employee e throws Exception 添加员工 Connection conn DBUtil getConnection PreparedStatement prep conn prepareStatement insert into chang emp name salary age value prep setString 1 e getName prep setDouble 2 e getSalary prep setInt 3 e getAge prep executeUpdate DBUtil close conn public void delete long index throws Exception 删除员工 Connection conn DBUtil getConnection PreparedStatement prep conn prepareStatement delete from chang emp where id prep setLong 1 index prep executeUpdate DBUtil close conn public void modify Employee e throws Exception 修改员工 Connection conn DBUtil getConnection PreparedStatement prep conn prepareStatement update chang emp set name salary age where id prep setString 1 e getName prep setDouble 2 e getSalary prep setInt 3 e getAge prep setLong 4 e getId prep executeUpdate DBUtil close conn public Employee findById long id throws Exception 根据 id 查找员工 Connection conn DBUtil getConnection PreparedStatement prep conn prepareStatement select from chang emp where id prep setLong 1 id ResultSet rs prep executeQuery Employee e null if rs next e new Employee e setId id e setName rs getString name e setSalary rs getDouble salary e setAge rs getInt age DBUtil close conn return e step5 创建 Factory java 工厂类 public static Object getInstance String type Object obj null if EmployeeDAO equals type obj new EmployeeDAOJdbcImpl obj new EmployeeDAOHibernateImpl 当不再使用 JDBC 连接数据库时 如 HibernateI 连接时 就需要更改每个 new EmployeeDAOJdbcImpl 不方便维 护 使用工厂模式就可以统一更改了 return obj step6 修改 AddEmpMySql java 中的 try 块 finally 块也不需要了 DAO 中调 用了 DBUtil 的关闭 try EmployeeDAO dao EmployeeDAO Factory getInstance EmployeeDAO Employee e new Employee e setName name e setSalary salary e setAge age dao add e response sendRedirect list step7 修改 ListEmpServlet java 中的 try 块 finally 块也不需要了 DAO 中调 用了 DBUtil 的关闭 try EmployeeDAO dao EmployeeDAO Factory getInstance EmployeeDAO List Employees new ArrayList Employees dao findAll out println tr hover color red background silver out println id姓名薪水年龄 操作 for int i 0 i Employees size i Employee e Employees get i out println e getId e getName e getSalary e getAge 删除 修改 out println out println 再次添加新员工 step8 增加 DelEmpServlet java 类用于删除员工 其中 service 方法内容为 response setCharacterEncoding utf 8 PrintWriter out response getWriter long id Long parseLong request getParameter id try EmployeeDAO dao EmployeeDAO Factory getInstance EmployeeDAO dao delete id response sendRedirect list catch Exception e e printStackTrace out println 删除失败 请稍后再试 step9 增加 LoadEmpServlet java 类用于读取员工 其中 service 方法内容为 response setCharacterEncoding utf 8 PrintWriter out response getWriter long id Long parseLong request getParameter id try EmployeeDAO dao EmployeeDAO Factory getInstance EmployeeDAO Employee e dao findById id response setContentType text html charset utf 8 out println out println id id out println 姓名 out println 薪水 out println 年龄 或 out println out println out println catch Exception e e printStackTrace out println 读取失败 稍后再试 step10 增加 ModifyEmpServlet java 类用于修改员工 其中 service 方法内容为 response setCharacterEncoding utf 8 request setCharacterEncoding utf 8 PrintWriter out response getWriter long id Long parseLong request getParameter id String name request getParameter name double salary Double parseDouble request getParameter salary int age Integer parseInt request getParameter age try EmployeeDAO dao EmployeeDAO Factory getInstance EmployeeDAO Employee e new Employee e setId id e setName name e setSalary salary e setAge age dao modify e response sendR
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!