一、SpringMVC的介绍
SpringMVC是一种基于Java实现MVC模型的轻量级Web框架,可以理解为这个框架包含了servlet的功能并代替了它。
二、SpirngMVC的依赖坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
最重要的SpringMVCConfig.java配置类:
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan({"cn.itheima.controller","cn.itheima.config"})
@EnableWebMvc
public class SpringMVCConfig {
}
三、对SpringMVC进行配置
使用SpringMVC其实是在tomcat接收到浏览器的请求后将请求交给DispatcherServlet,将DispatcherServlet加入到Spring中让DispatcherServlet来对后台的controller,Bean等进行管理。 DispatchaerServlet.java(注释里面有详细解释)
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
import javax.servlet.Filter;
public class DispatcherServlet extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext();
annotationConfigWebApplicationContext.register(SpringMVCConfig.class);
return annotationConfigWebApplicationContext;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("utf-8");
return new Filter[]{characterEncodingFilter};
}
}
简写版:
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class DispathcerServlet2 extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringMVCConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpirngConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
四、在未使用restful风格时使用的到的注解
4.1
@Configuration:标明是一个注解类。
@ComponentScan({"cn.itheima.controller","cn.itheima.config"}):扫描controller包小的“@Controller”注解。
@EnableWebMvc: 传递日期类型参数必须在配置类上使用@EnableWebMvc注解。其功能之一:根据类型匹配对应的类型转换器
@Controller:将其按照一个Controller对象,保存进web的IOC容器中,其实和"@Conpoment"类似只不过保存在ioc容器中的格式不一样。
@RequestMapping(“/path”):设置访问路径,可以写在方法上,也可以写在类的上面用来区分不同的controller。
@ResponseBody:告诉springmvc这是数据不是页面,相当于,曾经写的servelet中的Response响应体,resp.getWrite().write(" ")。若是不加则会被当成页面来跳转。
@RequestParam:保证与浏览器url中发送的参数名称一致,用来获取参数的值
4.2使用的演示
import cn.itheima.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/findAll")
@ResponseBody
public String findAll(String name,int age){
System.out.println("我执行了");
System.out.println("=====>"+name);
System.out.println("=====>"+age);
return "[{'name1':'chen'},{'name2':'qing'},{'name3':'xv}]";
}
@RequestMapping("/addUser")
@ResponseBody
public String addUser(User user){
System.out.println("我执行了");
System.out.println("=====>"+user);
return "[{'name1':'chen'},{'name2':'qing'},{'name3':'xv}]";
}
@RequestMapping("/selectById")
@ResponseBody
public String addUser(@RequestParam("id") int ids){
System.out.println("我执行了");
System.out.println("=====>"+ids);
return "[{'name1':'chen'},{'name2':'qing'},{'name3':'xv}]";
}
}
集合类型参数
请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
五、在对JSON串操作时出现的注解
@RequestBody:给JSON用的,因为你的参数是从请求体重传过来的,需要标注一下,当检测到前端传的json串时会自动封装成对象。
@DateTimeFormat:针对的是路径上的参数用来处理前端传过来的日期类型比如:"2012-08-12",或"2012/08/12"等。
@JsonFormat(pattern=“yyyy-MM-dd”):针对引用类型中出现Date类型,将其放在类中Date类型的属性的头上
@Jsonignore:转json串时忽略类中的头上有该注解的属性
使用演示:
import cn.itheima.pojo.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.ResponseBody;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/Json")
public class JsonController {
@RequestMapping("/array")
@ResponseBody
public String arrayList(@RequestBody List<String> list) {
System.out.println("我执行了");
System.out.println(list);
return "[{'woshishei':'皮卡丘'},{'woshishei':'皮卡丘'}]";
}
@RequestMapping("/duixiang")
@ResponseBody
public String JsonUser(@RequestBody User user) {
System.out.println("我执行了");
System.out.println(user);
return "[{'woshishei':'皮卡丘'},{'woshishei':'皮卡丘'}]";
}
@RequestMapping("/duixiangs")
@ResponseBody
public String JsonUsers(@RequestBody List<User> users){
System.out.println("我执行了");
System.out.println(users);
return "[{'woshishei':'皮卡丘'},{'woshishei':'皮卡丘'}]";
}
@RequestMapping("/dates")
@ResponseBody
public String JsonData(@DateTimeFormat(pattern = "yyyy/MM/dd") Date date){
System.out.println(date);
return "lksj";
}
}
解决响应数据是中文乱码的问题:
import cn.itheima.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/resp")
public class ResponseController {
@RequestMapping("/a")
@ResponseBody
public User resp(){
User user = new User();
user.setUsername("皮卡丘");
user.setPassword("123456");
return user;
}
}
六、在使用了restful风格之后的注解使用
@RestController:是@ResponseBody+@Controller的结合
@PostMapping:这是请求方法加上@RequestMapping的综合写法,post表示添加操作
@GetMapping("/{id}"):get表示查找操作,请求路径中可以携带参数
@PutMapping:表示更新操作
@DeleteMapping("/{bookId}"):表示删除操作
@PathVariable:用在restful风格上的,因为name是在请求路径上的,所以使用@PathVariable标注一下和GetMapping他们配合使用
使用演示:
import cn.itheima.pojo.Book;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/books")
public class RestfulController {
@PostMapping
public String addBook(@RequestBody Book book) {
System.out.println(book);
return "success";
}
@GetMapping("/{id}")
public String getBook2(@PathVariable int id) {
System.out.println("查询id为:" + id + "的书籍");
return "success";
}
@PutMapping
public int update(@RequestBody Book book) {
System.out.println("修改:" + book);
return 2;
}
@DeleteMapping("/{bookId}")
public int deleteById(@PathVariable int bookId) {
System.out.println("删除编号为:" + bookId + "的书籍");
return 2;
}
}
七、在对页面进行整合时
因为在DispatcherServlet.java中配置springMVC时配置了:
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
表示将所有操作都交给springmvc管理,所以关于页面的静态文件都会被拦截,因此需要配置一下过滤器: webSpport.java:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebSupport extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
}
}
|