目录
1.SpringMVC简介
2.案例详解
2.1.创建项目
2.2.直接上项目结构
2.3.各个类文件及解释
2.4.运行结果
3.springmvc工作流程
4.springmvc参数传递
SpringMVC技术其实与Servlet技术功能基本相同,都属于web层开发技术。
使用原型创建这个模块,后面就一路next
做案例之前,先导入我们需要的依赖项
javax.servlet
javax.servlet-api
3.1.0
provided
com.fasterxml.jackson.core
jackson-databind
2.9.0
org.springframework
spring-webmvc
5.2.10.RELEASE
接着就是配置spring的Tomcat来运行项目,也是在pom.xml里添加
org.apache.tomcat.maven
tomcat7-maven-plugin
2.1
80
/
配置好后,来配置服务器。
MvcServletConfig.java
package com.example.config;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.Filter;
public class MvcServletConfig 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};
}
}
这是Tomcat加载Spring的配置类。继承 AbstractAnnotationConfigDispatcherServletInitializer
这个类后就需要重写三个方法:
getServletConfigClasses()方法告诉Tomcat加载springmvc容器配置。
getServletMappings() 告诉Tomcat哪些请求归springmvc管理,“ / ”代表所有都归springmvc管,也就是拦截所有请求。
getRootConfigClasses() 告诉Tomact加载spring容器配置,和上面的是不一样的。
getServletFilters() 这不是必须重写的,但是项目中需要获取中文数据就需要配置这个过滤器。
SpringMvcConfig.java
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan("com.example")
@EnableWebMvc
public class SpringMvcConfig {
}
SpringMVC的配置类,前两个注解就不多说了
@EnableWebMvc:开启web MVC的配置支持,把JSON数据转换成相应的实体类
UserController.java
package com.example.controller;
import com.example.entity.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Date;
import java.util.List;
@Controller
public class UserController {
@RequestMapping("/data")
@ResponseBody
public String dataParam(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(yyyy-MM-dd) ==> "+date1);
System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
return "{'module':'data param'}";
}
@RequestMapping("/adduser")
@ResponseBody
public String addUser(@RequestParam("name") String name){
System.out.println("添加了一个人"+name);
String str="{'name':'"+name+"'}";
return str;
}
@RequestMapping("/alluser")
@ResponseBody
public String listUser(@RequestBody List users){
System.out.println("添加了一个人"+users);
return "成功";
}
@RequestMapping("/yuser")
@ResponseBody
public String yUser(@RequestBody User user){
System.out.println("添加了一个人"+user);
return "成功";
}
}
@Controller 这个注解是开发springmvc专用的注解,不能用其他的注解
@RequestMapping("/add") 设置访问路径,可以放在类的前面作为请求路径的前缀,防止冲突
@ResponseBody 把返回的内容整体给到页面
@RequestBody 数据在请求体中
@RequestParam 数据是集合,把请求参数名为***的参数赋值给后面自己指定的参数,传字符串数组时也需要加上它,用于直接把值赋值给字符数组。
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss") 指定日期格式,spring默认的格式是yyyy/MM/dd(注:导入Data的包是要导入import java.util.Date这个,其他的会报错)。
参数传递:
方法括号内就可以接收请求的数据 ,可以是实体类,字符串,数组以及实体类列表,这个功能得益于jackson-databind包和注解@EnableWebMvc。上面这个例子就包括了各种参数传递的案例。不得不说,springMvc非常强大是不是。
Address.java
package com.example.entity;
public class Address {
private String province;
private String city;
@Override
public String toString() {
return "Address{" +
"province='" + province + '\'' +
", city='" + city + '\'' +
'}';
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
User.java
package com.example.entity;
public class User {
private String name;
private int age;
private Address address;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
启动服务器时
1.服务器启动,执行MvcServletConfig这个配置类,初始化web容器
2.执行createServletApplicationContext方法,创建了webApplicationcontext对象
3.加载SpringMvcConfig
4.执行@ComponentScan加载对应的bean
5.加载Usercontroller,每个@RequestMapping的名称对应一个具体的方法
6.执行getservletMappings方法,定义所有的请求都通过SpringMvc
发送请求时:
1.发送请求localhost/adduser
2. web容器发现所有请求都经过SpringMNc,将请求交给SpringMVC处理
3.解析请求路径/adduser
4.由/save匹配执行对应的方法adduser()
5.执行adduser()
6.检测到有@ResponseBody直接将adduser()方法的返回值作为响应体返回给请求页面
响应页面及页面跳转
不需要@ResponseBody,也就是不需要把返回内容给页面,加上就是把纯文本返回去。
@RequestMapping("/topage")
public String topage(){
System.out.println("页面跳转");
return "index.jsp";
}
响应实体对象
@RequestMapping("/touser")
@ResponseBody
public User touser(){
User user=new User("张三",22);
return user;
}
响应实体集合对象
@RequestMapping("/listuser")
@ResponseBody
public List toalluser(){
User user=new User("张三",22);
User user1=new User("李四",28);
List users =new ArrayList<>();
users.add(user1);
users.add(user);
return users;
}
说一点,这些转换都是HttpMessageConverter接口 帮我们转换的。
到这里就已经完成SpringMvc的基础案例,加上前面的sping就能把数据显示到页面了,这个以后慢慢实验吧。