1.开发过程中遇到的问题,将解决过程写下来,并且添加总结;
问题一
Spring Boot扫描包提示找不到mapper的问题,异常信息内容:
Consider defining a bean of type in your configuration
分析原因:Spring Boot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描,“Application类”是指Spring Boot项目入口类。如果Application类所在的包为:com.yoodb.blog,则只会扫描com.yoodb.blog包及其所有子包,如果service或dao所在包不在com.yoodb.blog及其子包下,则不会被扫描。
解决方法:
方式一:使用注解@ComponentScan(value=”com.yoodb.blog”),其中,com.yoodb.blog为包路径。
方式二:将启动类Application放在上一级包中,注意的是Application启动类必须要保证在包的根目录下。
问题二
启动Spring Boot时,,抛出异常信息如下:
Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package
application.Java类文件内容如下:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.boot.SpringApplication;
@Controller
@SpringBootApplication
@Configuration
public class HelloApplication {
@RequestMapping(";hello";)
@ResponseBody
public String hello() {
return ";hello world!";;
}
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
分析原因:Spring Boot启动时,抛出“** WARNING ** : Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package.”警告信息,这是由于application.Java文件不能直接放在main/java文件夹下,必须要建一个包把它放进去。
解决办法:Spring Boot在写启动类的时候如果不使用@ComponentScan指明对象扫描范围,默认指扫描当前启动类所在的包里的对象,如果当前启动类没有包,则在启动时会抛出上述警告信息,导致项目出错。
问题三
Spring Boot连接数据库时,抛出异常信息如下:
caused by: java.lang.NoClassDefFoundError: javassist/bytecode/ClassFile
分析原因:这是由于缺少javassist.jar包导致启动失败
解决办法:通过Eclipse执行Maven命令重构项目:Maven-Update Project,等待下载jar包即可,若还是失败请手动添加javassist.jar包的pom.xml配置信息。
Spring Boot使用spring-data-jpa插件,抛出异常信息如下:
caused by: java.lang.illegalargumentexception: Not a managed type: class entity.User
分析原因:这是由于Spring Boot未找到实体对象指定的类名,缺少jpa entity配置路径
解决办法:在Repository配置类前面添加注解@EntityScan(';entity对应的包路径';)。
问题四
Spring Boot返回json字符串,增加APPLICATION_JSON参数代码如下:
mvc.perform(MockMvcRequestBuilders.get(";/hello";).accept(MediaType.APPLICATION_JSON))
在添加APPLICATION_JSON参数后,抛出“APPLICATION_JSON cannot be resolved or is not a field”异常信息。
分析原因: Bean实体中存在getX或setX方法,但是没有这个x属性,将导致json转换失败,抛出“APPLICATION_JSON cannot be resolved or is not a field”异常信息。
解决办法:去掉不存在属性的getX或setX方法或者增加上改属性即可。
2.上课中你做得比较好的项目(练习),比如某实体类的增删改查;
-
定义实体类:首先需要定义一个Java类作为实体类,使用
@Entity
和@Table
注解标记实体类,并定义类的属性和关联关系。 -
编写Repository接口:创建一个继承自JpaRepository或CrudRepository的接口,该接口提供了常见的数据库操作方法,包括保存、删除、查询等。
-
编写Service层:创建一个Service类用于实现业务逻辑,调用Repository中的方法完成数据的增删改查操作,并进行相应的业务处理。
-
编写Controller层:创建RESTful风格的Controller类,处理前端请求并调用Service层完成业务逻辑,然后返回相应的结果。
下面是一个简单的示例:
// 实体类定义
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String email;
// 省略其他属性和方法
}
// Repository接口
public interface UserRepository extends JpaRepository<User, Long> {
// 可以根据需要定义一些自定义的查询方法
}
// Service类
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
public User saveUser(User user) {
return userRepository.save(user);
}
// 其他业务逻辑方法
}
// Controller类
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
@PostMapping
public User createUser(@RequestBody User user) {
return userService.saveUser(user);
}
// 其他请求处理方法
}
总结: 在Spring Boot中进行实体类的增删改查操作,需要合理地设计实体类、Repository、Service和Controller,遵循单一职责原则,并利用Spring Boot框架提供的功能来简化开发。同时,需要注意异常处理、参数校验等方面,保证代码的健壮性和安全性。
3.Spring boot常用注解介绍;
-
@SpringBootApplication:
- 用于标记Spring Boot应用的启动类,通常与main方法一起使用。该注解整合了@Configuration、@EnableAutoConfiguration和@ComponentScan注解。
-
@Controller:
- 标记一个类作为Spring MVC的Controller,用于处理HTTP请求。
-
@RestController:
- 结合@Controller和@ResponseBody,通常用于RESTful风格的Controller类,返回的数据会直接写入HTTP响应体中。
-
@Service:
- 用于标记一个类作为业务逻辑层的Service组件。
-
@Repository:
- 用于标记一个类作为数据访问层的Repository组件,通常与持久层框架(如Spring Data JPA)一起使用。
-
@Autowired:
- 用于自动装配Bean,可以标记在字段、构造器、Setter方法上,Spring会根据类型进行自动装配。
-
@Component:
- 通用的Spring组件标记注解,可以标记任意一个Bean。
-
@RequestMapping:
- 用于将HTTP请求映射到Controller的处理方法上,可以指定请求的URL和HTTP方法。
-
@PathVariable:
- 用于将URL中的模板变量绑定到处理方法的参数上。
-
@RequestParam:
- 用于将HTTP请求的参数绑定到处理方法的参数上。
-
@ResponseBody:
- 通常用于RESTful Controller,将方法返回的对象直接作为HTTP响应体返回。
-
@Configuration:
- 用于定义配置类,可以替代XML配置文件。
-
@EnableAutoConfiguration:
- 开启Spring Boot的自动配置功能,根据classpath中的jar包自动配置Spring应用。
-
@Value:
- 用于从配置文件中读取属性值,可以注入到Bean中使用。
-
@Transactional:
- 用于标记事务管理相关的方法或类,控制事务的提交和回滚。
这些注解只是Spring Boot中的一部分,还有很多其他的注解用于支持不同的功能和场景。合理地使用这些注解可以帮助开发者简化代码、提高开发效率,同时符合Spring Boot的约定优于配置的思想。
4.数据层框架的整合和使用,如JdbcTemplate、mybatis、mybatis-plus的原理及其应用实现;
JdbcTemplate
原理: JdbcTemplate是Spring框架提供的用于简化JDBC编程的工具,它封装了JDBC的常见操作,如创建连接、执行SQL语句、处理结果集等,使得数据库访问更加便捷。
应用实现:
- 配置数据源:在Spring Boot中配置数据源(DataSource)的Bean。
- 注入JdbcTemplate:将数据源注入到JdbcTemplate的Bean中。
- 使用JdbcTemplate:在Service或Repository中使用JdbcTemplate来执行SQL语句,例如查询、更新等操作。
-
@Autowired private JdbcTemplate jdbcTemplate; public void updateUserName(Long id, String newName) { jdbcTemplate.update("UPDATE users SET username = ? WHERE id = ?", newName, id); }
MyBatis-Plus
原理: MyBatis-Plus是在MyBatis基础上进行扩展的数据库访问层框架,提供了更多的便捷功能,如代码生成器、分页查询、条件构造器等。
应用实现:
- 集成MyBatis-Plus:在Spring Boot中引入MyBatis-Plus的依赖。
- 定义实体类和Mapper接口:定义实体类并创建对应的Mapper接口。
- 使用MyBatis-Plus提供的功能:利用MyBatis-Plus提供的API进行数据库操作,如条件构造器、分页查询等。
-
@Service public class UserService { @Autowired private UserMapper userMapper; public List<User> findUsersByName(String name) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("username", name); return userMapper.selectList(queryWrapper); } }
总结: JdbcTemplate、MyBatis和MyBatis-Plus都是在Spring Boot应用中常用的数据层框架,它们各自有不同的特点和适用场景。合理地选择并整合这些框架能够有效地简化数据库操作、提高开发效率,并且符合Spring Boot的约定优于配置的理念。
5.前端模板引擎Thymeleaf的整合和使用;
整合Thymeleaf
在Spring Boot应用中整合Thymeleaf主要涉及两个方面:添加依赖和配置视图解析器。
- 添加依赖:在
pom.xml
文件中添加Thymeleaf的依赖。xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
- 配置视图解析器:Spring Boot会自动配置Thymeleaf视图解析器,但也可以根据需要进行自定义配置。
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); } @Bean public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine); resolver.setCharacterEncoding("UTF-8"); return resolver; } @Bean public SpringTemplateEngine templateEngine(TemplateResolver templateResolver) { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setTemplateResolver(templateResolver); return engine; } @Bean public TemplateResolver templateResolver() { TemplateResolver resolver = new ServletContextTemplateResolver(); resolver.setPrefix("/WEB-INF/templates/"); resolver.setSuffix(".html"); resolver.setTemplateMode("HTML"); return resolver; } }
使用Thymeleaf
在使用Thymeleaf时,可以在HTML页面中嵌入Thymeleaf的表达式来渲染动态内容,如变量、条件判断、循环等。
变量渲染
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Hello World</title> </head> <body> <p th:text="${message}"></p> </body> </html>
条件判断和循环
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>User List</title> </head> <body> <ul> <li th:each="user : ${users}" th:text="${user.name}"></li> </ul> <div th:if="${users.isEmpty()}">No users found.</div> </body> </html>
在Controller中,可以通过Model对象将数据传递给Thymeleaf模板。
@Controller public class HelloController { @GetMapping("/hello") public String hello(Model model) { model.addAttribute("message", "Hello, Thymeleaf!"); return "hello"; } }
总结
Thymeleaf作为一款功能强大的模板引擎,与Spring Boot整合后能够简化前端开发工作,提供了丰富的表达式和功能,使得前端页面的动态渲染变得更加便捷。通过合理利用Thymeleaf,开发者可以快速构建出美观、动态的Web界面。
6.Bootstrap前端框架的整合及应用;
整合Bootstrap
在Web应用中整合Bootstrap主要包括引入Bootstrap相关的CSS和JavaScript文件,并在HTML页面中使用Bootstrap提供的组件和样式。
- 引入Bootstrap文件:通过CDN或本地文件引入Bootstrap的CSS和JavaScript文件。
<!-- 通过CDN引入Bootstrap -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
- 使用Bootstrap组件:在HTML页面中使用Bootstrap提供的组件,如导航栏、表格、按钮等。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Bootstrap Example</title> <!-- 引入Bootstrap文件 --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"> </head> <body> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="#">Navbar</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item active"> <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a> </li> <li class="nav-item"> <a class="nav-link" href="#">Features</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Pricing</a> </li> </ul> </div> </nav> <div class="container"> <h1>Welcome to Bootstrap</h1> <button type="button" class="btn btn-primary">Primary Button</button> </div> <!-- 引入Bootstrap JavaScript --> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script> </body> </html>
应用Bootstrap
使用Bootstrap能够轻松实现响应式布局、页面美化和交互效果。开发者可以利用Bootstrap提供的样式和组件,快速搭建起具有现代感的网页。
响应式布局
Bootstrap内置了响应式网格系统,使得网页能够根据设备屏幕大小自动调整布局。通过使用
container
、row
和col
等类,可以轻松创建出各种响应式布局。组件和样式
Bootstrap提供了丰富的组件和样式,如导航栏、卡片、表单、按钮等,开发者可以直接使用这些组件来构建页面,而无需从头编写样式和交互逻辑。
JavaScript插件
Bootstrap还提供了一些常用的JavaScript插件,如模态框、轮播图、下拉菜单等,可以增强页面的交互体验。
总结
通过集成Bootstrap前端框架,开发者可以快速搭建响应式、美观的Web界面,同时减少重复的样式和布局代码编写。借助Bootstrap提供的组件和样式,开发者能够更高效地开发出符合现代设计标准的网页,提升用户体验并节省开发时间。