赞
踩
Web程序三层架构
数据层:Mybatis
表现层:SpringMVC
SpringMVC制作过程:
具体代码见https://github.com/cug-lucifer/springmvc_01_quickstart
@Controller
类注解,位于SpringMVC控制类定义上方,设定SpringMVC核心控制器bean
@Controller
public class UserController{}
@RequestMapping
方法注解,位于SpringMVC控制器方法定义上方,设置当前控制器方法请求访问路径
@ResponseBody
方法注解,位于SpringMVC控制器方法定义上方,设置当前控制器方法响应内容为当前返回值,无需解析
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("saving ... ");
return "{'module':'SpringMVC}";
}
AbstractDispatcherServletInitializer
SpringMVC提供的快速初始化Web3.0容器的抽象类
public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer { // 加载springMVC容器配置 @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; } //设置哪些请求归属springMVC处理 @Override protected String[] getServletMappings() { return new String[]{"/"}; } //加载spring容器配置 @Override protected WebApplicationContext createRootApplicationContext() { return null; } }
ServletContainersInitConfig
类,初始化web容器createServletApplicationContext
方法,创建WebApplicationContext对象SpringMvcConfig
@ComponentScan
加载对应的beanUserController
,每个@RequestMapping
的名称对应一个具体的方法getServletMappings
方法,定义所有的请求都通过SpringMVClocalhost/save
/save
/save
匹配执行对应的方法save()
save()
@ResponseBody
直接将save()
方法的返回值作为响应报文体返回给请求方功能不同,如何避免Spring错误加载到SpringMVC中的bean
加载Spring控制的bean的时候,排除掉SpringMVC控制的bean
com.itheima.controller
包内com.itheima
,排除掉controller包内的bean@ComponentScan({"com.itheima.service","com.itheima.dao"})
public class SpringConfig {
}
方式二:
@Configuration
//设置spring配置类加载bean时的过滤规则,当前要求排除掉表现层对应的bean
//excludeFilters属性:设置扫描加载bean时,排除的过滤规则
//type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除
//classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean
@ComponentScan(value="com.itheima",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
@ComponentScan 类注解
属性:
web配置简化开发
继承AbstractAnnotationConfigDispatcherServletInitializer
,仅设置配置类类名即可完成开发
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
在控制器中添加CharacterEncodingFilter()
@Override
protected Filter[] getServletFilters(){
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("utf-8");
return new Filter[]{filter};
}
通过url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
参数名与变量名不同,使用@RequestParam("name")
类型
public class User {
private String name;
private int age;
//setter...getter...略
}
发送请求和参数
后台接收参数
//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println("pojo参数传递 user ==> "+user);
return "{'module':'pojo param'}";
}
注意:
应用于POJO对象中嵌套了其它的POJO类的情况
public class Address {
private String province;
private String city;
//setter...getter...略
}
public class User {
private String name;
private int age;
private Address address;
//setter...getter...略
}
发送请求
后台接收参数:
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println("pojo参数传递 user ==> "+user);
return "{'module':'pojo param'}";
}
注意:
请求参数key的名称要和POJO中属性的名称一致,否则无法封装
后台接收参数
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
return "{'module':'array param'}";
}
发送请求和参数
使用@RequestParam
注解来解决集合类型参数接收问题,请求参数名与形参对象属性名相同且请求参数为多个。
后台接收参数:
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println("集合参数传递 likes ==> "+ likes);
return "{'module':'list param'}";
}
@RequestParam
绑定参数关系@RequestParam
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。