SpringMVC基础笔记(注解篇)
前言
-
MVC解释如下:
-
M是指业务模型(Model):通俗的讲就是我们之前用于封装数据传递的实体类。
V是指用户界面(View):一般指的是前端页面。
C则是控制器(Controller):控制器就相当于Servlet的基本功能,处理请求,返回响应
但是说实话,真正做项目的时候,就会因为需要编写的代码以及逻辑太多而崩溃,因为需要环环相扣,所以难免会出现顾此失彼的情况
为了简化我们的项目开发,我们采用SpringMVC编写代码
缺点:此处仅采用thymeleaf才发,但是它仅支持html静态页面,导致我放弃了SpringMVC,准备去看看SpringBoot是如何开发的。
一:核心配置
导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.13</version>
</dependency>
这里是用到了thymeleaf引擎,所以加上一个依赖
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
在这里我们需要写三个配置文件,两个主配置文件
MainConfig
import org.springframework.context.annotation.Configuration;
//主配置文件
@Configuration
public class MainConfig {
}
WebConfig
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
//扫描controller
@ComponentScan("com.text")
//主配置文件
@Configuration
//引入其他静态资源
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
// 这三个方法是模板,直接复制就能用
//我们需要使用ThymeleafViewResolver作为视图解析器,并解析我们的HTML页面
@Bean
public ThymeleafViewResolver thymeleafViewResolver(@Autowired SpringTemplateEngine springTemplateEngine){
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setOrder(1); //可以存在多个视图解析器,并且可以为他们设定解析顺序
resolver.setCharacterEncoding("UTF-8"); //编码格式是重中之重
resolver.setTemplateEngine(springTemplateEngine); //和之前JavaWeb阶段一样,需要使用模板引擎进行解析,所以这里也需要设定一下模板引擎
return resolver;
}
//配置模板解析器
@Bean
public SpringResourceTemplateResolver templateResolver(){
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setSuffix(".html"); //需要解析的后缀名称
resolver.setPrefix("/WEB-INF/"); //需要解析的HTML页面文件存放的位置
return resolver;
}
//配置模板引擎Bean
@Bean
public SpringTemplateEngine springTemplateEngine(@Autowired ITemplateResolver resolver){
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(resolver); //模板解析器,默认即可
return engine;
}
// 加载静态资源
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); //开启默认的Servlet
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/");
//配置静态资源的访问路径
}
}
初始化配置类
InitConfig
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
//这就是一个模板,直接拿来用就行,完全不用记下来,
//而且我们继承AbstractAnnotationConfigDispatcherServletInitializer之后
//直接重写代码,写好两个配置文件就行
public class InitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{MainConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
Controller控制器
注入依赖
- 控制器MainController
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
//控制类
@Controller
public class MainControl {
/* 跳转逻辑,
RequestMapping
属性:
1.value:跳转目录
2.params:跳转携带属性
3.未完待续
作用
1.功能类似WebServlet,作为资源跳转目录
2.重定向,返回语句前面加上 redirect:
3.请求转发:返回语句前加上 forward:
*/
@RequestMapping(value = "/text",params = {"username"})
public ModelAndView index() {
return new ModelAndView("and");
}
@RequestMapping("/text2")
public ModelAndView index2() {
return new ModelAndView("band");
}
}
二:获取请求参数方式
- 方式一
// 方法一
@RequestMapping("/text")
public String text(@RequestParam(value = "and",required = false,defaultValue = "魏振华") String and){
System.out.println(and);
return "text";
}
- 方式二
@RequestMapping("/text")
public String text(HttpServletRequest httpServletRequest){
System.out.println(httpServletRequest.getParameterMap().keySet());
return "text";
}
- 方式三
// 封装成实体对象
@RequestMapping("/text")
public String text(User user){
System.out.println(user.toString());
return "text";
}
三:快速获取cookie和session信息
- 获取cookie信息
// 封装成实体对象
@RequestMapping("/text")
public String text(User user){
System.out.println(user.toString());
return "text";
}
- 获取session信息
@RequestMapping("/text")
public String text(HttpSession httpSession,
@SessionAttribute(value = "text",required = false)String text){
System.out.println("获取到的session信息:"+text);
httpSession.setAttribute("text","123456");
return "text";
}
四:重定向和请求转发‘
- 重定向
@RequestMapping("/text")
public String text(){
return "redirect:home";
}
@RequestMapping("home")
public String home(){
return "home";
}
- 请求转发
@RequestMapping("/text")
public String text(){
return "forward:home";
}
@RequestMapping("home")
public String home(){
return "home";
}
五:restful风格
- 基本格式
@RequestMapping("/test/{str}")
public String text(@PathVariable("str") String test){
System.out.println("接收到的请求路径参数是" + test);
return "text";
}
- 四种获取数据的方式
@RequestMapping(value = "/test", method = RequestMethod.POST)
public String post(String test) {
System.out.println("添加的数据" + test);
return "text";
}
@RequestMapping(value = "/test/{str}", method = RequestMethod.GET)
public String get(@PathVariable("str") String test) {
System.out.println("查找的数据" + test);
return "text";
}
@RequestMapping(value = "/test", method = RequestMethod.PUT)
public String put(String test) {
System.out.println("修改的数据" + test);
return "text";
}
@RequestMapping(value = "/test/{str}", method = RequestMethod.DELETE)
public String delete(@PathVariable("str") String test) {
System.out.println("删除的数据" + test);
return "text";
}
六:Json数据格式
- 基本格式
// json数据格式
JSONObject jsonObject = new JSONObject();
jsonObject.put("name","wei");
jsonObject.put("age",18);
// json数组
JSONArray jsonArray = new JSONArray();
System.out.println(jsonArray.put(new JSONObject().put("name", "weizhenhua").put("age", 3)));
System.out.println(jsonArray.put(jsonObject));
-将实体类转换成Json数据格式
User user = new User();
user.setUsername("wei");
user.setPassword("123");
System.out.println(JSON.toJSON(user));
- 发送Json数据格式数据
@RequestMapping(value = "/text",produces = "application/json")
@ResponseBody
public User text(){
User user = new User();
user.setUsername("wei");
user.setPassword("123");
return user;
}