@RequestParam用于从请求URL中获取参数并映射到方法参数中的注解。
@RequestMapping将一个请求URL指向一个类的方法的注解。用于处理请求地址映射,可以作用于类和方法上。
@ResponseBody作用于方法上,可以将整个返回结果以某种格式返回,如JSON字符串。
@ModelAttribute作用在Controller的某个方法上,此方法会首先被调用,并将方法结果作为Model的属性。
@Autowired自动按照类型注入,不关心bean的id,只要有唯一的类型匹配就可以注入成功。如果注入的bean在容器中类型不唯一时,他会把变量名作为bean的id,然后在容器中查找,找到则注入成功,如果没有一致的beanId则报错。
除注解外,还需要了解项目的文件路径、配置文件等。
用户开发源代码都在src/main/java中
Resources:static静态资源:图片,视频,音频,js,css
Templates: 模板(freemarker,thymeleaf,默认不支持jsp)
Aplication.properties :spring boot 配置文件
Spring boot 内置tomcat,无需配置tomcat,直接以java application来执行
org.springframework.boot
spring-boot-starter-jdbc
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.1
mysql
mysql-connector-java
runtime
@Component【最好对应到每层中(@Controller、@Service、@Repository、@Mapper)】、@RequestMapping(“路径”)【填写路径时需要注意类名上方是否已经存在父路径】、@Autowired、@RequestParam(“xx”)【xx为前端中的name属性对应的名称】、
resultType【全类名一定要写对】、parameterType、resultMap、association【id、result】、collection【id、result】、#{}、useGeneratedKeys、一些id的对应关系
@preHandle、@postHandle、@afterCompletion、addInterceptors、HandleInterceptor
@Pointcut、@Before、@After、@Around、@AfterReturning、@AfterThrowing
将组件之间的依赖关系反转,让外部容器来负责这些依赖关系,而不是由组件自己来创建和管理他们。
①使用set方式注入 ②使用构造函数 ③使用注解注入【配置文件可能出现的代码题中】
使用ApplicationContext工厂的接口,使用该接口可以获取到具体的Bean对象。
面向切面编程,把程序中重复的代码抽取出来,在需要执行的时候使用动态代理技术在不修改源代码的基础上对已有方法进行增强。
①Joinpoint(连接点):指能被拦截到的点,在Spring中只有方法能被拦截。
②Pointcut(切点):指要对那些连接点进行拦截,即被增强的方法。
③Advice(通知):指拦截后要做的事情,即切点被拦截后执行的方法。
④Aspect(切面):切点加通知称为切面。
@Pointcut:定义切入点表达式,即指定在哪些方法或类上应用切面逻辑。
@Before:在目标方法执行之前执行切面逻辑。
@After:在目标方法执行之后(无论是否发生异常)执行切面逻辑。可用于执行一些收尾操作,如资源释放、事务处理等。
@Around:在目标方法执行前后执行切面逻辑,并可以控制目标方法的执行。
@AfterReturning:在目标方法成功执行后执行切面逻辑。
@AfterThrowing:在目标方法抛出异常后执行切面逻辑。
① 环绕通知前
② @Before通知
③ 程序逻辑
④ @AfterReturning通知
⑤ 通知@After通知
⑥ 环绕通知后
① 环绕通知前
② @Before通知
③ @AfterThrowing异常通知
④ @After通知
执行顺序和Spring版本有关
①执行preHandle方法,该方法返回一个布尔值。如果为false,则结束所有流程;如果为true,则执行下一步;
② 执行处理器逻辑,它包含控制器的功能;
③ 执行postHandle方法;
④ 执行视图解析和视图渲染;
⑤执行afterCompletion方法。
public ModelAndView test(User user) {
ModelAndView mv = new ModelAndView();
MappingJackson2JsonView jsonview = new MappingJackson2JsonView();
mv.setView(jsonview);
mv.addObject("user", user);
return mv;
}
ORM(对象关系映射) 数据库表字段名和实体类属性名保持一致。
映射文件名和接口文件名称一致(除扩展名)
mybatis映射文件的位置必须和dao接口的包结构相同
映射文件的名称空间namespace对应接口全类名
映射配置文件的操作配置,id的取值必须是dao接口的方法名
private String bookname;
public void setBookname(String bookname) {
this.bookname = bookname;
}
<bean id="book" class="cn.itcast.property.Book">
<property name="bookname" value="数据结构"/>
bean>
<bean id="book" class="cn.itcast.property.Book">
<constructor-arg name="bookname" value="数据结构"/>
bean>
public class UserServiceImpl1 implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public void saveCustom(String arg){
...
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<body>
<form method="post" action="/upload/multipart" enctype="multipart/form-data">
<input type="file" name="photo" value="请选择上传的文件"/>
<input type="sumbit" value="提交"/>
form>
body>
html>
package com.springmvc.chapter0320191007.controller;
@Controller
public class FileController{
@PostMapping("/upload/multipart")
@ResponseBody
public Map<String, Object> upload(@RequestParam("photo") MultipartFile photo)
{
String path = "d:/uploaded/";//保存路径
String filename = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
// 获取上传文件的后缀suffix
String suffix = photo.getOriginalFilename().substring(photo.getOriginalFilename().lastIndexOf("."));
try {
// Spring提供了文件操作类FileCopyUtils
FileCopyUtils.copy(photo.getInputStream(), new FileOutputStream(path+filename+suffix));
} catch(IOException e) {
e.printStackTrace();
return dealResultMap(false, "上传失败");
}
return dealResultMap(true, "上传成功");
}
// 处理上传文件结果
private Map<String, Object> dealResultMap(boolean success, String msg) {
Map<String, Object> result = new HashMap<String, Object>();
result.put("success", success);
result.put("msg", msg);
return result;
}
}
package com.cn.entity
public class User{
private Integer id;
private String userName;
private String note;
setter、getter方法
}
package com.cn.dao
/***import***/
@Mapper
public interface IUserDao{
public List<User> findAllUsers();
public User getUserById(Integer uid);
public Integer insertUser(User user);
...
}
<mapper namespace="com.cn.dao.IUserDao">
<select id="getUserById" paramterType="Integer" resultType="com.cn.entity.User">
select id,user_name as userName,note from t_user where id=#{uid};
select>
<select id="findAllUsers" resultType="com.cn.entity.User">
select id,user_name as userName,note from t_user
select>
<insert id="insertUser" parameterType="com.cn.entity.User"
useGeneratedKeys="true" keyProperty="id">
insert into t_user(user_name, note) values(#(userName), #{note})
insert>
mapper>
<select id="getClass" parameterType="Integer" resultMap="ClassResultMap">
select *
from class c,
teacher t
where c.teacher_id = t.t_id
and c.c_id = #{id}
select>
<resultMap id="ClassResultMap" type="nuc.ty._20231202myatis.pojo.Classs">
<id property="id" column="c_id">id>
<result property="name" column="c_name">result>
<association property="teacher" column="teacher_id" javaType="nuc.ty._20231202myatis.pojo.Teacher">
<id property="id" column="t_id"/>
<result property="name" column="t_name"/>
association>
resultMap>
<mapper namespace="nuc.ty._20231202myatis.dao.IDeptDao">
<select id="findByDeptno" parameterType="Integer" resultMap="deptMap">
select *
from dept
where deptno = #{deptno}
select>
<resultMap type="nuc.ty._20231202myatis.pojo.Dept" id="deptMap">
<id property="deptno" column="deptno"/>
<result property="dname" column="dname"/>
<result property="location" column="loc"/>
<collection property="emps" javaType="ArrayList"
ofType="nuc.ty._20231202myatis.pojo.Emp"
column="deptno"
select="nuc.ty._20231202myatis.dao.IEmpDao.findByDeptno">
collection>
resultMap>
mapper>
<mapper namespace="nuc.ty._20231202myatis.dao.IEmpDao">
<select id="findByDeptno" parameterType="Integer"
resultType="nuc.ty._20231202myatis.pojo.Emp">
select * from emp
where deptno=#{deptno}
select>
mapper>