当前位置:   article > 正文

svn中文路径乱码_SXT DAY064 上传下载功能和SVN使用

stortoisesvn checkout 中文乱码

上传下载功能

文件的上传

理解上传思路:

  • 稍微复杂一些 直接使用Servlet实现有难度 一般使用apache commons组件中commons-fileUpload组件大大降低操作的难度。
  • commons-fileUpload离不开commons-io组件
  • commons-fileUpload的常用类
  • FileItemFactory DiskFileItemFactory:工厂类,生产FileItem
  • FileItem:每个表单项都会被封装成一个FileItem对象
  • ServletFileUpload:实现上传操作,将表单数据封装到FileItem中

实现

添加jar commons-fileupload.jar commons-io.jar

2ef5dc303c05e8c3141c596ade827bd7.png

视图层

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>My JSP 'add.jsp' starting page</title>
  11. <meta http-equiv="pragma" content="no-cache">
  12. <meta http-equiv="cache-control" content="no-cache">
  13. <meta http-equiv="expires" content="0">
  14. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  15. <meta http-equiv="description" content="This is my page">
  16. <!--
  17. <link rel="stylesheet" type="text/css" href="styles.css">
  18. -->
  19. </head>
  20. <body>
  21. ${requestScope.mess }
  22. <form action="servlet/AddServlet" method="post" enctype="multipart/form-data" >
  23. 用户名:<input type="text" name="name"><br>
  24. 年龄:<input type="text" name="age"><br>
  25. 分数:<input type="text" name="score"><br>
  26. 图片:<input type="file" name="photo"><br>
  27. <input type="submit" value="提交">
  28. </form>
  29. </body>
  30. </html>

控制层 掌握FileItem的常用方法

  • item.isFormField() 如果是普通表单项true,如果是file表单项,false
  • item.getFieldName() 表单项的name属性
  • item.getString() 普通表单项的值,file表单项就是file的内容
  • item.getString(“utf-8”) 解决普通表单项的中文乱码问题
  • item.getName() 普通表单项就是null,file表单项就是文件的名称
  • item.getContentType() 普通表单项是null,file表单项就是文件的类型
  • item.getSize():表单项内容长度
  1. public void doPost(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. //1.创建FileItemFactory对象
  4. FileItemFactory factory=new DiskFileItemFactory();
  5. //2.创建ServletFileUpload对象
  6. ServletFileUpload upload=new ServletFileUpload(factory);
  7. upload.setHeaderEncoding("utf-8");解决file表单项的文件名中文乱码问题
  8. //3.通过 ServletFileUpload对象实现上传操作 将客户端一个个表单项封装到一个FileItem中
  9. List<FileItem> itemList=null;
  10. try {
  11. itemList=upload.parseRequest(request);
  12. } catch (FileUploadException e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. }
  16. //4.遍历各个FileItem 相当于对各个表单项进行处理
  17. // System.out.println(itemList.size());
  18. for (int i = 0; i < itemList.size(); i++) {
  19. //取出第i个表单项
  20. FileItem item=itemList.get(i);
  21. //输出itemList的内容 熟悉FileItem的主要方法
  22. System.out.println(item.isFormField());//是否是file表单项 是file false 不是file true
  23. System.out.println(item.getFieldName());//表单项的name属性的值
  24. //System.out.println(item.getString());//对于非file表单项,value属性的值对于file表单项,是文件内容
  25. System.out.println(item.getString("utf-8"));//解决非file表单项的中文乱码问题 比如name
  26. System.out.println(item.getName());//对于file表单项,上传文件的名称对于非file表单项,返回null
  27. System.out.println(item.getContentType());//对于file表单项,上传文件的名称对于非file表单项,返回null
  28. System.out.println(item.getSize());//对于file表单项,上传文件的大小 对于非file表单项,value值的宽度
  29. System.out.println("===========================================");
  30. }
  31. int n = 1;
  32. // 页面跳转
  33. if (n != 0) {
  34. // 重定向:/后面要跟上下文路径 /stumgr /stumgr2
  35. response.sendRedirect(request.getContextPath()
  36. + "/servlet/ShowAllServlet");
  37. } else {
  38. request.setAttribute("mess", "添加失败!");
  39. request.getRequestDispatcher("/add.jsp").forward(request, response);
  40. }
  41. }

运行结果: 添加用户名为英文

52e0382db0d8a897b6fa6f93acb4c3d3.png

遍历结果

8aa291f799f4cd2be4712bbc84eb052d.png

解决中文乱码问题

  • 解决file表单项中文乱码问题: upload.setHeaderEncoding("utf-8");
  • 解决普通表单项的中文乱码问题: item.getString(“utf-8“)

运行结果

476d1ce8ccfb1c8a9d6a9afb6ac57d3f.png

90f785fbb59884a2060caf2dcd9e8eb7.png

69310b1a730a30685b99bd9221322cb6.png

上传文件到指定目录保存到数据库

实体类

  1. /**
  2. * 学生实体类
  3. * @author Administrator
  4. *
  5. */
  6. public class Student {
  7. private int id;
  8. private String name;
  9. private int age;
  10. private double score;
  11. private String realName;
  12. private String photoName;
  13. private String photoType;
  14. public Student() {
  15. super();
  16. // TODO Auto-generated constructor stub
  17. }
  18. public Student(int id, String name, int age, double score) {
  19. super();
  20. this.id = id;
  21. this.name = name;
  22. this.age = age;
  23. this.score = score;
  24. }
  25. public Student(String name, int age, double score) {
  26. super();
  27. this.name = name;
  28. this.age = age;
  29. this.score = score;
  30. }
  31. public Student(int id, String name, int age, double score, String realName,
  32. String photoName, String photoType) {
  33. super();
  34. this.id = id;
  35. this.name = name;
  36. this.age = age;
  37. this.score = score;
  38. this.realName = realName;
  39. this.photoName = photoName;
  40. this.photoType = photoType;
  41. }
  42. public Student(String name, int age, double score, String realName,
  43. String photoName, String photoType) {
  44. super();
  45. this.id = id;
  46. this.name = name;
  47. this.age = age;
  48. this.score = score;
  49. this.realName = realName;
  50. this.photoName = photoName;
  51. this.photoType = photoType;
  52. }
  53. // private Date birthDate;//生日
  54. // private java.util.Date inputTime;//录入时间
  55. // private String photoName;//照片名称
  56. // private String photoType;//照片类型
  57. public int getId() {
  58. return id;
  59. }
  60. public void setId(int id) {
  61. this.id = id;
  62. }
  63. public String getName() {
  64. return name;
  65. }
  66. public void setName(String name) {
  67. this.name = name;
  68. }
  69. public int getAge() {
  70. return age;
  71. }
  72. public void setAge(int age) {
  73. this.age = age;
  74. }
  75. public double getScore() {
  76. return score;
  77. }
  78. public void setScore(double score) {
  79. this.score = score;
  80. }
  81. public String getRealName() {
  82. return realName;
  83. }
  84. public void setRealName(String realName) {
  85. this.realName = realName;
  86. }
  87. public String getPhotoName() {
  88. return photoName;
  89. }
  90. public void setPhotoName(String photoName) {
  91. this.photoName = photoName;
  92. }
  93. public String getPhotoType() {
  94. return photoType;
  95. }
  96. public void setPhotoType(String photoType) {
  97. this.photoType = photoType;
  98. }
  99. }

showAll.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>My JSP 'showAll.jsp' starting page</title>
  12. <meta http-equiv="pragma" content="no-cache">
  13. <meta http-equiv="cache-control" content="no-cache">
  14. <meta http-equiv="expires" content="0">
  15. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  16. <meta http-equiv="description" content="This is my page">
  17. <!--
  18. <link rel="stylesheet" type="text/css" href="styles.css">
  19. -->
  20. </head>
  21. <body>
  22. <!--输出所有的学生信息 -->
  23. <a href="add.jsp">添加学生信息</a>
  24. <table align="center" border="1" width="70%">
  25. <tr>
  26. <th>编号</th>
  27. <th>姓名</th>
  28. <th>年龄</th>
  29. <th>分数</th>
  30. <th>照片</th>
  31. <th>下载</th>
  32. </tr>
  33. <c:forEach items="${requestScope.stuList2}" var="stu" >
  34. <tr>
  35. <td>${stu.id}</td>
  36. <td>${stu.name }</td>
  37. <td>${stu.age }</td>
  38. <td>${stu.score}</td>
  39. <td><img src="upload/${stu.photoName }" alt="" width="100px"/></td>
  40. <td>
  41. <a href="upload/${stu.photoName }">下载1</a>
  42. <a href="servlet/DownServlet?id=${stu.id}">下载2</a>
  43. </td>
  44. </tr>
  45. </c:forEach>
  46. </table>
  47. </body>
  48. </html>

AddServlet

  1. public void doPost(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. //1.创建FileItemFactory对象
  4. FileItemFactory factory=new DiskFileItemFactory();
  5. //2.创建ServletFileUpload对象
  6. ServletFileUpload upload=new ServletFileUpload(factory);
  7. upload.setHeaderEncoding("utf-8");解决file表单项的文件名中文乱码问题
  8. //完善5:限制上传的单个和所有文件的大小 建议使用该方式
  9. upload.setFileSizeMax(200*1024);//单个文件的上限
  10. upload.setSizeMax(5*200*1024);//一次上传的所有文件的总大小的上限
  11. //3.通过 ServletFileUpload对象实现上传操作 将客户端一个个表单项封装到一个FileItem中
  12. List<FileItem> itemList=null;
  13. try {
  14. itemList=upload.parseRequest(request);
  15. } catch (FileUploadException e) {
  16. e.printStackTrace();
  17. request.setAttribute("mess", "文件不能超过200kb....");
  18. request.getRequestDispatcher("/add.jsp").forward(request, response);
  19. return;
  20. }
  21. //4.遍历各个FileItem 相当于对各个表单项进行处理
  22. // System.out.println(itemList.size());
  23. String name=null;
  24. int age=0;
  25. double score=0;
  26. String realName=null;
  27. String photoName=null;
  28. String photoType=null;
  29. for (int i = 0; i < itemList.size(); i++) {
  30. //取出第i个表单项
  31. FileItem item=itemList.get(i);
  32. String filedName=item.getFieldName();
  33. //对各个表单项进行处理(普通表单项和文件表单项要分开处理)
  34. if(item.isFormField()){ //是普通表单项
  35. if ("name".equals(filedName)) {
  36. name=item.getString("utf-8");
  37. }
  38. if ("age".equals(filedName)) {
  39. age=Integer.parseInt(item.getString());
  40. }
  41. if ("score".equals(filedName)) {
  42. score=Integer.parseInt(item.getString());
  43. }
  44. }else{ //文件表单项
  45. if ("photo".equals(filedName)) {
  46. //完善5: 限制上传文件大小 200kb 在此处 采用此种方法限制文件大小 不合适
  47. // long size=item.getSize();
  48. // if (size>200*1024) {
  49. // request.setAttribute("mess", "文件不能超过200kb");
  50. // request.getRequestDispatcher("/add.jsp").forward(request, response);
  51. // return;
  52. // }
  53. //完善4:只上传jpg、jpeg和gif文件
  54. String contentType=item.getContentType();
  55. photoType=item.getContentType();
  56. if (!"image/jpeg".equals(contentType)&&!"image/gif".equals(contentType)) {
  57. request.setAttribute("mess", "只能上传jpg和gif");
  58. request.getRequestDispatcher("/add.jsp").forward(request, response);
  59. return;
  60. }
  61. //指定上传的文件夹 Tomcat的webApps目录下,Tomcat的webApps目录之外
  62. //直接使用物理路径,不灵活
  63. //完善3:由逻辑路径得到物理路径,提高灵活性
  64. // File dir=new File("D:apache-tomcat-7.0.56webappsupdownload1upload");
  65. // String path="upload"; //逻辑路径
  66. String realPath=this.getServletContext().getRealPath("/upload");
  67. File dir=new File(realPath);
  68. //完善1:如果文件夹不存在 就创建
  69. if (!dir.exists()) {
  70. dir.mkdirs();
  71. }
  72. //指定上传的文件名
  73. realName=item.getName();
  74. //完善2:为了防止文件的同名覆盖 上传到服务器端的文件重新命名
  75. UUID uuid=UUID.randomUUID();
  76. String extName = realName.substring(realName.lastIndexOf("."));
  77. photoName=uuid.toString()+extName;
  78. //指定上传的文件夹和文件名
  79. File file=new File(dir,photoName);
  80. //上传该照片到指定位置
  81. try {
  82. item.write(file);
  83. } catch (Exception e) {
  84. // TODO Auto-generated catch block
  85. e.printStackTrace();
  86. }
  87. }
  88. }
  89. }
  90. Student stu=new Student(name, age, score, realName, photoName, photoType);
  91. StudentService stuService=new StudentServiceImpl();
  92. int n=stuService.save(stu);
  93. // 页面跳转
  94. if (n != 0) {
  95. // 重定向:/后面要跟上下文路径 /stumgr /stumgr2
  96. response.sendRedirect(request.getContextPath()
  97. + "/servlet/ShowAllServlet");
  98. } else {
  99. request.setAttribute("mess", "添加失败!");
  100. request.getRequestDispatcher("/add.jsp").forward(request, response);
  101. }
  102. }

ShowAllServlet

  1. public void doPost(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. //按照查询条件进行查询
  4. StudentService stuBiz = new StudentServiceImpl();
  5. List<Student> stuList = stuBiz.findAll();
  6. request.setAttribute("stuList2", stuList);
  7. //页面跳转
  8. request.getRequestDispatcher("/showAll.jsp").forward(request, response);
  9. }

StudentService

  1. /**
  2. * 查找所有学生信息
  3. * @return
  4. */
  5. public List<Student> findAll();
  6. /**
  7. * 添加学生信息
  8. * @param stu
  9. * @return
  10. */
  11. public int save(Student stu);

StudentServiceImpl

  1. private StudentDao stuDao = new StudentDaoImpl();
  2. public List<Student> findAll() {
  3. return this.stuDao.findAll();
  4. }
  5. public int save(Student stu) {
  6. return this.stuDao.save(stu);
  7. }

StudentDao

  1. /**
  2. * 查找所有学生信息
  3. * @return
  4. */
  5. public List<Student> findAll();
  6. /**
  7. * 添加学生信息
  8. * @param stu
  9. * @return
  10. */
  11. public int save(Student stu);

StudentDaoImpl

  1. public List<Student> findAll() {
  2. List<Student> stuList = new ArrayList<Student>();
  3. Connection conn = null;
  4. Statement stmt = null;
  5. ResultSet rs = null;
  6. try {
  7. //获取连接
  8. conn = DBUtil.getConnection();
  9. //发送命令或获取结果
  10. stmt = conn.createStatement();
  11. //处理结果
  12. rs =stmt.executeQuery("select * from stu");
  13. while(rs.next()){
  14. //获取各个字段的值
  15. int id =rs.getInt("id");
  16. String name = rs.getString("name");
  17. int age = rs.getInt("age");
  18. double score = rs.getDouble("score");
  19. String realName=rs.getString("realName");
  20. String photoName=rs.getString("photoName");
  21. String photoType=rs.getString("photoType");
  22. //由字段创建对象
  23. Student stu = new Student(id, name, age, score,realName,photoName,photoType);
  24. //将对象放入集合
  25. stuList.add(stu);
  26. }
  27. } catch (SQLException e) {
  28. // TODO Auto-generated catch block
  29. e.printStackTrace();
  30. }finally{
  31. //关闭资源
  32. DBUtil.closeAll(rs, stmt, conn);
  33. }
  34. //返回结果
  35. return stuList;
  36. }
  37. public int save(Student stu) {
  38. Connection conn = null;
  39. PreparedStatement pstmt = null;
  40. int n=0;
  41. try{
  42. //获取连接
  43. conn = DBUtil.getConnection();
  44. //发送命令或获取结果
  45. pstmt = conn.prepareStatement("insert into stu values(seq_stu.nextval,?,?,?,?,?,?)");
  46. pstmt.setString(1, stu.getName());
  47. pstmt.setInt(2, stu.getAge());
  48. pstmt.setDouble(3, stu.getScore());
  49. pstmt.setString(4, stu.getRealName());
  50. pstmt.setString(5, stu.getPhotoName());
  51. pstmt.setString(6, stu.getPhotoType());
  52. n = pstmt.executeUpdate();
  53. } catch (SQLException e) {
  54. // TODO Auto-generated catch block
  55. e.printStackTrace();
  56. }finally{
  57. //关闭资源
  58. DBUtil.closeAll(null, pstmt, conn);
  59. }
  60. return n;
  61. }

失败的运行结果 文件类型不符合要求时

168ae6484a2b9aae746f702e434bc328.png

eed9533909a6f95dd4b3d08b4aba3b4d.png

文件大小不符合要求时

837046948de878708300ce20e21511c6.png

bd377dece66ddd4286c0b99ffb7d1dcc.png

成功的运行结果

45d9451625812d1b1928d9d8a21e02e0.png

bff650a5caad9c8742bfd66402067ee1.png

数据库中

19d72cf07bf04af6f73b7c78cc176306.png

文件

530365fddbf3aac7137189e914773273.png

f517e1b1da3a37737b21818e2c4c626e.png

文件的下载

需求说明: 将服务器的图片在客户端下载

实现

DownServlet

  1. public class DownServlet extends HttpServlet {
  2. @Override
  3. protected void service(HttpServletRequest request, HttpServletResponse response)
  4. throws ServletException, IOException {
  5. //1获取学生编号
  6. int id=Integer.parseInt(request.getParameter("id"));
  7. //2根据编号调用业务层查询到该学生的所有信息(包括realname photoname...)
  8. StudentService stuService=new StudentServiceImpl();
  9. Student stu = stuService.findById(id);
  10. //3通过io流实现照片下载 (从服务器到客户端)
  11. //3.1创建一个输入流和输出流
  12. String realPath=this.getServletContext().getRealPath("/upload");
  13. String fileName=realPath+"/"+stu.getPhotoName();
  14. File file=new File(fileName);
  15. response.setContentLength((int) file.length()); //文件长度
  16. response.setContentType(stu.getPhotoType()); //MIME类型
  17. // response.setHeader("Content-disposition", "inline"); //默认
  18. String realName=stu.getRealName();// 汉字.jpg
  19. String userAgent=request.getHeader("User-Agent").toLowerCase();
  20. if (userAgent.indexOf("wow")>=0) { //ie浏览器
  21. realName=URLEncoder.encode(realName,"utf-8");
  22. } else { //其他浏览器
  23. realName=new String(realName.getBytes("utf-8"),"iso-8859-1");
  24. }
  25. response.setHeader("Content-disposition", "attachment;filename="+realName);
  26. InputStream is=new FileInputStream(file); //读服务器端的一个文件
  27. OutputStream os=response.getOutputStream(); //写到客户端
  28. //3.2 使用输入流和输出流完成复制 (服务器端----客户端)
  29. IOUtils.copy(is, os);
  30. //3.3关闭输入流和输出流
  31. is.close();
  32. os.close();
  33. //表单 method=get 表单提交的中文乱码解决
  34. //request.setCharacterEncoding("utf-8"); //post
  35. //String name = request.getParameter("name");
  36. // byte [] bytes = name.getBytes("iso-8859-1");
  37. // name = new String(bytes,"utf-8");
  38. //name = new String(name.getBytes("iso-8859-1"),"utf-8");
  39. // name=new String(name.getBytes("utf-8"),"iso-8859-1");
  40. }
  41. }

StudentService

  1. /**
  2. * 按照id查询学生信息
  3. * @param id
  4. * @return
  5. */
  6. public Student findById(int id);

StudentServiceImpl

  1. public Student findById(int id) {
  2. return this.stuDao.findById(id);
  3. }

StudentDao

  1. /**
  2. * 按照id查询学生信息
  3. * @param id
  4. * @return
  5. */
  6. public Student findById(int id);

StudentDaoImpl

  1. public Student findById(int idd) {
  2. Student stu = null;
  3. Connection conn = null;
  4. Statement stmt = null;
  5. ResultSet rs = null;
  6. try {
  7. //获取连接
  8. conn = DBUtil.getConnection();
  9. //发送命令或获取结果
  10. stmt = conn.createStatement();
  11. //处理结果
  12. rs =stmt.executeQuery("select * from stu where id = "+idd);
  13. rs.next();
  14. //获取各个字段的值
  15. int id =rs.getInt("id");
  16. String name = rs.getString("name");
  17. int age = rs.getInt("age");
  18. double score = rs.getDouble("score");
  19. String realName=rs.getString("realName");
  20. String photoName=rs.getString("photoName");
  21. String photoType=rs.getString("photoType");
  22. //由字段创建对象
  23. stu = new Student(id, name, age, score,realName,photoName,photoType);
  24. } catch (SQLException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }finally{
  28. //关闭资源
  29. DBUtil.closeAll(rs, stmt, conn);
  30. }
  31. //返回结果
  32. return stu;
  33. }

运行结果

点击下载 保存文件确定就下载成功

bf4a85b8745caf48fef7d0c8721ef4dd.png

SVN使用

一、 版本控制和SVN 入门

1. 什么是版本控制

a) 只要进行团队软件开发,就会涉及源代码的合并共享以及带来的相关问题

  • 代码如何合并(手工合并几乎不可能)
  • 历史版本的保存(各个版本间有大量重复,多大变化算一个版本)
  • 跟踪哪些代码是谁修改(每个代码都写上注释说明作者?故意写成别人呢)
  • 以上问题不解决,就会影响团队开发效率

b) 如何有效解决以上问题呢?这就需要版本控制

c) 目前计算机开发领域流行的是采用专门的版本管理软件来进行管理,大大提 高了效率

2. 常用版本管理软件

  1. VSS:Microsoft提供,Window平台,小型开发团队所适合的工具。
  2. CVS:开源工具,跨平台。绝大多数CVS服务已改用SVN。CVS已停止维护
  3. SVN(Subversion):开源,跨平台,在 CVS 的基础上开发。使用企业众多, 稳定安全,操作简单。集中式版本控制系统。
  4. GIT:开源的分布式版本控制系统,用以有效高速的处理从很小到非常大的项 目版本管理。(GITHUB 是一个用 GIT 做版本控制的项目托管平台,B/S 架构。 放到GITHUB上的代码需要开源,并且是互联网开发)

29ab829e4dfd9c5962d58c7aa4d3ff50.png

3. SVN

  1. 传统的SVN是通过命令进行操作的,现在一般通过 GUI形式使用 SVN
  2. 服务器端Visual SVN(GUI)
  3. 客户端:TortoiseSVN 第三方客户端(GUI)
  4. 客户端:subclipse Eclipse的插件 第三方客户端(GUI)
  5. TortoiseSVN功能更强、使用范围更广,但是 eclipse下使用subclipse更方便

二、 服务器端Visual SVN

1. 安装软件

2. 创建版本库

a) 创建默认结构 use default struction

fe6f8b078cdecdbd3e580ca313f8b3b6.png

b) 默认结构的含义

  • trunk:主干 开发时代码存储的位置,永远是最新的代码
  • brank:分支 在不影响Trunk其它用户情况下进行一些关于新功能的探 索性或实验性的开发,待新功能完善后它也可以合并到 Trunk中
  • tags:标签 历史版本 阶段性里程碑版本 比如1.0 2.0 3.0

b74a848f54813e9e70eb35b15d83d54b.png

3. 创建用户

c03d33c45ab6ad4c68773bce577af307.png

4. 创建组

8f109611f5723a5d8289ea465946441b.png

5. 为组指定用户

1b4f7f578717eb557921ed080a1e88ff.png

6. 为组指定对版本库的操作权限

a) 默认everyone具有 read/write权限,无法删除,要修改为 no access

b866e3cb7fff104989eecffce2bba6ce.png

7. 通过浏览器访问服务器端

add5669be8c70c83f9e99652fb50efe4.png

9b6ea44d67f6e10a65d0ba5347d4e0c8.png

三、 客户端subclipse

1. 简介

  • subclipse=subversion+eclipse
  • 一个为 Eclipse添加 Subversion 支持的项目。支持几乎所有版本的Eclipse

2. 安装

  • 解压后将其中的 features和plugin文件夹放入MyEclipse的dropins目录下
  • 重新启动MyEclipse,即可自动发现并安装
  • 安装后在window------preferrences---—team中可以看到SVN

68be0d90b1bc835b552ed798e8929a31.png

3. 提交项目到服务器端

  • 选中项目右键--------team----share project----选择SVN
  • 提交版本位置、用户名、密码都会由相关服务器管理人员提供。
  • 可以选择记住密码,避免多次的重复输入。
  • 提交后会跳到 team synchronizing view,还需要真正同步代码到服务器,同 步之前可以选择哪些代码不需要使用 svn进行管理
  • 提交成功后可以观察版本库容量的变化
  • 提交成功后客户端项目会显示专门的标记,并且增加了相应的.svn项目,来 存储操作记录

4. 断开和服务器连接

  • team—断开连接--------从项目中删除SVN 元信息

5. 客户端从SVN检出项目

  • new--- Project…--------SVN----从SVN检出项目

6. 更新和提交操作

  • 更新将服务器最新代码更新到本地;提交是将本地最新代码提交到服务器
  • 提交之前要先更新,因为可能其他程序员期间以及提交了最新代码到服务器
  • 提交一定要给出注释,对提交内容进行说明,作为以后辨别版本的主要依据。

7. 解决冲突

  • 模拟两个用户对一个类进行修改,分别修改相同的方法和增加一个新方法
  • 更新后出现冲突,和冲突方沟通后,对冲突文件给出最终解决方案
  • 还需要team----标记为解决,相应冲突文件为自动删除,当前文件由冲突状态 转换为已修改状态,待提交

8. 还原没有提交的代码

  • team----还原

9. 还原已经提交的代码

  • 如果最新的代码出现问题,可以直接修改,也可以回滚到之前的某个历史版 本,直接使用或者进行修改
  • 查看资源历史记录
  • 根据注释确定要还原的版本,无法确定可以查看或者比较代码
  • 确定版本后,右键选择”从修订班x回复更改”
  • 可能出现冲突,解决后提交代码到服务器
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/111199
推荐阅读
相关标签
  

闽ICP备14008679号