# Store **Repository Path**: wanglu_666/Store ## Basic Information - **Project Name**: Store - **Description**: 商城项目 待完善 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-10-07 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Store #### 介绍 商城项目 待完善 #### 软件架构 软件架构说明 #### 开发思路 1. SpringBoot SpringBoot框架解决了传统的SS(M)框架在开发之前创建项目时需要做大量配置的问题,使用SpringBoot的项目,许多配置项都已经被默认的配置过了,无须开发人员再进行配置,其核心思想有约定大于配置,即开发人员都遵守相关约定即可,无需进行配置。 SpringBoot框架默认集成了大量的常用依赖。 关于SpringBoot其它优点,后续再体会。 2. 创建SpringBoot项目 当需要创建SpringBoot项目时,应该打开浏览器,访问https://start.spring.io,在页面中填写新项目的参数,然后点击Generate the project按钮,就会自动生成项目,并开始下载。 下载得到项目的压缩包后,解压将得到一个文件夹,该文件夹就是项目文件夹,推荐将该文件夹剪切到Workspace中,然后通过Eclipse的Import的Existing Maven Projects导入项目。 导入项目后,务必保证当前计算机是能够连接到Maven服务器的,则项目会开始自动更新,形成完整的项目。 使用SpringBoot时,需要使用Eclipse Oxygen(4.7)或以上版本,如果是较低的Mars(4.5)甚至更低的版本,在pom.xml文件中会提示错误,但是,可以无视这个错误,并不影响开发和运行! 要点:SpringBoot项目默认就创建了此前在网站上确定的包名,例如默认存在cn.tedu.springboot包,且包 下有SpringbootApplication.java类,该包是默认执行组件扫描的包,所以,后续创建的组件类(例如控制器类)都必须在这个包或其 子包中,该类是项目的启动类,当需要运行项目时,直接运行该类中的main()方法即可。 要点:SpringBoot项目内置Tomcat,当启动项目时,会自动启动内置的Tomcat,需要保证当前计算机没有正在运行中的Tomcat,否则会因为端口冲突导致项目启动失败! 3. 开发登录页面 要点:SpringBoot项目在启动内置的Tomcat时,会把项目部署到该Tomcat,且配置的Context Path值为空字符串,所以,在访问时,只需要通过http://localhost:8080/这样的URL即可访问,后面无需添加项目名称! 要点:SpringBoot项目默认的欢迎页面的文件名是index.html,当访问该文件时,无需显式的在URL中指定文件名! 要点:SpringBoot项目中的src/main/resources下默认存在static文件夹,是用于存放静态资源文件的,例如html、css、js、图片文件等。 在src/main/resources/static下创建index.html页面文件,在文件中设计登录表单,通过http://localhost:8080/即可访问。 4. 开发控制器接收请求 要点:SpringBoot项目默认扫描cn.tedu.springboot包,所以,控制器必须放在这个包,或其子包中! 创建cn.tedu.springboot.controller.UserController控制器类: package cn.tedu.springboot.controller; public class UserController { } 然后,在类之前添加@RestController和@RequestMapping("/")注解。 要点:SpringBoot项目默认将SpringMVC框架的DispatcherServlet的处理路径映射为/*,即所有请求都会被DispatcherServlet处理!所以,在设计请求路径时,不必添加.do的后缀! 然后,在类中添加处理请求的方法,由于目前并没有开发持久层功能,所以,暂且模拟处理: @RestController @RequestMapping("/") public class UserController { @RequestMapping("login") public String login(String username, String password) { System.out.println("登录用户名:" + username); System.out.println("登录密码:" + password); return "处理完成!"; } } @RestController注解并不是SpringBoot的特性,是SpringMVC框架中本来就有的一个注解,它相当于@Controller + @ResponseBody,也就是说,当使用@RestController时,当前控制器类中所有处理请求的方法都会响应正文,且每个方法之前都不必再添加@ResponseBody!当然,使用该注解,也就不可以再转发或重定向,如果一定要转发或重定向,可以使用@Controller注解,仅需要响应正文的方法之前添加@ResponseBody,或者,仍使用@RestController,处理请求的方法的返回值类型使用ModelAndView。 5. 连接数据库 要点:SpringBoot项目默认没有添加任何持久层相关依赖,需要手动添加,或创建项目时在网站上勾选! 手动添加时,应该在pom.xml文件中的节点之下,添加: org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2 mysql mysql-connector-java runtime 要点:如果SpringBoot项目已经添加了持久层相关依赖,在启动时,会自动尝试读取数据库连接的相关配置信息,如果尚且没有 配置,则启动时会报错!需要在src/main/resources下的application.properties中进行配置,该文件是 SpringBoot项目的配置文件! 所以,需要在application.properties中添加配置: spring.datasource.url=jdbc:mysql://localhost:3306/tedu_ums?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root 要点:SpringBoot项目默认在src/test/java下已经创建好了根包,并在根包下创建好了 SpringbootApplicationTests测试类,且测试类之前添加了2项注解,其作用是加载Spring容器,所以,在 SpringBoot项目的单元测试中,是可以直接获取Spring容器中的对象的,要求就是:所有的测试类都必须在根包下,或其子包下,且测试类之前需 要添加相同的2个注解。 在SpringBoot默认就存在的测试类中,有contextLoads()测试方法,应该先执行该测试方法,如果测试不通过,则表示某些依赖的jar包是损坏的,需要删除后再次更新! 如果测试通过,则可以在测试中对数据库连接进行测试: @RunWith(SpringRunner.class) @SpringBootTest public class SpringbootApplicationTests { @Test public void contextLoads() { } @Autowired public DataSource dataSource; @Test public void getConnection() throws SQLException { Connection conn = dataSource.getConnection(); System.err.println(conn); } } 6. 开发持久层 先创建cn.tedu.springboot.entity.User用户数据的实体类: public class User { // 属性…… // SET/GET/toString } 然后创建cn.tedu.springboot.mapper.UserMapper接口文件,然后在接口中添加“根据用户名查询用户数据”的抽象方法: User findByUsername(String username); 要点:使用SpringBoot结合MyBatis开发时,持久层的接口文件之前需要添加@Mapper注解,使得框架知道这是 MyBatis的接口文件,但是,这种做法就要求每个这样的接口都需要添加该注解,使用相对繁琐,也可以使用另一种解决方案,就是在启动类 (SpringbootApplication.java)的类的声明之前添加 @MapperScan("cn.tedu.springboot.mapper")。 接下来,应该配置抽象方法对应的SQL语句,可以: @Select("select * from t_user where username=#{username}") User findByUsername(String username); 这种做法并不是SpringBoot框架的特性,是MyBatis框架本身就允许的! 但是,通常并不推荐这样使用!依然推荐使用XML文件配置抽象方法对应的SQL语句,则需要在src/main/resources下创建mappers文件夹,然后复制MyBatis使用的XML文件到文件夹中,文件名应该是UserMapper.xml,然后进行配置: 然后,还需要配置XML文件在哪里,在SpringBoot项目中,是需要在application.properties中添加配置: mybatis.mapper-locations=classpath:mappers/*.xml 最后,在单元测试类中添加测试: @Autowired public UserMapper userMapper; @Test public void findByUsername() { String username = "springmvc"; User result = userMapper.findByUsername(username); System.err.println(result); } 7. 开发业务层 MVC = Model(数据模型=持久层+业务层) + View(视图) + Controller(控制器) 业务层的作用:设计业务流程,处理业务逻辑,从而保障数据的完整性和数据安全。 先创建cn.tedu.springboot.service.IUserService业务层接口,在接口中定义业务方法,关于业务方法的设计原则: 仅以“操作成功”为前提来设计返回值类型; 通过抛出异常的方式表示失败,错误不同,可抛出不同的异常; 方法名称可以自定义,尽量与业务所实现的目标相对应; 参数列表应该是控制器端可以提供的数据; 则应该先创建2个异常类,分别是cn.tedu.springboot.service.UserNotFoundException和cn.tedu.springboot.service.PasswordNotMatchException: public class UserNotFoundException extends RuntimeException { private static final long serialVersionUID = 6823682137712032655L; } public class PasswordNotMatchException extends RuntimeException { private static final long serialVersionUID = 4726518796909676941L; } 所以,在业务层接口中添加的抽象方法可以是: public interface IUserService { User login(String username, String password); } 然后,创建cn.tedu.springboot.service.UserServiceImpl业务层实现类,实现以上接口,然后,在类之前添加注解: @Service public class UserServiceImpl implements IUserService { @Override public User login(String username, String password) { // TODO Auto-generated method stub return null; } } 然后,在类中添加持久层对象,并实现抽象方法: @Service public class UserServiceImpl implements IUserService { @Autowired private UserMapper userMapper; @Override public User login(String username, String password) { User result = userMapper.findByUsername(username); if (result == null) { throw new UserNotFoundException(); } else { if (result.getPassword().equals(password)) { return result; } else { throw new PasswordNotMatchException(); } } } } 最后,编写并执行单元测试: @Autowired public IUserService userService; @Test public void login() { try { String username = "kate"; String password = "abcd"; User result = userService.login(username, password); System.err.println(result); } catch (UserNotFoundException e) { System.err.println("用户名错误!"); } catch (PasswordNotMatchException e) { System.err.println("密码错误!"); } } 8. 完善控制器层 控制器层应该向客户端响应JSON格式的数据,所以,首先,需要创建cn.tedu.springboot.util.JsonResult响应结果类: public class JsonResult { private Integer state; private String message; public Integer getState() { return state; } public void setState(Integer state) { this.state = state; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 然后,调用处理请求的方法,以实现登录功能: @RestController @RequestMapping("/") public class UserController { @Autowired private IUserService userService; @RequestMapping("login") public JsonResult login(String username, String password) { System.out.println("登录用户名:" + username); System.out.println("登录密码:" + password); JsonResult jsonResult = new JsonResult(); try { userService.login(username, password); jsonResult.setState(1); } catch (UserNotFoundException e) { jsonResult.setState(2); jsonResult.setMessage("用户名不存在"); } catch (PasswordNotMatchException e) { jsonResult.setState(3); jsonResult.setMessage("密码错误"); } return jsonResult; } } 9. 完善前端页面

用户登录

请输入用户名:

请输入密码:

正确的开发流程:持久层 > 业务层 > 控制器 > 界面