step1,创建maven web project,
-
- 参见教程(并没有完全根据该教程操作,具体操作过程有参见changkongProject)
step2,往项目中添加网上下载的若干view层模板
-
- 参见教程
step3,在工程中添加“注册”页面/src/main/webapp/jsp/register.html,并且使用JavaScript和正则表达式+HTML的onSubmit事件对用户输入的信息进行合法性验证
-
- 在/src/main/webapp/jsp/login.html 的基础上创建register.html
- 主要是将<form>中的子标签改成如下形式:
<form method="post" class="am-form"> <label for="email">用户名:</label> <input type="text" name="" id="username" value="admin" maxlength="20"> <br> <label for="password">密码:(请输入密码)</label> <input type="password" name="" id="password" value=""> <br> <label for="password">请确认密码:(请再次输入密码)</label> <input type="password" name="" id="password" value=""> <br> <label for="email">邮箱:</label> <input type="text" name="" id="email" value="请保证邮箱地址有效,便于密码找回"> <br> <br /> <div class="am-cf"> <input type="submit" name="" value="注册" class="am-btn am-btn-primary am-btn-sm am-fl"> <input type="reset" name="" value="重置 " class="am-btn am-btn-primary am-btn-sm am-fr"> </div> </form>
- 主要是将<form>中的子标签改成如下形式:
- 添加输入信息验证功能:
- step1,在HTML页面的<form>标签中添加onSubmit事件
<form ......... onSubmit="validate()">
其中validate()是JavaScript函数,如下:
- step2,编写JavaScript函数,并且嵌在HTML页面中
<script language="JavaScript"> /*使用HTML的onSubmit事件+JavaScript函数+正则表达式 实现注册页面表单中各个标签对应的输入值的合法性 规则: 用户名必须是使用数字、字母、下划线生成的 两次的密码输入必须一致 邮箱必须是合法的邮箱地址*/ function validate(registerForm){ if(registerForm.password.value!=registerForm.passwordAssure.value){ alert("两次输入的密码不一致!"); registerForm.passwordAssure.focus();//让焦点定位到passwordAssure框 registerForm.passwordAssure.select();//选中passwordAssure框中全部内容 return false; } //验证用户输入的Email格式是否正确 var email=registerForm.email.value; if(!/^w+@w+.w+$/.test(email)){ alert("EMAIL输入格式不正确!"); registerForm.email.focus();//让焦点定位到email框 registerForm.email.select();//选中email框中全部内容 return false; } return true; } </script>
- step1,在HTML页面的<form>标签中添加onSubmit事件
- 在/src/main/webapp/jsp/login.html 的基础上创建register.html
step4,为整个project添加全局错误处理页面
-
- 编程思路:修改WebApp/src/main/webapp/WEB-INF/web.xml,在里面添加<error-page>标
-
-
<error-page> <error-code>404</error-code> <location>/html/errorpage/admin-404.html</location> </error-page>
<error-page> <error-code>403</error-code> <location>/html/errorpage/admin-403.html</location> </error-page> <error-page> <error-code>500</error-code> <location>/html/errorpage/admin-500.html</location> </error-page> <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/html/errorpage/admin-NullPointerException.html</location> </error-page>
-
编程结果:使得整个工程中对相应的错误作出统一的处理
-
- 如,不管是请求的哪个页面,只要请求的资源不存在时,都会自动调用 MLPlatform Maven WebApp/src/main/webapp/jsp/admin-404.html页面
- 实际运行过程:只要服务器没有找到请求的资源,服务器就会抛出404错误,根据web.xml的配置,404错误会自动跳转到admin-404.html页面,在浏览器中展示该页面的内容
- 再如,只要请求的资源超出自己拥有的权限,服务器就会拒绝处理,并抛出403错误代码,根据web.xml的配置,遇到服务器抛出403错误时,会自动跳转到/jsp/admin-403.html页面,并在浏览器展示该页面的内容
- 再如,服务器内部发生了故障而不能相应用户的请求,服务器就会抛出500错误代码,根据上述web.xml中的配置,遇到服务器抛出500错误时,会自动跳转到/jsp/admin-500.html页面,并在浏览器展示该页面的内容
- 再如,如果服务器代码运行过程中抛出了没有处理的NullPointerException异常,根据上述web.xml中的配置,遇到服务器抛出NullPointerException异常时,会自动跳转到/jsp/admin-NullPointerException.html页面,并在浏览器展示该页面的内容
- 测试:浏览器地址栏故意输入一个不存在的URL,结果如下:
- 编程思路:修改WebApp/src/main/webapp/WEB-INF/web.xml,在里面添加<error-page>标
step5,为整个web project添加数据库
-
- 使用MySQL数据库
- 管理员身份运行DOS ——————执行 mysql -u root -p ------>输入密码
- 创建新的数据库:create database mlplatform;
- 在上述数据库中添加userInfo表格,并且为该表格添加一条测试数据(用户administrator的相关信息)
- 将myeclipse中userInfo.sql拷贝到d:
- 在DOS下执行source d:/userInfo.sql
- 将myeclipse中userInfo.sql拷贝到d:
- 经历了上述操作之后,就已经在MySQL中建立了一个数据库mlplatform,并且在该数据库中添加了userInfo表格,后面我们的web project就使用这个数据库
- 备注:如何让自己的web project使用mysql数据库?
- step1,首先确保你的计算机上拥有mysql软件环境
- step2,在mysql中创建你这个web project中想要使用的数据库,如本例中创建的mlplatform数据库
- step3,下载你的mysql的驱动程序(一个jar包),并且将它放置在Tomcat安装目录下的/lib文件夹下,重启Tomcat
-
- step4,在你的web project中编写程序使用mysql数据库
- 使用的数据库驱动程序是mysql数据库驱动
- 使用的数据库(如mlplatform)是在mysql中创建的数据库
- 使用的用户名和密码是连接mysql的用户名和密码
step6,替换myeclipse中集成的原有的部署了changkongProject的Tomcat服务器,替换为计算机中安装的另一个Tomcat服务器,并且将MLPlatform Maven Project部署到替换后的Tomcat服务器上
-
- 具体操作过程参见博客
- 备注:如何让你的web project使用Tomcat?
- 首先确保你的计算机中已经正确安装了Tomcat
- 其次应该将该Tomcat集成到myeclipse中
- 之后将你的web project部署到Tomcat上
- 启动Tomcat
- 浏览器访问你的web project
step7,20170414,重构用户注册页面,将其由html页面变成JSP页面
-
- 原本是src/main/webapp/jsp/register.html
- 改成 src/main/webapp/jsp/user/register.jsp页面
- 不仅将html页面改成JSP页面,还变换了文件的存放路径,所以要改动页面代码中引入的amazeui.min.css , favicon.png的位置
- 修改了该页面中的form标签,使其action=“UpdateDatabase.jsp”
- src/main/webapp/jsp/user/UpdateDatabase.jsp页面中使用jdbc相关API来操作mysql数据库,企图将用户注册信息添加到mlplatform数据库的userInfo表格中
step8,20170417,添加用户注册信息持久化页面和读取数据库数据生成用户列表页面
-
- 在JSP页面中直接使用java.sql.*中提供的API操作mysql数据库mlplatform
- 将src/main/webapp/jsp/user/register.jsp页面中填写的注册信息,保存到数据库mlplatform的userInfo表格中
- 并且在JSP页面中使用相应的API读取数据库userInfo表中的信息,生成用户列表,并在该JSP页面中进行展示
- 相应程序:
- src/main/webapp/jsp/user/UpdateDatabase.jsp ,将注册页面填写的信息保存到数据库中
- src/main/webapp/jsp/user/UserList.jsp,从数据库中读取用户数据,生成用户列表并在JSP页面中以table的格式展示出来
step9,20170419,为自己的web project的*.jsp页面集合添加header.jsp toolbar.jsp footer.jsp,那么以后再添加新的*.jsp时就可以重用这些页面头、工具栏和页面尾了
-
- 思想:
- 从所有页面中抽离出头部、尾部和工具栏,这样再次添加新的*.jsp时就可以直接在自己的*.jsp中动态包含(或静态包含)这些独立的代码文件(页面头、尾、工具栏对应的文件)
- 一来可以避免重复造车轮(即避免重复编写相同代码)
- 二来增加程序的可维护性:如后来某一时刻想要改造一下工具栏格式甚至内容,只需在toolbar.jsp中作出相应修改即可,不用依次修改所有*.jsp页面
- 具体编程实现:
- Myeclipse---MLPlatform Maven Webapp/src/main/webapp/jsp下添加了一个新的文件夹/components ,这个文件夹下专门存放可重用的JSP页面代码,如这次所添加的header.jsp toolbar.jsp footer.jsp
- header.jsp 页面头部
- toolbar.jsp 页面工具栏
- footer.jsp 页面尾部
- 思想:
step10,20170419,在step9所做的工作的基础上,修改MLPlatform Maven Webapp/src/main/webapp/jsp/user/UserList.jsp页面
-
-
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.sql.*" %> <%@ page import="java.util.Date" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>在JSP中直接操作数据库:获取userInfo表格内容,展示成table</title> <link rel="alternate icon" type="image/png" href="../../img/favicon.png"/> <link rel="stylesheet" href="../../css/amazeui.min.css"/> <link rel="apple-touch-icon-precomposed" href="../../image/app-icon72x72@2x.png"/> <link rel="stylesheet" href="../../css/admin.css"/> <style> .header { text-align: center; } .header h1 { font-size: 200%; color: #333; margin-top: 30px; } .header p { font-size: 14px; } </style> </head> <body> <jsp:include page="../components/header.jsp"/> <jsp:include page="../components/toolbar.jsp"/> <%--start of contents--%> 参照admin-table.html页面编写本页面的table的展示样式 <%--end of contents--%> <jsp:include page="../components/footer.jsp"/> </body> </html>
-
使用<jsp:include>标签动态包含其他文件到本JSP页面(如本例中就动态包含了footer.jsp header.jsp toolbar.jsp)
- 这样一来可以避免重复编写上述三个文件的代码
-
step11,20170420,修改或添加相关页面,使得用户登录时,查询数据库mlplatform的userInfo表格,如果用户输入的用户名在该表格中存在,且密码与用户名相匹配,则跳转到“管理平台页面”,否则跳转到错误页,指明用户输入的信息错误,并给出重新登录的链接
-
- 设计原则:
- 不包含java代码的页面就设计成*.html,包含java代码的页面才设计成*.jsp
- 至于为何这么设计?因为动态页面请求和静态页面请求的响应方式不同,动态页面响应速度相对于静态页面响应速度而言较低,所以能用*.html的就不要用*.jsp
- 设计思路:
实际实现时,将上述login_check.jsp替换成了checkDatabase.jsp。并且添加了logout.jsp页面
- 编程实现:
login文件夹下的所有文件
- 设计原则:
step12,20170424.通过向客户端添加Cookie对象的方式,实现“记住用户名和密码,七天内免登陆”的功能
-
- 原理:服务器端可以向客户端添加一些Cookie对象,并且设置这些Cookie对象的生存时间,这些Cookie对象可以保存在客户端机器上,这样一来客户端机器就可以随时取用这些Cookie信息。
- 编程思路:
- step1,用户输入登录信息,并且通过数据库验证之后,判定其为合法用户,跳转到login_success.jsp页面,在该页面通过request对象获取login.jsp页面输入的用户名和密码,使用这些数据创建Cookie对象,并且用response对象将这些新建的Cookie添加到客户端机器上。具体代码如下:
<%@page contentType="text/html" pageEncoding="GBK"%> <%@page import="javax.servlet.http.Cookie" %> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <center> <h1>登陆操作</h1> <h2>登陆成功</h2> <h2> 欢迎<font color="red"><%=request.getParameter("uname")%></font>光临! 请点击此处进行注销<a href="logout.jsp">注销</a> </h2> <% /*这段程序用于记住用户名和密码,使得下次该用户可以免登陆 编程思路:使用request对象获取登陆页面输入的用户名和密码; 然后创建Cookie对象,存储用户名和密码 之后使用response对象将上述包含有用户名和密码信息的cookie对象添加至客户端 */ Cookie usernameCookie=new Cookie("username",request.getParameter("username")); Cookie passwordCookie=new Cookie("password",request.getParameter("password")); /*如果不加此代码,那么该cookie只是保存在客户端浏览器上,浏览器关闭后该cookie就消失了 只有添加了此行代码,该cookie才会保存在客户端机器上 */ usernameCookie.setMaxAge(604800);//保存604800s=7day passwordCookie.setMaxAge(604800); response.addCookie(usernameCookie); response.addCookie(passwordCookie); %> </center> </body> </html>
- step2,在login.jsp页面,先检查客户端机器中是否有相应的Cookie,如果有,就将form表单中相应标签的默认值赋值成Cookie中相应值,如果没有,就需要用户亲自输入。具体代码如下:
- step1,用户输入登录信息,并且通过数据库验证之后,判定其为合法用户,跳转到login_success.jsp页面,在该页面通过request对象获取login.jsp页面输入的用户名和密码,使用这些数据创建Cookie对象,并且用response对象将这些新建的Cookie添加到客户端机器上。具体代码如下:
-
上述实例的运行机制:
-
用户第一次通过UserLogin.jsp登录该网站时,如果用户输入的用户名和密码通过了数据库的验证,则跳转到login_success.jsp页面,并且在该页面通过request获取用户输入的用户名和密码,并用他们生成新的Cookie对象(一定要设置该Cookie的生存时间)
- 之后使用response.addCookie(Cookie)将上面新建的Cookie对象添加到客户端机器上
- 之后用户再次使用该客户端机器登录我们的网站的时候,都会将客户端机器上保存的Cookie信息一并发送到服务器上
- 服务器端使用request.getCookies()可以获取客户端机器上曾经保存的Cookie信息,如果客户端机器上保存的Cookie中包含曾经输入的用户名和密码,那么就可以获取该用户名和密码,并且将Cookie中的用户名和密码作为UserLogin.jsp页面相应标签的默认值
-
step13,20170424,将原有的manageplatform.html改造,抽离出header.jsp,footer.jsp
-
- 改造结果:
文件夹下部分内容,包括:
-
/PartOfAPage子文件夹下的所有内容,该文件夹下的文件是页面头部、页面尾部、页面工具栏独立而成的文件
- 使用上述独立文件+页面具体内容===>组装成ManagePlatformDashBoard.jsp页面
- 修改上述所得 ManagePlatformDashBoard.jsp页面,添加Cookie相关程序,并修改jsp/login/UserLogin.jsp页面中的相关链接,使得登陆成功后跳转到ManagePlatformDashBoard.jsp页面,由此login-success.jsp页面被废弃。
- 改造结果:
step14,20170502,尝试在使用javabean将jsp页面中的html标签和java代码分离,提高代码的可重用性以及可维护性
- step1,编写javabean,即
package test; public class TestJavaBean { private String name; public void setName(String name){ this.name=name; } public String getName(){ return this.name; } }
-
step2,在*.jsp中使用上面定义的javabean
-
(未使用)方法一,可以使用<%@page import=""%> 来引入上述javabean,然后在scriptlet中声明一个该类的对象并使用
- (使用)方法二,可以使用<jsp:javaBean >标签来引入上述自定义的javabean,然后在scriptlet中直接使用该标签声明的javabean实例,如下代码
-
- 方法二对应的代码:
<html> <head><title/> </head> <body> This is my JSP page. <br> <jsp:useBean id="test" scope="page" class="test.TestJavaBean"/> <% test.setName("lxrm"); String name=test.getName(); %> <h1><%=name %></h1> </body> </html>
- 方法二对应的代码:
-
-
-
step3,由于每次新定义了一个javabean之后,都需要重启Tomcat才能生效,非常不方便,所以要在Tomcat安装目录的server.xml中进行相关的配置,使得每次重新定义一个javabean之后,不需要重启Tomcat,具体配置方式如下:
开发模式下降reloadable置为true,但是项目部署的时候一定要将其置为false,否则会影响网站服务器响应速度。
-
可能出现的bug:
-
- bug1,上述步骤都进行完之后,就可以启动Tomcat,并且通过浏览器访问test/testJavaBean.jsp页面,看看我们自定义的javabean是否被成功引入相应的Jsp页面,但是访问时可能报错,说找不到我们定义的javabean,经过排查发现是因为我们的*.java文件并没有被编译,修改相应的配置后该bug被解决:项目名--》右键----》properties---》java build path
- bug1,上述步骤都进行完之后,就可以启动Tomcat,并且通过浏览器访问test/testJavaBean.jsp页面,看看我们自定义的javabean是否被成功引入相应的Jsp页面,但是访问时可能报错,说找不到我们定义的javabean,经过排查发现是因为我们的*.java文件并没有被编译,修改相应的配置后该bug被解决:项目名--》右键----》properties---》java build path
-
step15,20170502,修改之前的注册页面
-
- 目标:
- 在Jsp中引入javabean,使得代码被进一步分离
- 完善注册、验证功能:
- 用户在表单中填写相应信息(用户名、密码、email等),进行注册;
- 表单提交前要进行输入验证:
- 用户名必须是合法的标识符
- 两次输入的密码必须一致
- email格式必须一致
- age必须是一个有效的数值
- 如果用户输入正确,则跳转到相应页面,并且显示注册信息,
- 如果用户输入不正确,则在错误的地方进行提示,并且将正确的部分保留下来
- 参考程序:《java web开发实战经典.pdf P200》
- 实际编程实现:
- step1,修改了register.jsp页面,将JavaScript中对输入进行验证改为在javabean中对输入内容进行格式验证
- step2,添加了Register.java这个javabean,这个javabean中定义了和register.jsp表单标签同名的类属性及其对应的setter和getter方法,
- step3,并且在Register.java这个javabean中添加了相应的成员方法来验证表单标签输入的内容是否合法
- step4,在register.jsp页面中实例化Register这个javabean,并且调用其中的方法
- step5,register.jsp页面的<form action="CheckInputs.jsp">,在CheckInputs.jsp中使用Register对应的javabean实例将表单标签值赋值给该javabean实例,并且调用isValidate()函数验证输入数据是否满足格式要求,若满足,则跳转到UpdateDatabase.jsp,否则跳转到register.jsp页面,并且显示错误提示
- 具体程序:
register.jsp 注册页面+显示错误信息 Register.java javabean(setter、getter+isValidate()+getErrorMsg()) CheckInputs.jsp 获取register.jsp中的表单标签的值,并且自动匹配javabean中相应属性,自动调用相应setter函数为属性赋值
调用javabean实例的isValidate()函数进行输入验证
根据isValidate()函数的返回值决定跳转的目的页面,若输入没有错误,则跳转到UpdateDatabase.jsp
若输入有错误,则跳转到register.jsp
UpdateDatabase.jsp 将通过验证的注册信息持久化到数据库 -
-
- register.jsp
<jsp:useBean id="register" scope="request" class="jmsy.lxrm.user.Register"></jsp:useBean> <%-- <form action="CheckInputs.jsp" method="post" class="am-form" name="registerForm" onSubmit="validate(this)"> --%> <form action="CheckInputs.jsp" method="post" class="am-form" name="registerForm"> <label for="text">用户名: </label> <div class="error"><%=register.getErrorMsg("errusername") %></div><br> <input type="text" name="username" id="username" value="<%=register.getUsername() %>" maxlength="20"> <br> <label for="password">密码:</label> <div class="error"><%=register.getErrorMsg("errpassword") %></div><br> <input type="password" name="password" id="password" value="<%=register.getPassword() %>"/> <br> <label for="password">请确认密码:</label> <input type="password" name="" id="passwordAssure" value=""> <br> <label for="text">年龄:</label> <div class="error"><%=register.getErrorMsg("errage") %></div><br> <input type="text" name="age" id="age" value="<%=register.getAge()%>"> <br> <label for="email">邮箱:</label> <div class="error"><%=register.getErrorMsg("erremail") %><br> <input type="text" name="email" id="email" value="<%=register.getEmail()%>"> <br>
-
CheckInputs.jsp
<body> <% request.setCharacterEncoding("UTF-8");//对客户端(即浏览器)传递而来的参数进行重编码(防止出现乱码) %> <%--由于register.jsp中将register这个javabean实例设置成request范围属性,所以在服务器端跳转之后,目的页面仍然可以使用该javabean实例 <form action="">是客户端跳转 下面的标签,使得register.jsp中注册表单中的标签的值被赋值给javabean实例register中相应的属性(“*”表示按照名称匹配) 并且会自动完成String类型标签值到javabean属性类型的转换,如String类型age转化成int型 --%> <jsp:useBean id="register" scope="request" class="jmsy.lxrm.user.Register"></jsp:useBean> <jsp:setProperty name="register" property="*"/> <%-- 下面调用javabean对象register中的validate()函数,验证注册表单中的输入是否符合格式要求,若符合,则将注册信息持久化至数据库, 若有某个输入不合法,则跳回到注册页面,显示错误提示,置空错误的输入,但是保留原有正确的输入 --%> <% if(register.isValidate()){ %> <jsp:forward page="UpdateDatabase.jsp"/> <% }else{ %> <jsp:forward page="register.jsp"/> <% } %> </body>
- register.jsp
-
- 上述程序的运行机制:
-
- 第一次运行register.jsp时,该页面实例化的javabean——register的所有属性都为“”,所以在register.jsp页面并不会显示什么提示信息,默认值也都不显示
- 当填好相应注册信息,并且点击提交之后,跳转到<form action="CheckInputs.jsp">(客户端跳转),由于是客户端跳转,所以register.jsp中声明的javabean对象在CheckInputs.jsp页面中不可使用,所以要在在CheckInputs.jsp页面使用重新定义一个javabean对象,并且使用<jsp:setProperty name="register" property="*"> 使得表单标签和javabean属性自动匹配赋值(且自动完成类型转换)。
- javabean属性被赋值成表单标签值之后,在CheckInputs.jsp中还要使用javabean的isValidate()函数来验证输入的内容是否符合格式要求,若符合,则跳转到UpdateDatabase.jsp页面进行注册信息的持久化操作,否则跳转到register.jsp页面让用户修改自己的注册信息
-
-
- 目标:
step16,为了使得后续程序的可维护性得到提高,并且使得代码进一步解耦,代码层次结构更加清晰,本阶段将该project的所有代码进行了一定的重构,使得所有代码符合一定的规范,按照统一的结构编写该project的View层、Controller层、Model层(业务逻辑子层BO+持久化子层DAO)各层的代码。
-
-
- 统一结构
- 该结构下的运行机制
- 该结构下个层代码的编程思路
-
- view层代码编程思路
- Controller层代码编程思路(XxxServlet/XxxFilter/XxxListener)
- Model层代码编程思路
-
- 各个模块的说明文档
-
step17,添加EncodingFilter,使得从客户端(浏览器)传递到服务器端的请求参数都被重新编码,从而解决乱码问题
-
-
- 问题概述:由于浏览器本地编码方式和服务器端使用的编码方式可能不同,所以服务器端接收到浏览器传递而来的请求参数可能是一团乱码,为了解决乱码问题,必须在服务器端对接收到的所有请求参数进行重新编码。
- 解决办法:
- (不推荐)传统解决办法:在引入XxxFilter之前,需要在所有jsp页面或者XxxServlet中都使用request.setCharacterEncoding("UTF-8");造成该句代码在多个*.jsp以及XxxServlet中被重复多次,代码重复度很高,所以要引入ChangeEncodingFilter代码来降低该句话代码的重复度
- (推荐)新的解决办法:引入ChangeEncodingFilter,使得所有请求被传递到XxxServlet之前都先经过该Filter,将接受到的由客户端传递而来的请求参数进行重新编码
-
- 编程思路:参见《java web开发实战经典.pdf P283》
- 编程结果:
上面是ChangeEncodingFilter.java代码,下面在WEB-INF/web.xml中配置该XxxFilter:
<!-- 全局Filter:在服务器端接收客户端浏览器传送来的请求,对其进行重编码(由本处配置的参数指定服务器端重编码的字符集),防止乱码问题 --> <filter> <filter-name>RequestEncodingFilter</filter-name> <filter-class>jmsy.lxrm.filter.ChangeEncodingFilter</filter-class> <init-param><!-- 服务器端对request参数进行UTF-8重编码 --> <param-name>charset</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>RequestEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
-
step18,添加文件压缩与解压相关代码
-
- 需求分析:数据集管理模块中用户上传数据集时很可能上传一个压缩包,这时就需要在服务器端将用户上传的压缩包自动解压。
- 实现思路:JDK中本身带有文件压缩与解压相关的API(主要在java.util.zip.*;)中,但是这些API用起来相对麻烦,很有可能出现由于压缩文件中含有中文名称而抛出异常的状况,所以我们不使用JDK自带的java.util.zip.*;中的相关API,而是使用Apache开发并发布的ant-1.7.1.jar中提供的相应API来编写我们的解压程序;
- 编程思路:
- step1,下载ant-1.7.1.jar
- step2,将上述jar包添加到自己的project中(projectName-->右键-->java build path--->external jar)
- step3,了解ant-1.7.1.jar中提供的API
-
-
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
-
-
- step4,使用上述API编写压缩包解压程序
- 成果:
step19,完善用户上传图片数据集模块的业务逻辑代码
-
- 需求分析:
-
- 用户需要上传单张图片或者上传一个包含多张图片的压缩包(*.zip);
- 使用smartupload组件接收用户上传的文件
- 为了防止因上传文件文件名重复而造成的数据集覆盖问题的发生,smartupload组件接收了用户上传的文件之后,存储成实际文件之前,先对接收到的文件进行重命名(使用“客户端IP地址+上传时间yyyyMMddHHmmssSSS+三位随机数字”进行重命名)
- 使用心得名字存放用户上传的文件,存放在Tomcat安装目录/webapps/projectName/appdata/用户名/upload/pictures/文件夹下
- 如果上传的是单张图片,直接将该图片存放的绝对路径 最为pictureURL存放至数据库表格PICTUER_UPLOAD
- 如果上传的是一个压缩包(*.zip),则先将该压缩包解压,解压到压缩包所在文件夹下(并且解压文件夹名称和相应的压缩包名称相同)
- 遍历解压后的文件夹,将该目录下及其子目录下的所有图片(即*.jsp/*.png/*.bmp)文件的绝对路径存放成pictureURLs:List<String>
- 将上述步骤所得pictureURLs:List<String>+username上传者共同存放至数据库表格PICTUER_UPLOAD
-
- 编程实现:
- 需求分析: