SpringMVC
SpringMVC简介
- SpringMVC技术与Servlet技术功能相同 , 均属于web层开发技术 ( 更为简单 )
SpringMVC 配置方法
-
导入坐标 , SpringMVC 和 servlet
<dependencies> <!--1.导入坐标 , SpringMVC 和 servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies> <build> <plugins> <!-- tomcat插件控制 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <!--端口控制--> <port>8080</port> <!--项目路径控制意味着http://localhost:8080/--> <path>/</path> <!--编码--> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin> </plugins> </build>
-
定义Controller
//2.定义Controller //2.1 使用 @Controller 定义bean @Controller public class UserController { //2.2 设置当前方法的访问路径 @RequestMapping("/save") //2.3 设置当前操作的返回值的类型 @ResponseBody public String save() { System.out.println("user save ..."); return "{'module','SpringMVC'}"; } }
-
创建 springmvc 的配置文件 , 加载controller对应的bean
//3. 创建 springmvc 的配置文件 , 加载controller对应的bean @Configuration //设置为配置类 @ComponentScan("com.lyx.controller") //扫描包中配置的bean public class SpringMvcConfig { }
-
定义一个servlet容器启动的配置类, 在里面加载spring的配置
//4. 定义一个servlet容器启动的配置类, 在里面加载spring的配置 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { //加载springmvc容器配置 @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; //改成返回ctx } //设置哪些请求归属springMVC处理 @Override protected String[] getServletMappings() { return new String[]{"/"}; //所有请求都归springmvc处理 } //加载spring容器配置 @Override protected WebApplicationContext createRootApplicationContext() { return null; } }
SpringMVC - bean加载控制
因为功能不同, 避免Spring错误加载到SpringMVC的bean ( 加载Spring控制的bean的时候排除掉SpringMVC控制的bean )
Controller加载控制与业务bean加载控制
-
SpringMVC相关bean ( 表现层bean )
-
Spring控制bean
-
业务bean ( Service )
-
功能bean ( DataSource等 )
-
-
SpringMVC相关bean加载控制
- SpringMVC加载的bean对应的包均在com.lyx.controller包内
-
Spring相关bean加载控制
-
方式一: Spring加载的bean设定扫描范围为精准范围, 例如service包, dao包等
-
方式二: Spring加载的bean设定扫描范围为com.lyx, 排除controller包内的bean
-
方式三: 不区分Spring与SpringMVC的环境, 加载到同一环境中
-
方式一
@Configuration
@ComponentScan({"com.lyx.dao","com.lyx.service"})
public class SpringConfig {
}
方式二
@Configuration
@ComponentScan(value = "com.lyx",
excludeFilters = @ComponentScan.Filter( //排除
type = FilterType.ANNOTATION, //按注解排除
classes = Controller.class //排除掉使用COntroller注解的bean
)
)
public class SpringConfig {
}
请求与响应
设置请求映射路径
在Controller包中的文件创建根目录, 避免因重名阐述报错
@Controller
@RequestMapping("/user") //根目录
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'moudle':'user save'}";
}
@RequestMapping("/delete")
@ResponseBody
public String delete(){
System.out.println("user delete ...");
return "{'moudle':'user delete'}";
}
}
请求方式
Get请求
@RequestMapping("/save")
@ResponseBody
public String save(String name,int age){
System.out.println("book save ...");
System.out.println("name -->"+ name);
System.out.println("age -->"+ age);
return "{'moudle':'book save'}";
}
添加参数 name age
Post请求
代码修改与get请求一致, Spring整合了get请求和post请求
SpringMVC解决Post请求中文乱码问题 ( 添加过滤器 )
但是请求中不能处理中文,所以添加过滤器 ( Filter )
重写servlet容器启动的配置类中的 getServletFilters() 方法
public class SercletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//中文乱码处理
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter(); //字符过滤器
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}
5种参数类型的传递
//普通数据类型
@RequestMapping("/commonparam")
@ResponseBody
public String commonParam(@RequestParam("user") String username,int age){
//@RequestParam给数据取别名
System.out.println("name ==>"+ username);
System.out.println("age ==>"+ age);
return "{'modle':'common param'}";
}
//POJO参数
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println("user ==>"+ user);
return "{'modle':'pojo param'}";
}
//嵌套POJO参数
@RequestMapping("/pojoContainPojo")
@ResponseBody
public String pojoContaainPojo(User user){
System.out.println("user ==>"+ user);
return "{'modle':'pojo param'}";
}
//数组参数
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println("数组参数传递likes ==>"+ Arrays.toString(likes));
return "{'modle':'array param'}";
}
//集合参数
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){ //将值作为参数写入集合
System.out.println("likes ==>"+ likes);
return "{'modle':'list param'}";
}
json数据传递参数
-
导入json坐标
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency>
-
在Spring配置文件中添加 @EnableWebMvc (开启json对象转化为数据的功能)
@Configuration @ComponentScan("com.lyx.controller") @EnableWebMvc //开启json对象转化为数据的功能 public class SpringMvcConfig { }
-
在参数前添加@RequestBody
//数组参数 @RequestMapping("/arrayParam") @ResponseBody //@ResponseBody的作用其实是将java对象转为json格式的数据 public String arrayParam(@RequestBody String[] likes){ //在参数前添加@RequestBody System.out.println("数组参数传递likes ==>"+ Arrays.toString(likes)); return "{'modle':'array param'}"; }
日期类型参数传递
普通时间类型格式不用转换 ( yyyy/MM/dd ) , 如其他格式需要转换, Spring的配置类需加上@EnableWebMvc
@EnableWebMvc : 根据数据类型匹配对应的转换器
@Controller
public class UserController {
@RequestMapping("/dateParam")
@ResponseBody
public String dateParam(Date date,
@DateTimeFormat(pattern = "yyyy-MM-dd") Date date1,
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date2){
System.out.println("参数传递date ==>" + date);
System.out.println("参数传递date1 ==>" + date1);
System.out.println("参数传递date2 ==>" + date2);
return "{'module':'data param'}";
}
}
@DateTimeFormat用于Date的格式转换 pattern 属性中写明输入的date格式
响应
@EnableWebMvc : 开启json对象转化为数据的功能 (有转换一定要打开)
-
响应页面
//跳转页面 @RequestMapping("/toJumpPage") public String toJumpPage(){ System.out.println("页面跳转"); return "index.jsp"; }
-
响应数据
-
文本数据
//返回字符串 @RequestMapping("/toText") @ResponseBody public String toText(){ System.out.println("返回文本"); return "to text"; }
-
Json数据
//响应POJO对象 @RequestMapping("/toJsonPOJO") @ResponseBody public User toJsonPOJO(){ System.out.println("返回POJO对象数据"); User user = new User(); user.setName("lyx"); user.setAge(22); return user; } //响应POJO集合对象 @RequestMapping("/toJsonList") @ResponseBody public List<User> toJsonList(){ System.out.println("返回JSON数据集合"); User user1 = new User(); user1.setName("小明"); user1.setAge(17); User user2 = new User(); user2.setName("小刚"); user2.setAge(18); List<User> userList = new ArrayList<>(); userList.add(user1); userList.add(user2); return userList; }
-
响应POJO集合对象时, 对象里一定要写get方法
public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
REST风格
表现形式状态转换
-
隐藏资源的访问行为, 无法通过地址得知对资源是何种操作
-
书写简化