Java学习Day37:HTML 第六章:黄金国(项目思路梳理)

2024-09-06 05:12

本文主要是介绍Java学习Day37:HTML 第六章:黄金国(项目思路梳理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一天:后端思路梳理及代码实现

1.数据库设计

数据库设计使用一张表(course)设计

CREATE TABLE course(id INT  PRIMARY KEY AUTO_INCREMENT  COMMENT '课程ID',cname VARCHAR(255) NOT NULL COMMENT '课程名称',price DOUBLE  NOT NULL COMMENT '售卖价格',num_sort INT NOT    NULL DEFAULT 0 COMMENT '排序',cstatus  TINYINT NOT NULL DEFAULT 1 COMMENT '状态',course_bri VARCHAR(255)   NOT NULL COMMENT '课程简介',teacher_name    VARCHAR(255)   NOT NULL COMMENT '讲师姓名',   teacher_bri   VARCHAR(255)   COMMENT '讲师简介',course_ol TEXT   NOT NULL COMMENT '课程概述',price_sale DOUBLE  COMMENT  '原价',activ_flag VARCHAR(255) COMMENT  '活动标签',img_url VARCHAR(255) COMMENT  '图片路径',share_title VARCHAR(255) NOT NULL COMMENT  '分享标题',share_bri VARCHAR(255) NOT NULL COMMENT  '分享简介',course_other TEXT COMMENT  'markdown',createTime   DATETIME DEFAULT CURRENT_TIMESTAMP NULL COMMENT '创建时间',updateTime   DATETIME DEFAULT CURRENT_TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间');

2.环境搭建,依赖导入

使用三层架构,搭项目;

3.接口分析以及接口文档的书写

一共需要五个接口,接下来开始接口分析及书写;

1.测试类测试数据库连接

2.集成Tomcat

3.优化sevleat

发现书写接口时,不同接口对应不同的sevlet对象的话,会产生大量sevlet对象!

思路:使用反射机制来动态调用方法,使用继承机制来讲sevlet和具体执行方法分开!

package com.gzd.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class BaseController extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method=req.getParameter("method");if (method!=null){Class  clazz = this.getClass();try {Method method1 = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);method1.invoke(this,req,resp);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}}
}
=======================================================================================
package com.gzd.controller;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/course")
public class CourseManagerController extends BaseController{public void findAll(HttpServletRequest req, HttpServletResponse resp){System.out.println("我是findAll方法");}public void findByName(HttpServletRequest req, HttpServletResponse resp){System.out.println("我是findByName方法");}public void findByStatus(HttpServletRequest req, HttpServletResponse resp){System.out.println("我是findByStatus方法");}
}

4.测试数据和实体类

package com.gzd.javaBean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor//有参构造
@NoArgsConstructor//无参构造
public class Course {private Integer id;private String cname;private Double price;private Integer numSort;private Integer cstatus;private String courseBri;private String teacherName;private String teacherBri;private String courseOl;private Double priceSale;private String activFlag;private String imgUrl;private String shareTitle;private String shareBri;private String courseOther;private Date createTime;private Date updateTime;
}
INSERT INTO course (cname, price, num_sort, cstatus, course_bri, teacher_name, teacher_bri, course_ol, price_sale, activ_flag, img_url, share_title, share_bri, course_other, createTime, updateTime)  
VALUES   
('数据库基础', 99.99, 1, 1, '介绍数据库的基本概念和操作', '张老师', '资深数据库专家,多年教学经验', '本课程将详细介绍数据库的基础知识和常用操作。', 199.99, '限时优惠', 'https://example.com/database.jpg', '学习数据库,从基础开始', '掌握数据库知识,提升编程技能。', '## 数据库简介\n### 什么是数据库\n...\n### 数据库的作用\n...', NOW(), NOW()),  ('Java编程入门', 149.99, 2, 1, 'Java编程语言入门课程,适合零基础学员', '李老师', 'Java开发专家,擅长Java Web开发', '本课程将引导学员从零开始学习Java编程语言。', 299.99, '早鸟优惠', 'https://example.com/java.jpg', 'Java编程,轻松入门', '零基础学Java,成为编程高手。', '## Java简介\n### Java的历史\n...\n### Java的特点\n...', NOW(), NOW()),  ('Python数据分析', 299.99, 3, 1, '利用Python进行数据分析的实战课程', '王老师', '数据分析专家,擅长Python和机器学习', '本课程将教授学员如何使用Python进行数据分析。', 399.99, '新用户专享', 'https://example.com/python.jpg', 'Python数据分析,提升职场竞争力', '掌握Python数据分析,解锁职场新技能。', '## Python数据分析简介\n### 为什么选择Python\n...\n### Python数据分析工具\n...', NOW(), NOW());

5.接口编写:

public interface CourseDao {public List<Course> findAll();public Course findByname(String cname);//查询状态public List<Course> findBystatus(String status);public int insert(Course course);
}
public class CourseDaoImp implements CourseDao {//注入依赖private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());@Overridepublic List<Course> findAll() {return jdbcTemplate.query("SELECT id,cname,price,num_sort,cstatus FROM course",new BeanPropertyRowMapper<Course>(Course.class));}@Overridepublic Course findByname(String cname) {return jdbcTemplate.query("SELECT id,cname,price,num_sort,cstatus FROM course where cname=?",new BeanPropertyRowMapper<Course>(Course.class),cname).get(0);}@Overridepublic List<Course> findBystatus(String cstatus) {return jdbcTemplate.query("SELECT id,cname,price,num_sort,cstatus FROM course where cstatus=?",new BeanPropertyRowMapper<Course>(Course.class),cstatus);}@Overridepublic int insert(Course course) {Object[] arr = {course.getCname(),course.getPrice(),course.getNumSort(),course.getCstatus(),course.getCourseBri(),course.getTeacherName(),course.getTeacherBri(),course.getCourseOl(),course.getPriceSale(),course.getActivFlag(),course.getImgUrl(),course.getShareTitle(),course.getShareBri(),course.getCourseOther(),course.getCreateTime(),course.getUpdateTime()};return   jdbcTemplate.update("insert into course values (null,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", arr);}
}
public interface CourseService {//查询所有public String findAll();public String findByname(String cname);public String findBystatus(String status);//保存public String saveCourse(Course course);
}
public class CourseServiceImp implements CourseService {//注入依赖Dao层private CourseDao courseDao = new CourseDaoImp();@Overridepublic String findAll() {return  JSON.toJSONString(courseDao.findAll());}@Overridepublic String findByname(String cname) {return JSON.toJSONString(courseDao.findByname(cname));}@Overridepublic String findBystatus(String status) {return JSON.toJSONString(courseDao.findBystatus(status));}@Overridepublic String saveCourse(Course course) {int insert = courseDao.insert(course);if (insert ==0){return "error!";}return  "success";}
}
@WebServlet("/course")
public class CourseManagerController extends BaseController {//注入依赖private CourseService courseService = new CourseServiceImp();//1:查询所有public void findAll(HttpServletRequest req, HttpServletResponse resp)throws Exception{resp.setCharacterEncoding("UTF-8");System.out.println(courseService.findAll());resp.getWriter().write(courseService.findAll());}//2:根据课程名称查询public void findByName(HttpServletRequest req, HttpServletResponse resp)throws Exception{//乱码问题req.setCharacterEncoding("UTF-8");String cname = req.getParameter("cname");resp.setCharacterEncoding("UTF-8");resp.getWriter().write(courseService.findByname(cname));}public void findByStatus(HttpServletRequest req, HttpServletResponse resp)throws Exception{resp.setCharacterEncoding("UTF-8");resp.getWriter().write(courseService.findBystatus(req.getParameter("cstatus")));}//新建接口public void saveCourse(HttpServletRequest req, HttpServletResponse resp) throws Exception{//接受前端数据DiskFileItemFactory factory = new DiskFileItemFactory();//核心类ServletFileUpload upload = new ServletFileUpload(factory);//开始解析//判断req有没有二进制的表单boolean flag = ServletFileUpload.isMultipartContent(req);//实体类Course course = new Course();//map集合Map<String,Object> map = new HashMap<>();if (flag){//转换List<FileItem> list= upload.parseRequest(req);if (list!=null){for (FileItem fileItem :  list){//实体类//普通数据 文件数据boolean flag_ = fileItem.isFormField();if (flag_){//获取keyString key = fileItem.getFieldName();//获取value,指定字符集String value = fileItem.getString("UTF-8");//实体类封装map.put(key,value);}else {InputStream inputStream = fileItem.getInputStream();String imgurl  = "http://localhost:8080/uploda"+System.currentTimeMillis()+fileItem.getName();FileOutputStream outputStream = new FileOutputStream(imgurl);//读写操作IOUtils.copy(inputStream,outputStream);//添加到map中map.put("imgurl",imgurl);}}}}//完成封装,调用serviceBeanUtils.populate(course,map);resp.getWriter().write(courseService.saveCourse(course));}//修改接口
}
public class BaseController extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//所有的请求都能接 method+接口名String method = req.getParameter("method");if (method!=null){try {//获取运行当前类时对象Class  class_ = this.getClass();//Class对象<>  CourseManagerController//Object o = class_.getConstructor().newInstance();//获取当前运行时类的方法Method class_method = class_.getMethod(method, HttpServletRequest.class,HttpServletResponse.class);//调用方啊class_method.invoke(this,req,resp);} catch (Exception e) {System.out.println("没有该请求");e.printStackTrace();}}}
}

这篇关于Java学习Day37:HTML 第六章:黄金国(项目思路梳理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141089

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多