学习主题:OA系统
学习目标:掌握web开发项目实战,熟练使用web开发基础技术
文件上传下载展示和思路
图片的上传,是把图片数据以二进制的方式放入数据库,还是把图片上传到服务器的某个目录下,数据库记录这个目录?哪种方式好?
图片上传到tomcat中webapps目录下,数据库中记录图片名称及图片类型
图片的上传下载在java中有哪些jar包支持?
commons-fileupload.jar
commons-io.jar
开始上传并理解上传API的作用
简述文件上传的步骤
创建FileItemFactory对象
创建ServletFileUpload对象
通过servletFileUpload实现上传操作,将客户端表单项封装到FileItem中
对表单项进行处理
FileItem类的方法有哪些,分别是什么意思?
System.out.println(item.isFormField());//是否是file表单项 是返回false 否返回true
System.out.println(item.getFieldName());//表单项name的属性的值
System.out.println(item.getString());//对于非file表单项,value属性的值,对于field表单项,返回文件内容
System.out.println(item.getName());//对于file表单项,上传文件的名称,对于非file表单项,返回null
System.out.println(item.getContentType());//对于file表单项,上传文件类型,对于非file表单项,返回null
System.out.println(item.getSize());//对于file表单项,上传文件的大小,对于非file表单项,返回value值的宽度
上传文件到指定目录
如何上传文件到指定目录?写出步骤
使用item.getFieldName()方法获取文件名
指定上传的文件夹(指定上传的位置)和文件名
获取指定的文件夹和文件名
使用item.write(file)上传文件到指定位置
完善上传文件到指定目录
本节课完善了文件上传的哪些点?实现代码是什么?
1.如果文件夹不存在,就创建
if(!dir.exists()){
dir.mkdirs();
}
2.为防止文件的同名覆盖,上传到服务器的文件重新命名
UUID uuid = UUID.randomUUID();
String extName = realName.substring(realName.lastIndexOf("."));
photoName = uuid.toString()+extName;
3.上传路径由物理路径变成逻辑路径,不再将路径写成固定位置
String realPath = this.getServletContext().getRealPath("/upload");
4.只能上传jpg、jpeg、gif格式文件
String contentType = item.getContentType(); //获取文件类型
photoType = item.getContentType();
if(!"image/jpeg".equals(contentType) && !"image/gif".equals(contentType)){
request.setAttribute("mess", "只能上传jpg或gif格式文件");
request.getRequestDispatcher("/add.jsp").forward(request, response);
return;
}
5.限制上传文件大小
upload.setFileSizeMax(800*1024); //单个文件的上限
upload.setSizeMax(5*800*1024); //一次上传的上限(多个)
保存上传信息到数据库
本节课要往数据库里面存哪些数据?这些数据的作用是什么?
在原有的基础上增加了realName、photoName和photoType属性,
realName属性用来展示图片的真实名称,希望客户端在下载图片的时候还是使用原来的真实名称进行下载,
photoName用来存储UUID名称,
photoType用来存储图片的类型
将服务器的图片在客户端下载
简述下载的步骤,视图层怎么写,控制层怎么写?贴出代码,并写出注释
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取学生编号
int id = Integer.parseInt(req.getParameter("id"));
//根据编号调用业务层对象查询到该学生的全部信息(包括realName,photoName,photoType)
StudentService ss = new StudentServiceImpl();
Student stu = ss.findById(id);
//通过IO流实现照片的下载(从服务器端到客户端)
//创建输入流和输出流
//静态路径
//String fileName ="D:\\bjsxtSoftWare/apache-tomcat-7.0.69/webapps\\updownload1\\upload"+stu.getPhotoName();
String realPath = this.getServletContext().getRealPath("/upload");
String fileName = realPath+"/"+stu.getPhotoName();
File file = new File(fileName);
InputStream is = new FileInputStream(file); //从服务器端读取
OutputStream os = resp.getOutputStream(); //写到客户端
//使用输入输出流完成复制操作(服务器端--客户端)
IOUtils.copy(is, os);
//关闭输入输出流
is.close();
os.close();
}
public Student findById(int idd) {
Student stu = null;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//获取连接
conn = DBUtil.getConnection();
//发送命令或获取结果
stmt = conn.createStatement();
//处理结果
rs =stmt.executeQuery("select * from stu_Student where id = "+idd);
rs.next();
//获取各个字段的值
int id =rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
double score = rs.getDouble("score");
String realName = rs.getString("realName");
String photoName = rs.getString("photoName");
String photoType = rs.getString("photoType");
//由字段创建对象
stu = new Student(id, name, age, score,realName,photoName,photoType);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//关闭资源
DBUtil.closeAll(rs, stmt, conn);
}
//返回结果
return stu;
}
完善下载操作
本节课完善了下载的哪些点?贴出对应代码和注释
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取学生编号
int id = Integer.parseInt(req.getParameter("id"));
//根据编号调用业务层对象查询到该学生的全部信息(包括realName,photoName,photoType)
StudentService ss = new StudentServiceImpl();
Student stu = ss.findById(id);
//通过IO流实现照片的下载(从服务器端到客户端)
//创建输入流和输出流
//静态路径
//String fileName ="D:\\bjsxtSoftWare/apache-tomcat-7.0.69/webapps\\updownload1\\upload"+stu.getPhotoName();
String realPath = this.getServletContext().getRealPath("/upload"); //"D:\\bjsxtSoftWare/apache-tomcat-7.0.69/webapps\\updownload1
String fileName = realPath+"/"+stu.getPhotoName();
File file = new File(fileName);
/**解决直接下载到浏览器问题*/
resp.setContentLength((int)file.length()); //文件长度
resp.setContentType(stu.getPhotoType()); //文件类型Mime
//resp.setHeader("Content-disposition", "inline"); //下载方式(默认inline,下载到浏览器上)
//解决get方式中文乱码问题(服务器端下载到浏览器到)
String realName = stu.getRealName();
String userAgent = req.getHeader("User-Agent").toLowerCase(); //获取浏览器信息
if(userAgent.indexOf("msie")>0){ //ie浏览器
realName = URLEncoder.encode(realName, "utf-8");
}else{
realName = new String(realName.getBytes("utf-8"),"iso-8859-1");
}
resp.setHeader("Content-disposition", "attachment;filename="+realName);
InputStream is = new FileInputStream(file); //从服务器端读取
OutputStream os = resp.getOutputStream(); //写到客户端
//使用输入输出流完成复制操作(服务器端--客户端)
IOUtils.copy(is, os);
//关闭输入输出流
is.close();
os.close();
}
版本管理和SVN入门
什么是版本管理?为什么需要版本管理?
版本管理指的是代码版本的管理。
只要进行团队软件开发,就会涉及代码的合并共享以及相关带来的问题,要想有效的解决问题,就需要用到版本管理。
除了svn外,还有哪些版本管理软件?
VSS、CVS、GIT
安装和使用Visual SVN
按照本节课的内容,安装svn并使用visual svn
Subclipse的安装和使用1
Subclipse的安装和使用2
简述在eclipse中安装svn插件的步骤,以及注意事项
1. 安装软件
a) 指定软件安装位置和版本库位置
b) 默认端口 443
c) 使用 SVN authentication
2. 创建版本库
a) 创建默认结构 use default struction
b) 默认结构的含义
i. trunk:主干 开发时代码存储的位置,永远是最新的代码
ii. brank:分支 在不影响 Trunk 其它用户情况下进行一些关于新功能的探索性或实验性的开发,待新功能完善后它也可以合并到 Trunk 中
iii. tags:标签 历史版本 阶段性里程碑版本 比如 1.0 2.0 3.0
3. 创建用户
4. 创建组
5. 为组指定用户
6. 为组指定对版本库的操作权限
a) 默认 everyone 具有 read/write 权限,无法删除,要修改为 no access
7. 通过浏览器访问服务器端
简述在eclipse中使用svn的方法
安装
a) 解压后将其中的 features 和 plugin 文件夹放入 MyEclipse 的 dropins 目录下
b) 重新启动 MyEclipse,即可自动发现并安装
c) 安装后在 window------preferrences---—team 中可以看到 SVN
1.提交项目到服务器端
a) 选中项目右键--------team----share project----选择 SVN
b) 提交版本位置、用户名、密码都会由相关服务器管理人员提供。
c) 可以选择记住密码,避免多次的重复输入。
d) 提交后会跳到 team synchronizing view,还需要真正同步代码到服务器,同步之前可以选择哪些代码不需要使用 svn 进行管理
e) 提交成功后可以观察版本库容量的变化
f) 提交成功后客户端项目会显示专门的标记,并且增加了相应的.svn 项目,来存储操作记录
2. 断开和服务器连接
a) team—断开连接--------从项目中删除 SVN 元信息
3. 客户端从 SVN 检出项目
a) new--- Project…--------SVN----从 SVN 检出项目
4. 更新和提交操作
a) 更新将服务器最新代码更新到本地;提交是将本地最新代码提交到服务器
b) 提交之前要先更新,因为可能其他程序员期间以及提交了最新代码到服务器
c) 提交一定要给出注释,对提交内容进行说明,作为以后辨别版本的主要依据。
5. 解决冲突
a) 模拟两个用户对一个类进行修改,分别修改相同的方法和增加一个新方法
b) 更新后出现冲突,和冲突方沟通后,对冲突文件给出最终解决方案
c) 还需要 team----标记为解决,相应冲突文件为自动删除,当前文件由冲突状态转换为已修改状态,待提交
6. 还原没有提交的代码
a) team----还原
7. 还原已经提交的代码
a) 如果最新的代码出现问题,可以直接修改,也可以回滚到之前的某个历史版本,直接使用或者进行修改
b) 查看资源历史记录
c) 根据注释确定要还原的版本,无法确定可以查看或者比较代码
d) 确定版本后,右键选择”从修订班 x 回复更改”
e) 可能出现冲突,解决后提交代码到服务器
@杜程程 BjSXT百战卓越鏖战第五十六天
今天,十字路口红绿灯下,目送告别一起在北京奋斗56天的一个同门师兄弟。
每个人都有自己的选择,无论结果怎样,我都尊重你做出的决定。
再见!