springmvc
1. Spring MVC 概述
数据模型(Model),视图(View),控制器(Controller)
HTTP请求发送到控制器,控制层与业务层数据模型进行交互、获取数据,使用视图响应请求。
2. 使用 @RequestMapping映射请求
Controller层通过@RequestMapping映射请求:
package com.example.demo.controller;
import com.example.demo.pojo.User;
import com.example.demo.service.JdbcService;
import com.example.demo.service.JdbcTemplateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.sql.SQLException;
import java.util.List;
@Controller
@RequestMapping("/jdbc")
public class JdbcController {
@Autowired
private JdbcTemplateService jdbcService;
@RequestMapping("/insert")
@ResponseBody
public String insert(String id, String name, int age) throws SQLException, ClassNotFoundException {
User user = new User(name, id, age);
int i = jdbcService.insert(user);
String msg = "新增了" + i + "条数据";
return msg;
}
@RequestMapping("/update")
@ResponseBody
public String update(String id, String name, int age) throws SQLException, ClassNotFoundException {
User user = new User(name, id, age);
int i = jdbcService.update(user);
String msg = "更新了" + i + "条数据";
return msg;
}
@RequestMapping("/delete")
@ResponseBody
public String delete(String id) throws SQLException, ClassNotFoundException {
int i = jdbcService.delete(id);
String msg = "删除了" + i + "条数据";
return msg;
}
@RequestMapping("/search")
@ResponseBody
public User search(String id) throws SQLException, ClassNotFoundException {
User user = jdbcService.search(id);
return user;
}
}
服务层编写服务接口:
package com.example.demo.service;
import com.example.demo.pojo.User;
import java.util.List;
public interface JdbcTemplateService {
public User search(String id);
public int insert(User user);
public int update(User user) ;
public int delete(String id);
}
服务层接口实现类:
package com.example.demo.service.impl;
import com.example.demo.pojo.User;
import com.example.demo.service.JdbcTemplateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import java.sql.ResultSet;
@Service
@Slf4j
public class JdbcTemplateServiceImpl implements JdbcTemplateService {
@Autowired
private JdbcTemplate jdbcTemplate;
// 获取映射关系
private RowMapper<User> getUserMapper() {
RowMapper<User> userRowMapper = (ResultSet rs, int rownum) -> {
User user = new User();
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
user.setAge(rs.getInt("age"));
return user;
};
return userRowMapper;
}
@Override
public User search(String id) {
String sql = " select * from user where id = ?";
User user = jdbcTemplate.queryForObject(sql, getUserMapper(), id);
log.info("查询到数据" + user.toString());
return user;
}
@Override
public int insert(User user) {
String sql = " insert into user values( ?, ?, ?)";
int i = jdbcTemplate.update(sql, user.getName(), user.getId(), user.getAge());
return i;
}
@Override
public int update(User user) {
String sql = " update user set name = ?, age = ? where id = ?";
return jdbcTemplate.update(sql, user.getName(), user.getAge(), user.getId());
}
@Override
public int delete(String id) {
String sql = " delete from user where id = ?";
return jdbcTemplate.update(sql, id);
}
}
启动服务器,浏览器访问http://localhost:8080/jdbc/insert?id=111&name=R&age=1,得到:
新增了1条数据
3. 视图和视图解析器、处理方法的数据绑定
视图解析器通过路径定位到视图,视图将数据模型进行渲染亿响应用户的请求。
数据绑定
方法声明的参数可以与请求参数中名称相同的属性进行绑定
@RequestMapping("/insert")
@ResponseBody
// 方法参数中的id,name,age可以与请求参数中的id,name,age绑定
// http://localhost:8080/jdbc/insert?id=111&name=R&age=1
public String insert(String id, String name, int age) {
User user = new User(name, id, age);
int i = jdbcService.insert(user);
String msg = "新增了" + i + "条数据";
return msg;
}
绑定数组:
@RequestMapping("/list")
public String printUser(Long[] ids) {
return "ok";
}
// http://localhost:8080/user/list?ids=111,222,333
4. JSON处理
对于较复杂的数据,可以通过将数据封装成数据类进行json传递
使用@RequestBody注解可以接受从前端接收的json数据,json会根据字符串中的key来匹配对应实体类的属性。
@RequestMapping("/print")
public String (@RequestBody User user) {
System.out.println(user);
return "ok";
}
5. 拦截器学习
自定义拦截器:
package com.example.demo.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器前方法......");
// 返回true,不会拦截后续处理
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器后方法......");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器完成方法......");
}
}
拦截器控制方法:
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/interceptor")
public class InterceptorController {
@RequestMapping("/start")
@ResponseBody
public String start() {
System.out.println("执行拦截器");
return "Over";
}
}
注册拦截器:
package com.example.demo;
import com.example.demo.interceptor.MyInterceptor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@SpringBootApplication
public class DemoApplication implements WebMvcConfigurer {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
// 注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration interceptor = registry.addInterceptor(new MyInterceptor());
interceptor.addPathPatterns("/interceptor/*");
}
}
启动服务器,访问http://localhost:8080/interceptor/start,控制台得到
拦截器前方法......
执行拦截器
拦截器后方法......
拦截器完成方法......