暑期java实训总结
2018.7学校暑期JavaWeb培训总结
本次为期20天的Java集训,在来之前,我想着应该是比较水的,因为我觉得或许会从大多数人基础出发,这样的课程听起来肯定没有看视频那么舒畅。记得第一天上午在D栋E404教室,我7点50到的教室,可这时整个教室早已站满了同学,我穿着牛仔裤和衬衫,这教室的空调跟没有一样,我坐在一个没有风扇的角落里,整个上午老师叫我们装Oracle,也就这样在那角落流了一上午的汗,最后还没装成功,最后20天居然还用的MySQL,而且自从装了Oracle,尽管我后来义无反顾的卸载了,但是我的小伙伴昔日的威武早已失去。
技术总结
所用技术
- 单例设计模式
- MVC
- JDBC
- Ajax
- 文件上传
- 信息增删改查
单例设计模式
单实例Singleton设计模式是使用和讨论比较多的一种设计模式,采用这种设计模式主要目的是想在整个系统中只能出现一个类的实例。比如在本项目中,JDBCconfig这个类,它用于与数据库进行连接,属于一个资源共享类,那么就可以在这采用单例设计模式。这样做的好处是,可以提高系统资源利用率,由于不需要在每次用这个类都new一个对象,所以系统速度也更快。
单例的特点:
- private的构造函数,表示别的类不能构造这个类的实例。
- 那么别的类怎么调用这个类的方法呢?那么我们可以用static创造一个静态的方法来让其形成实例,getInstance(),因为这个方法new的是自己,可以调用其private方法来获取实例。
- 由于是静态方法,它是属于类方法,而不是某一个对象的方法,可以通过类名.方法(Singleton.getInstance)调用来获取实例。
单例设计模式思想远不止这些。
MVC
从我现在的认知来看,我觉得MVC在Javaweb中体现为:
Controller servlet负责从浏览器获取request请求,然后分发转向、获取表单数据、调用相应servlet业务逻辑,然后servlet又与JavaBean(model)交互,JavaBean实现了与数据库的数据传输。然后数据再通过JavaBean返回到servlet中,再把数据显示在JSP页面,在浏览器显示。
AOP分层思想(面向切面编程)
将一些外围业务,比如日志、权限、事务、性能检测等看作单独的关注点,或者说单独的模块,这些单独的模块都可以在核心业务需要他们时及时的被运用,而不需要提前整合到核心模块中。
不分层时,对于每一个特定的功能,比如登入、注册,都需要写一个特定的函数,在每个函数中,会出现相同的数据库操作,造成冗余。所以采用分层思想。
三层结构将servlet中的方法进行两次抽取,servlet将不再关注业务的具体实现,只负责数据的传递,servlet将业务函数抽取到业务层,又将业务函数中的jdbc操作抽取到DAO层,降低冗余、易于维护、可扩展。
JDBC
这里主要学到了封装思想,以前写的代码总是与数据库交互一次连接与关闭一次,且每次只取得一个连接,然后关闭,效率太低。
1.现在我们可以先写一个配置文件:jdbc.properties
driverClass = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/myjdbc
username = root
password = 123456
2.JDBCUtils.java 读取配置文件、封装 3.还有连接池等知识
Ajax
这是一种异步通信技术
1:数据验证 2:按需取数据 3:自动更新页面(局部更新)
在这里我用Ajax来实现用户登录界面的头像自动更新,当用户名数据框keyup()事件触发时,在login.jsp用Ajax技术把用户框的内容传给相应的servlet,然后这个servlet判断该用户名是否存在,若存在则把该用户名下的path字段传回login.jsp界面,然后image.src=path,就可以实现头像的自动更新。其中path存的是webapp目录下的login/images下的图片。
文件上传
主要用于用户头像的上传,在主页面,用户点击上传头像后,该用户的Id会传到addImage.jsp页面中,然后这个jsp会调用MyUploadServlet的upImage方法处理。
package cn.edu.nchu.studentmanager.web.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.alibaba.fastjson.JSON;
import cn.edu.nchu.studentmanager.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
public class MyUploadServlet extends ControllerServlet{
public void SHOWImage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName = request.getParameter("key");//获取要上传头像UI的用户Id
//根据userId从数据库中读出相应的头像path,然后用ajax返回到login.jsp
UserService userService = new UserService();
String path = userService.queryUserPathByUserName(userName);
System.out.println("path1="+path);
//需要往浏览器写入json数据
response.setContentType("application/json;charset=utf-8");
PrintWriter out = response.getWriter();
//把对象Result转换成json数据
String jsonStr = JSON.toJSONString(path, true);
out.write(jsonStr);
out.close();
}
public void upImage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userId = request.getParameter("userid");//获取要上传头像UI的用户Id
if(ServletFileUpload.isMultipartContent(request)) {
//该提示符合文件上传规则,在此处对文件上传数据进行处理。
try {
// 1. 创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
DiskFileItemFactory factory = new DiskFileItemFactory();
// System.out.println(System.getProperty("java.io.tmpdir"));//默认临时文件夹
// 2. 创建ServletFileUpload对象,并设置上传文件的大小限制。
ServletFileUpload sfu = new ServletFileUpload(factory);
sfu.setSizeMax(10 * 1024 * 1024);// 以byte为单位 不能超过10M 1024byte =
// 1kb 1024kb=1M 1024M = 1G
sfu.setHeaderEncoding("utf-8");
// 3.
// 调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
@SuppressWarnings("unchecked")
List<FileItem> fileItemList = sfu.parseRequest(request);
Iterator<FileItem> fileItems = fileItemList.iterator();
// 4. 遍历list,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件
while (fileItems.hasNext()) {
FileItem fileItem = fileItems.next();
// 普通表单元素
if (fileItem.isFormField()) {
String name = fileItem.getFieldName();// name属性值
String value = fileItem.getString("utf-8");// name对应的value值
System.out.println(name + " = " + value);
}
// <input type="file">的上传文件的元素
else {
String fileName = fileItem.getName();// 文件名称
System.out.println("原文件名:" + fileName);// Koala.jpg
String suffix = fileName.substring(fileName.lastIndexOf('.'));
System.out.println("扩展名:" + suffix);// .jpg
// 新文件名(唯一)
String newFileName = new Date().getTime() + suffix;
System.out.println("新文件名:" + newFileName);// image\1478509873038.jpg
// 5. 调用FileItem的write()方法,写入文件
File file = new File("C:\\Users\\LiuWentao\\workspace\\studentmanager\\src\\main\\webapp\\loginpage\\images\\" + newFileName);//写入文件的地址
System.out.println(file.getAbsolutePath());
fileItem.write(file);
// 6. 调用FileItem的delete()方法,删除临时文件
fileItem.delete();
String path = "loginpage/images/";
path = path+newFileName;
//src="${AUI_ContextPath}/loginpage/images/crm_1.gif"
UserService userservice = new UserService();
userservice.uploadUserTouxiangById(path, userId);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
其他
当你遇到一些开始看起来可能很奇怪的人时,不要用躲避甚至排斥的眼光看待别人,因为英雄往往出现在这些人当中,学会用欣赏的眼光看待别人,“三人行,必有我师”。
任何时候都不要觉得事情有多大,其实想想看,并没有多大的事,保持一颗玩弄于世间的心。
当一个人所做的事与自己的观点不符合时,这个人可能是自己的朋友,可能是以后自己的孩子,不要把自己的观点强加于那个人,因为这世上的事本来就没有唯一的说法,应该做的事是去给出建议,然后在背后支持,因为被人支持的感觉总比被人控制的感觉好受些。
20天不长不短,算是对javaweb有了一个基本的了解,20天中前几天我是报的希望不大,因此我前些时候是打算自己看视频学习的,然而在听了几堂HB(黄斌)老师讲的课后,感觉还可以,尤其记得第一天上课讲的那句“20天坚持下来,肯定会有收获的”。20天下来后,发现这句话说的没错。期间也有很多小插曲,最后和老师也成了好朋友,也学到不仅是专业方面的知识,还有一些为人处世的道理,所以20天也算是收获满满。
项目工程文件
参考博客
winterliu
07/31/2018