小学生都能学会的springmvc入门基础

Posted 结构化思维wz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小学生都能学会的springmvc入门基础相关的知识,希望对你有一定的参考价值。

小学生都能学会的springmvc!

一、什么是springmvc??

MVC模型大家都知道吧? 模型(Model),视图(View),控制器(Controller)的简写,是一种软件设计规范。

  • **Model(模型):**数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
  • **View(视图):**负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
  • **Controller(控制器):**接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。

1.springmvc概述

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。

Spring MVC的特点:

  1. 轻量级,简单易学
  2. 高效 , 基于请求响应的MVC框架
  3. 与Spring兼容性好,无缝结合
  4. 约定优于配置
  5. 功能强大:RESTful、数据验证、格式化、本地化、主题等
  6. 简洁灵活

2.springmvc的执行原理

在这里插入图片描述

二、springmvc的第一个程序

了解了springmvc的执行原理后,我们来看看如何用springmvc快速开发我们的程序,以及相关的配置。

1.配置版(古老方案,了解原理)

  1. 创建web项目,导入springmvc相关依赖

  2. 看执行原理首先我们需要一个中央控制器,这是一个servelet,所以我们需要在web.xml文件中注册DispatcherServlet;

    <servlet>
           <servlet-name>springmvc</servlet-name>
           <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
           <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
           <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>classpath:springmvc-servlet.xml</param-value>
           </init-param>
           <!--启动级别-1-->
           <load-on-startup>1</load-on-startup>
       </servlet>
    
     <!--/ 匹配所有的请求;(不包括.jsp)-->
       <!--/* 匹配所有的请求;(包括.jsp)-->
       <servlet-mapping>
           <servlet-name>springmvc</servlet-name>
           <url-pattern>/</url-pattern>
       </servlet-mapping>
    
  3. 然后我们发现有处理器映射器处理器适配器,这两个在springmvc配置文件中配置。

    添加 处理映射器
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    添加 处理器映射器和适配器
    
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
  4. 下一步就是 视图解析器,例如我们jsp,thymeleaf等视图层需要被此解析。

    <!--视图解析器:DispatcherServlet给他的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
       <!--前缀-->
       <property name="prefix" value="/WEB-INF/jsp/"/>
       <!--后缀-->
       <property name="suffix" value=".jsp"/>
    </bean>
    
  5. 编写Controller(接口版)

    public class HelloController implements Controller {
        @RequestMapping("hello") //通过/hello的请求会被此controller处理,这个需要配置注解驱动
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
           //创建对象
            ModelAndView mv =new ModelAndView();
            //addObject方法,把对象封装进去
           mv.addObject("msg","hello");
           //setViewName,指定要跳转的视图名称
           mv.setViewName("index");
            return mv;
        }
    }
    
  6. 编写视图层(此处用jsp做例子)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
       <title>Kuangshen</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
    
  7. 测试,localhost:8080/hello ,页面显示hello

2.注解版(常用)

基本跟上面配置相同

  • web.xml 中基本需要配置的有:

    1.注册中央处理器
    2.关联springmvc配置文件
    3.启动界别
    4.映射路径
    5.过滤器(避免乱码) 
    <filter>
       <filter-name>encoding</filter-name>
       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
       <init-param>
           <param-name>encoding</param-name>
           <param-value>utf-8</param-value>
       </init-param>
    </filter>
    <filter-mapping>
       <filter-name>encoding</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  • springmvc.xml 中基本需要配置的有:

    1.包扫描(扫描注解用)
    2.<mvc:annotation-driven /> 处理器映射器适配器最优解(注解驱动)
    3.视图解析器
    4.过滤静态资源
    5.拦截器
    6....
    
    
  • Controller的不同点(采用@controller注解)

    @Controller  相当于在配置文件中注册了bean
    public class HelloController  {
        @RequestMapping("hello") 
        //方法中声明Model类型的参数是为了把Action中的数据带到视图中;
        public String hello(Model model){
            //向模型中添加属性msg 与 值,可以在jsp中取出并渲染
            model.addAttribute("msg","hello");
            return "index"; //return一个视图名,交给视图解析器
        }
       
    }
    

3.总结

这仅仅是springmvc基本的一个程序需要,下面会有更多相关内容,不过springmvc的流程大致应该可以理解了吧。数据处理交互,后来会有详细介绍。

@Controller注解类型用于声明Spring类的实例是一个控制器

@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。


三、RestFul 风格

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

资源:互联网所有的事物都可以被抽象为资源

资源操作:使用POST(增)、DELETE(删)、PUT(改)、GET(查),使用不同方法对资源进行操作。

1.传统方式操作资源:

​ 通过不同参数实现不同效果,方法单一

http://127.0.0.1/item/queryItem.action?id=1 查询,GET

​	http://127.0.0.1/item/saveItem.action 新增,POST

​	http://127.0.0.1/item/updateItem.action 更新,POST

​	http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST

2.RestFul风格操作资源:

可以根据不同方法来实现不同效果,例如一样的请求地址可以实现功能不一样

	http://127.0.0.1/item/1 查询,GET

	http://127.0.0.1/item 新增,POST

	http://127.0.0.1/item 更新,PUT

	http://127.0.0.1/item/1 删除,DELETE

3.@PathVariable

这个注解的作用是,让方法的值对应绑定到一个url变量上。

例如我们在url上传两个数字,并相加;

@Controller
public class RestFulController {

   //映射访问路径
   @RequestMapping("/rest/{p1}/{p2}")
   public String index(@PathVariable int p1, @PathVariable int p2, Model model){
       
       int result = p1+p2;
       //Spring MVC会自动实例化一个Model对象用于向视图中传值
       model.addAttribute("msg", "结果:"+result);
       //返回视图位置
       return "test";
       
  }
   
}

我们访问的url : locahost:8080/rest/1/2

界面显示: 结果:3


那么我们使用@PathVariable的好处是什么??

  • 使路径变得更加简洁;
  • 获得参数更加方便,框架会自动进行类型转换。
  • 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/rest/1/a,则路径与方法不匹配,而不会是参数转换失败。

4.method属性

用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等

例如下面个注解的功能相同

@RequestMapping(value = "/hello",method = {RequestMethod.GET})

@GetMapping("hello")

通过不同的方法,是resful风格能实现相同请求地址,实现功能不一样的原因。


四、数据处理及跳转

springmvc参数接受处理?结果跳转处理?

1.结果跳转的方式

1.1 ModelAndView

设置ModelAndView对象,根据view的名称,和视图解析器跳转到指定页面

1.2 springmvc 实现

没有视图解析器:
    
@Controller
public class ResultSpringMVC {
   @RequestMapping("/rsm/t1")
   public String test1(){
       //转发
       return "/index.jsp";
  }

   @RequestMapping("/rsm/t2")
   public String test2(){
       //转发二
       return "forward:/index.jsp";
  }

   @RequestMapping("/rsm/t3")
   public String test3(){
       //重定向
       return "redirect:/index.jsp";
  }

有视图解析器:
重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方, 所以注意路径问题.
@Controller
public class ResultSpringMVC2 {
   @RequestMapping("/rsm2/t1")
   public String test1(){
       //转发
       return "test";
  }

   @RequestMapping("/rsm2/t2")
   public String test2(){
       //重定向
       return "redirect:/index.jsp";
       //return "redirect:hello.do"; //hello.do为另一个请求/
  }

2.数据处理

2.1 提交的域名称和处理方法的参数名一致

http://localhost:8080/hello?name=zhangsan

@RequestMapping("/hello")
public String hello(String name){
   System.out.println(name);
   return "hello";
}

输出结果:zhangsan

2.2 提交域名称与处理方法参数名不一致(@RequestParam)

 http://localhost:8080/hello?username=lisi

//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
   System.out.println(name);
   return "hello";
}

输出结果:lisi

2.3 提交的是一个对象

http://localhost:8080/mvc04/user?name=liuyifei&id=1&age=25

//User实体类
public class User {
   private int id;
   private String name;
   private int age;
   //构造
   //get/set
   //tostring()
}

//处理方法
@RequestMapping("/user")
public String user(User user){
   System.out.println(user);
   return "hello";
}

后台输出:User { id=1, name=‘liuyifei’, age=25 }

注意:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

3.数据显示到前端

3.1 通过ModelAndView

public class ControllerTest1 implements Controller {

   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       //返回一个模型视图对象
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","ControllerTest1");
       mv.setViewName("test");
       return mv;
  }
}

3.2 通过ModelMap

@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){
   //封装要显示到视图中的数据
   //相当于req.setAttribute("name",name);
   model.addAttribute("name",name);
   System.out.println(name);
   return "hello";
}

3.3 通过Model

@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
   //封装要显示到视图中的数据
   //相当于req.setAttribute("name",name);
   model.addAttribute("msg",name);
   System.out.println(name);
   return "test";
}

3.4 对比

就对于新手而言简单来说使用区别就是:

Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;

ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

五、JSON交互

什么是JSON?

  • JSON(javascript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
  • 采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:

  • 对象表示为键值对,数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

例如:

{"name": "小梦"}
{"age": "18"}
{"sex": "男"}

JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串

1.JSON与JS 对象互转

要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a": "Hello", "b": "World"}');
//结果是 {a: 'Hello', b: 'World'}

要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({a: 'Hello', b: 'World'});
//结果是 '{"a": "Hello", "b": "World"}'

测试:

<script type="text/javascript">
   //编写一个js的对象
   var user = {
       name:"王泽",
       age:20,
       sex:"男"
  };
   //将js对象转换成json字符串
   var str = JSON.stringify(user);
   console.log(str);
   
   //将json字符串转换为js对象
   var user2 = JSON.parse(str);
   console.log(user2.age,user2.name,user2.sex);

</script>

控制台结果:
{"name":"王泽","age":20,"sex":"男"}
20 "王泽" "男"

2.Controller与Json(本案例仅介绍jackson)

  1. 添加依赖

    <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
       <version>2.9.8</version>
    </dependency>
    
  2. 编写实体类

    @Data//需要lombok
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
    
       private String name;
       private int age;
       private String sex;
       
    }
    
  3. 编写controller

    @Controller
    public class UserController {
    
       @RequestMapping("/json1",produces = "application/json;charset=utf-8")
       @ResponseBody //有这个注解就不走视图解析器了
       public String json1() throws JsonProcessingException {
           //创建一个jackson的对象映射器,用来解析数据
           ObjectMapper mapper = new ObjectMapper();
           //创建一个对象
           User user = new User("王泽", 3, "男");
           //将我们的对象解析成为json格式
           String str = mapper.writeValueAsString(user);
           //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
           return str;
      }
    
    }
    

    结果:

    {"name":"王泽""age":3,"sex":"男"}
    

JSON乱码统一解决

@RestController = @Controller+@ResponseBody

可以通过Spring配置统一指定,这样就不用每次都去处理了!我们可以在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置!

<mvc:annotation-driven>
   <mvc:message-converters register-defaults="true">
       <bean class="org.springframework.http.converter.StringHttpMessageConverter">
           <constructor-arg value="UTF-8"/>
       </bean>
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
           <property name="objectMapper">
               <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                   <property name="failOnEmptyBeans" value="false"/>
               </bean>
           </property>
       </bean>
   </mvc:message-converters>
</mvc:annotation-driven>

3.输出集合与对象

输出集合

@RequestMapping("/json2")
public String json2() throws JsonProcessingException {

   //创建一个jackson的对象映射器,用来解析数据
   ObjectMapper mapper = new ObjectMapper();
   //创建一个对象
   User user1 = new User("张三", 3, "男");
   User user2 = new User("李四", 3, "男");
   User user3 = new User("王五", 3, "男");
   User user4 = new User("萨斯给", 3, "男");
   List<User> list = new ArrayList<User>();
   list.add(user1);
   list.add(user2);
   list.add(user3);
   list.add(user4);

   //将我们的对象解析成为json格式
   String str = mapper.writeValueAsString(list);
   return str;
}

输出对象

@RequestMapping("/json3")
public String json3() throws JsonProcessingException {

   ObjectMapper mapper = new ObjectMapper()小白都能看懂的SQL零基础入门,一文带你轻松学会增删改查!

如何入门 Python 爬虫?人人都能学会

小学生都能学会的python(函数)

小学生都能学会的python(文件操作)

小学生都能学会的python(深浅拷贝)

小学生都能学会的python(小数据池)