提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
Java API
Java Object
Java 异常,IO流,多线程,网络编程,反射机制
Java新特性和项目
java 数据库
一、前后端分离架构介绍
前后端分离已成为互联网项目开发的业界标准使用方式,将前端和后端的开发进行解耦。并且前后端分离会为以后的大型分布式架构、微服务架构、多端化服务(各种客户端,比如浏览器、车载终端、安卓、IOS等)打下坚实的基础。
前后端分离的核心思想就是前端HTML页面通过AJAX调用后端的API接口,并通过JSON数据进行交互。
二、技术选型
三、注意事项
3.1 数据库
1对多的关系时,在1那一方可建立list集合
//course_section章节 和 course_lesson课时 是一对多关系
//添加一个list集合 泛型course_lesson
List<Course_Lesson> LessonList = new ArrayList<>();
在实现数据处理时就可以进行封装
//4.根据章节ID查询课时信息
for (Course_Section section : sectionList) {
//调用方法 获取章节对应的课时
List<Course_Lesson> lessonList = findLessonBySectionId(section.getId());
//将课时数据封装到 章节对象中
section.setLessonList(lessonList);
}
编写sql语句
编写SQL减少使用连接 JOIN,提高可维护性
编写SQL 当前的查询为多条件不定项查询
创建StringBuffer 对象,将SQL字符串 添加进缓冲区
1=1 查询条件不固定时 可用
StringBuffer sb = new StringBuffer
("SELECT id,course_name,price,sort_num,STATUS FROM course WHERE 1=1 and is_del = ? ")
//-----------------------------------------------------
//2.3 判断传入的参数是否为空
if(courseName != null && courseName != ""){
sb.append(" AND course_name LIKE ?");
//like查询 需要拼接 %
courseName = "%"+courseName+"%";
//将条件放进list集合
list.add(courseName);
}
if(status != null && status != ""){
sb.append("AND STATUS = ?");
//将status 转换为 int
int i = Integer.parseInt(status);
list.add(i);
}
3.2 Service层
根据需求文档,接口文档决定返回类型
//1.补全章节信息
section.setStatus(2);//状态 0 隐藏,1 待更新,2 已发布
String date = DateUtils.getDateFormart();
section.setCreate_time(date);
section.setUpdate_time(date);
//2.调用dao
int row = contentDao.saveSection(section);
//3.根据是否插入成功,封装对应信息
if(row > 0){
//保存成功
String result = StatusCode.SUCCESS.toString();
return result;
}else{
String result = StatusCode.FAIL.toString();
return result;
}
3.3 Servlet层
Servlet太多了,不好管理, 而且Servlet越多 服务器运行就越慢,资源消耗就越多.
建立通用的servlet, 根据请求功能的不同,调用对应的方法。根据接口文档规定的传递参数
然后功能servlet可以继承通用的servlet
在通用servlet里完成如参数的接收,JSON格式转换等
3.4 文件上传
文件上传三要素:
1.表单提交方式必须是 post
2.表单的enctype属性必须是 multipart/from-data
3.表单中必须有文件上传项
根据前端得到的文件进行解析
//1.创建磁盘文件工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//2.创建文件上传核心类
ServletFileUpload upload = new ServletFileUpload(factory);
//2.1设置上传文件的编码
upload.setHeaderEncoding("utf-8");
//2.2判断表单是否 文件上传表单
boolean multipartContent = upload.isMultipartContent(req);
FileItem item
判断是普通的表单项,还是文件上传项:boolean formField = item.isFormField();
true 就是普通表单项,item.getFieldName(); 获取文件名
文件上传 item.getName(); 获取文件名
最后就是输入输出流对文件的复制保存
3.5 代码的维护性
简单来说就是每个功能实现独立的作用
if-else,反射优化
if("addCourse".equals(methodName)){
addCourse(req,resp);
}else if("findByName".equals(methodName)){
findByName(req,resp);
}else if("findByStatus".equals(methodName)){
findByStatus(req,resp);
}else {
System.out.println("请求功能不存在");
}
上面的代码就是后判断接收参数的名字,再实现每个功能
下面的代码时利用反射优化上面的代码
//2.判断 执行对应的方法
if(methodName != null){
//通过反射优化代码 提升代码的可维护性
try {
//1.获取字节码文件对象
Class c = this.getClass();
//2.根据传入的方法名,获取对应的方法对象 findByName
Method method = c.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//3.调用method对象的 invoke方法,执行对应的功能
method.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
System.out.println("请求的功能不存在!!");
}
}
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。