使用SpringMVC需要先导入SpringMVC坐标与Servlet坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.0.11</version>
</dependency>创建SpringMVC控制器类(等同于Servlet功能)
@Controller
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save() {
System.out.println("UserController.save()");
return "{'info':'SpringMVC'};";
};
};初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean
@Configuration
@ComponentScan("com.cikian")
public class SpringMvcConfig {
};初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return null;
};
@Override
protected String[] getServletMappings() {
return new String[]{"/"};;
};
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
};
};SpringMVC入门程序开发总结(1+N):
@RequestMapping)与返回json数据(@ResponseBody)@ComponentScan加载对应的bean@RequestMapping的名称对应一个具体的方法@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方Controller加载控制与业务bean加载控制
如何避免Spring加载SpringMVC加载的bean
SpringMVC相关bean加载控制
Spring相关bean加载控制
方式一:Spring加载的bean设定扫描范围为com,排除掉controller包内的bean,如:
@ComponentScan(value = "com.cikian",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)方式二:Spring加载的bean设定扫描范围为精准范围,例如servicet包、dao包等,如:
@ComponentScan({"com.cikian.service", "com.cikian.dao"})
方式三:不区分Spring与SpringMVCl的环境,加载到同一个环境中
名称:
@ComponentScan类型:类注解 范例: @Configuration @ComponentScan(value = "com.cikian", excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, classes = Controller.class ) ) public class SpringConfig { }; 属性:
简化
ServletContainersInitConfig配置类: public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringConfig.class};; }; @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class};; }; @Override protected String[] getServletMappings() { return new String[]{"/"};; }; };
为了防止请求路径设置重复,可以给不同模块设置不同的请求路径前缀
名称:
@RequestMapping类型:方法注解 类注解 位置:SpringMVC控制器方法定义上方 作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀 范例: @RequestMapping("/user") @Controller public class UserController { @RequestMapping("/save") @ResponseBody public String save() { System.out.println("user/save执行。。。"); return "{'info':'usersave'};"; }; @RequestMapping("/data") @ResponseBody public String data() { System.out.println("user/data执行。。。"); return "{'msg':'userdata'};"; }; }; 属性: value(默认):请求访问路径,或访问路径前缀
接收请求参数:直接在方法中加上对应的形参即可:
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name,int age) {
System.out.println("参数传递:" + name);
System.out.println("参数传递:" + age);
return "{'msg':'commonParam'};";
};处理中文乱码问题 在ServletContainersInitConfig配置类中,设置过滤器,重写getServletFilters方法: @Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF8"); return new Filter[]{characterEncodingFilter};; };
url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数。或使用@RequestParam注解将请求参数与形参绑定,如:
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(@RequestParam("username") String name, int age) {
System.out.println("参数传递:" + name);
System.out.println("参数传递:" + age);
return "{'msg':'commonParam'};";
};@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user) {
System.out.println("参数传递:" + user);
return "{'msg':'pojoParam'};";
};User类中有name与age属性,参数传递过来时,会自动将对应名称的属性封装进pojo类
当pojo类型参数的实体对象中有引用的对象时,如User类中还引用Address类,此时可以下面方式传递:
127.0.0.1/user/pojoParam2/?name=张三&age=18&address.province=河北&address.city=秦皇岛
@RequestMapping("/arrayParam")
@ResponseBody
public String pojoParam(String[] likes) {
System.out.println("参数传递:" + Arrays.toString(likes));
return "{'msg':'arrayParam'};";
};传递数组类型参数时,在访问时,使用多个向明名称的访问参数,如:
localhost/user/arrayParam?likes=吃&likes=喝&likes=拉&likes=撒&likes=睡
当接收List集合参数时,传递参数的方式与数组类型参数传递方式一样,在接收参数时,要在形参前使用@RequestParam注解,如:
@RequestMapping("/listParam")
@ResponseBody
public String pojoParam(@RequestParam List<String> likes) {
System.out.println("参数传递:" + likes);
return "{'msg':'listParam'};";
};导入处理json数据的坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>在SpringMvcConfig中使用@EnableWebMvc注解开启由json数据转换成对象的功能
@Configuration
@ComponentScan("com.cikian.controller")
@EnableWebMvc
public class SpringMvcConfig {};在就收参数的方法的形参前加@RequestBody注解
传递json数组
@RequestMapping("/jsonParam")
@ResponseBody
public String jsonParam(@RequestBody List<String> likes) {
System.out.println("参数传递:" + likes);
return "{'msg':'jsonParam'};";
};请求参数:
["game","music","code"]传递json对象(POJO)
@RequestMapping("/jsonPojoParam")
@ResponseBody
public String jsonPojoParam(@RequestBody User user) {
System.out.println("参数传递:" + user);
return "{'msg':'jsonPojoParam'};";
};请求参数:
{
"name":"陈",
"age":18,
"address":{
"province":"河北",
"city":"秦皇岛"
};
};传递json对象数组(POJO)
@RequestMapping("/jsonPojoListParam")
@ResponseBody
public String jsonPojoListParam(@RequestBody List<User> users) {
System.out.println("参数传递:" + users);
return "{'msg':'jsonPojoListParam'};";
};请求参数:
[
{
"name":"张三",
"age":15,
"address":{
"province":"河北",
"city":"秦皇岛"
};
};,
{
"name":"李四",
"age":18,
"address":{
"province":"北京",
"city":"北京"
};
};
]@RequestBody
@RequestBody与@RequestParam
@RequestParam用于接收url地址传参,表单传参【application/X-www-form-urlencoded】@RequestBody用于接收json数据【application/json】@RequestBody应用较广@RequestParam接收请求参数日期类型数据基于系统不同格式也不尽相同,如:
默认接收"yyyy/MM/dd HH:mm:ss"格式日期,可以使用@DateTimeFormat注解自定义传入格式:
@RequestMapping("/dateParam")
@ResponseBody
public String dateParam(Date date1,
@DateTimeFormat(pattern = "yyyy-MM-dd") Date date2,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date date3) {
System.out.println("参数传递:" + date1);
System.out.println("参数传递:" + date2);
System.out.println("参数传递:" + date3);
return "{'msg':'dateParam'};";
};如此定义,请求参数:
localhost/user/dateParam?date1=2023/08/07 20:30:50&date2=2023-08-07&date3=2023-08-07 15:25:30中的三种日期都能正确接收
@DateTimeFormatConverter接口 public interface Converter<S, T> { @Nullable T convert(S var1); };
@EnableWebMvc功能之一:根据类型匹配对应的类型转换器
@RequestMapping("/toJumpPage")
public String toJumpPage() {
System.out.println("跳转页面。。。");
return "/page.jsp";
};在方法中返回的字符串默认会被当做响应的页面文件的名称
响应文本数据:
@RequestMapping("/toText")
@ResponseBody
public String toText() {
System.out.println("返回纯文本");
return "response text";
};响应json数据(对象转json):
@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO() {
System.out.println("返回json对象");
User user = new User();
user.setName("陈cikian");
user.setAge(18);
return user;
};响应json数组(对象集合转json数组):
@RequestMapping("/toJsonList")
@ResponseBody
public List<User> toJsonList() {
User user1 = new User();
user1.setName("张三");
user1.setAge(15);
User user2 = new User();
user2.setName("李四");
user2.setAge(120);
List<User> users = Arrays.asList(user1, user2);
return users;
};@ResponseBody类型转换的功能来自HttpMessageConverter接口
@Controller
public class UserController {
@RequestMapping(value = "/users", method = RequestMethod.POST)
@ResponseBody
public String save(User user) {
System.out.println("user.save:" + user);
return "{'info':'user.save'};";
};
@RequestMapping(value = "/users/{id};", method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id) {
System.out.println("user.delete:" + id);
return "{'info':'user.delete'};";
};
@RequestMapping(value = "/users", method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody User user) {
System.out.println("user.update:" + user);
return "{'info':'user.update'};";
};
@RequestMapping(value = "/users/{id};", method = RequestMethod.GET)
@ResponseBody
public String getById(@PathVariable Integer id) {
System.out.println("user.getById:" + id);
return "{'info':'user.getById'};";
};
@RequestMapping(value = "/users", method = RequestMethod.GET)
@ResponseBody
public String getAll() {
System.out.println("user.getAll:");
return "{'info':'user.getAll'};";
};
};method = RequestMethod.POST
/users/{id},形参前使用@PathVariable注解,如:@PathVariable Integer id,占位符的名称应与形参名称相同。
@RequestMapping@PathVariable
@RequestBody@RequestParam@PathVariable
@RequestParam用于接收url地址传参或表单传参@RequestBody用于接收请求体数据,主要为json数据@PathVariable用于接收路径参数,使用{参数名称}描述路径参数@RequestBody应用较广@RequestParam接收请求参数@PathVariable接收请求路径变量,通常用于传递id值上述案例代码可修改为以下内容:
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public String save(@RequestBody User user) {
System.out.println("user.save:" + user);
return "{'info':'user.save'};";
};
@DeleteMapping("/{id};")
public String delete(@PathVariable Integer id) {
System.out.println("user.delete:" + id);
return "{'info':'user.delete'};";
};
@PutMapping
public String update(@RequestBody User user) {
System.out.println("user.update:" + user);
return "{'info':'user.update'};";
};
@GetMapping("/{id};")
public String getById(@PathVariable Integer id) {
System.out.println("user.getById:" + id);
return "{'info':'user.getById'};";
};
@GetMapping
public String getAll() {
System.out.println("user.getAll:");
return "{'info':'user.getAll'};";
};
};@RestController@Controller与@ResponseBody两个注解组合功能@GetMapping @PostMapping @PutMapping @DeleteMapping@GetMapping对应GET请求由于设置了SpringMVC拦截所有路径请求,所以会导致访问不到静态资源,如html文件、css文件、js文件、图片等,所以需要设置放行拦截路径,在config包下创建SpringMvcSupport配置类,内容如下:
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/pages/**").addResourceLocations("classpath:/pages/");
registry.addResourceHandler("/css/**").addResourceLocations("classpath:/css/");
registry.addResourceHandler("/js/**").addResourceLocations("classpath:/js/");
registry.addResourceHandler("/img/**").addResourceLocations("classpath:/img/");
};
};然后在SpringMVC配置类中将此配置类导入,导入方法不唯一,例如:@ComponentScan({"com.cikian.controller", "com.cikian.config"})