SpringMVC学习笔记

文章目录

      • 一、SpringMVC
        • 1.1 简介
        • 1.2 组件
        • 1.3 Spring运行原理
      • 二、helloSpringMVC
        • 2.1 配置DispatchServlet
        • 2.2 Spring配置文件
        • 2.3 Controller
        • 2.4 注解开发
        • 2.5 Restful
      • 三、结果跳转方式
        • 3.1 ModelAndView
        • 3.2 ServletAPI
        • 5.3 SpringMVC
      • 四、数据处理
        • 4.1 处理提交数据
        • 4.2 数据显示到前端
        • 4.3 乱码过滤器
      • 五、JSON
        • 5.1 JSON简介
        • 5.2 Jackson
        • 5.3 FastJson

一、SpringMVC

1.1 简介

SpringMVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发。

1.2 组件

  • DispatcherServlet:前端控制器, 整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。
  • HandlerMapper:处理器映射器,根据请求的url查找Handler
  • HandlerAdapter:处理器适配器,按照规则执行Handler
  • Handler:处理器, Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
  • ViewResolver:视图解析器, 负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
  • View:视图

1.3 Spring运行原理

SpringMVC学习笔记_第1张图片

  1. 用户发送请求至前端控制器DispatcherServlet。

  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。

  3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

  4. DispatcherServlet调用HandlerAdapter处理器适配器。

  5. HandlerAdapter经过适配调用具体的处理器(Controller)

  6. Controller执行完成返回ModelAndView。

  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

  9. ViewReslover解析后返回具体View。

  10. DispatcherServlet根据View进行渲染视图

  11. DispatcherServlet响应用户。

二、helloSpringMVC

2.1 配置DispatchServlet


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    
    <servlet>
        <servlet-name>springmvcservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>

        
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:springmvc-servlet.xmlparam-value>
        init-param>

        
        <load-on-startup>1load-on-startup>
    servlet>


    
    <servlet-mapping>
        <servlet-name>springmvcservlet-name>
        <url-pattern>/url-pattern>
    servlet-mapping>
web-app>

2.2 Spring配置文件


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd ">

    
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
        <property name="prefix" value="/WEB-INF/jsp/"/>
        
        <property name="suffix" value=".jsp"/>
    bean>
beans>

2.3 Controller

package controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Controller1 implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView modelAndView = new ModelAndView();

        String str = "Helloworld";
        modelAndView.addObject("msg",str);
		
        //视图解析器会处理这个属性
        modelAndView.setViewName("test");

        return modelAndView;
    }
}

test.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


    ${msg}


2.4 注解开发

web.xml中的信息不变

Spring.xml中的处理器映射器和处理器适配器 被注释替代


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
       https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    
    <context:component-scan base-package="controller"/>
    
    <mvc:default-servlet-handler/>
    
    <mvc:annotation-driven/>


    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
        <property name="prefix" value="/WEB-INF/jsp/"/>
        
        <property name="suffix" value=".jsp"/>
    bean>


beans>

Controller类

package controller;


import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;

@Controller
//被这个注解的类中的所有方法,若返回值是String,并且有具体的页面可转,那么就会被视图解析器解析
//@RequestMapping("/q")
//相当于在方法的mapper前加了一层:项目地址/q/h1
public class HelloController {

    //访问地址:项目地址/h1
    @RequestMapping("/h1")
    public String hello(Model model){
        model.addAttribute("msg","HelloSPringMVC");
        return "hello";//会被视图解析器处理
    }
}

2.5 Restful

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class Controller2 {

    //原来 :http://localhost:8080/add?a=1&b=2
    //现在 :http://localhost:8080/add/1/2

    @RequestMapping(value = "/test/{a}/{b}",method = RequestMethod.GET)
    public String test(@PathVariable int a,@PathVariable int b,Model model){

        int res = a + b;
        String msg = a + " + " + b + " = " + res;
        model.addAttribute("msg",msg);
        return "hello";
    }
}
  • 使用method属性指定请求类型 用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
  • 所有的地址栏请求默认都会是 HTTP GET 类型的。
  • @GetMapping 是一个组合注解 它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式
  • 方法级别的注解:@GetMapping @PostMapping @PutMapping @DeleteMapping @PatchMapping

三、结果跳转方式

3.1 ModelAndView

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

页面 : {视图解析器前缀} + viewName +{视图解析器后缀}


    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
        <property name="prefix" value="/WEB-INF/jsp/"/>
        
        <property name="suffix" value=".jsp"/>
    bean>

Controller类

public class Controller1 implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView modelAndView = new ModelAndView();

        String str = "Helloworld";
        modelAndView.addObject("msg",str);

        modelAndView.setViewName("test");

        return modelAndView;
    }
}

3.2 ServletAPI

通过ServletAPI,不需要视图解析器

  • 通过HttpServletResponse进行输出
  • 通过HttpServletResponse实现重定向
  • 通过HttpServletResponse实现转发
@Controller
public class ResultGo {
    @RequestMapping("/result/t1")
    public void test1(HttpServletRequest req, HttpServletResponse rsp)
            throws IOException {
        rsp.getWriter().println("Hello,Spring BY servlet API");
    }
    public void test2(HttpServletRequest req, HttpServletResponse rsp)
            throws IOException {
        rsp.sendRedirect("/index.jsp");
    }
    public void test3(HttpServletRequest req, HttpServletResponse rsp)
            throws Exception {
        //转发
        req.setAttribute("msg","/result/t3");
        req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);
    }
}

5.3 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为另一个请求/
	}
}

四、数据处理

4.1 处理提交数据

  1. 提交的域名城和处理方法的参数名一致

    url:http://localhost:8080/hello?name=xiaoming

    @RequestMapping("/hello")
    public String hello(String name){
    	System.out.println(name);
    	return "hello";
    }
    
  2. 提交的域名城和处理方法的参数名不一致

    url:http://localhost:8080/hello?username=xiaoming

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

    要求提交的表单域和对象的属性名一致 , 参数使用对象即可

    实体类

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

    url: http://localhost:8080/mvc04/user?name=xiaoming&id=1&age=15

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

    如果使用对象,前端传递的参数名和对象属性名必须一致,不然就是null

4.2 数据显示到前端

  1. 通过modelAndView

  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. 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";
    }
    

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

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

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

4.3 乱码过滤器

SpringMVC提供的过滤器可解决大部分乱码问题

<filter>
    <filter-name>encodingfilter-name>
    <filterclass>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    <init-param>
        <param-name>encodingparam-name>
        <param-value>utf-8param-value>
	init-param>
filter>
<filter-mapping>
    <filter-name>encodingfilter-name>
    <url-pattern>/*url-pattern>
filter-mapping>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NyQ6jU21-1596356628695)(C:%5CUsers%5CWIN10%5CDesktop%5CSpringMVC.assets%5C1596209694785.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nzcM98Nc-1596356628696)(C:%5CUsers%5CWIN10%5CDesktop%5CSpringMVC.assets%5C1596210335616.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Av7asbF5-1596356628698)(C:%5CUsers%5CWIN10%5CDesktop%5CSpringMVC.assets%5C1596210366735.png)]

五、JSON

5.1 JSON简介

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。

在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示。

JSON的语法格式:

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

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title>
head>
<body>
    <script type="text/javascript">
        //编写一个js的对象
        var user = {
        name:"小明",
        age:3,
        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>
body>
html>

5.2 Jackson

  1. 导入依赖

    
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-databindartifactId>
        <version>2.11.0version>
    dependency>
    
  2. Controller类

    @Controller
    public class UserController {
        //produces:指定响应体返回类型和编码
        @RequestMapping(value = "/json1",produces ="application/json;charset=utf-8")	
        @ResponseBody
        public String json1() throws JsonProcessingException {
            //创建一个jackson的对象映射器,用来解析数据
            ObjectMapper mapper = new ObjectMapper();
            //创建一个对象
            User user = new User("秦疆1号", 3, "男");
            //将我们的对象解析成为json格式
            String str = mapper.writeValueAsString(user);
            //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
            return str;
        }
    }
    
    @RequestMapping(value = "/json1",produces ="application/json;charset=utf-8")
    解决乱码问题
    
  3. 代码优化

    乱码统一解决

    当存在多个请求时,一一配置会很麻烦,可以通过一下配置解决

    <!--乱码问题-->
        <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>	
    

    返回json字符串同意解决

    前面使用@ResponseBody注解,将str转成json格式返回

    在类上添加@RestController注解,这样里面的所有方法都会返回json字符串

    @RestControlle
    @Controller
    public class UserController {
        @RequestMapping(value = "/json1")	
        public String json1() throws JsonProcessingException {
            //创建一个jackson的对象映射器,用来解析数据
            ObjectMapper mapper = new ObjectMapper();
            //创建一个对象
            User user = new User("秦疆1号", 3, "男");
            //将我们的对象解析成为json格式
            String str = mapper.writeValueAsString(user);
            //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
            return str;
        }
    }
    

    5.3 FastJson

    依赖

    
    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>fastjsonartifactId>
        <version>1.2.73version>
    dependency>
    

    fastjson主要的三个类:

    • JSONObject:JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用 诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map 接口并调用接口中的方法完成的。
    • JSONArray:代表json对象数组
    • JSON代替JSONObject和JSONArray的转化:主要是实现json对象,json对象数组,javabean对象,json字符串之间 的相互转化
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.kuang.pojo.User;
    import java.util.ArrayList;
    import java.util.List;
    
    public class FastJsonDemo {
        public static void main(String[] args) {
    	//创建一个对象
            User user1 = new User("秦疆1号", 3, "男");
            User user2 = new User("秦疆2号", 3, "男");
            User user3 = new User("秦疆3号", 3, "男");
            User user4 = new User("秦疆4号", 3, "男");
            List<User> list = new ArrayList<User>();
            list.add(user1);
            list.add(user2);
            list.add(user3);
            list.add(user4);
            System.out.println("*******Java对象 转 JSON字符串*******");
            String str1 = JSON.toJSONString(list);
            System.out.println("JSON.toJSONString(list)==>"+str1);
            String str2 = JSON.toJSONString(user1);
            System.out.println("JSON.toJSONString(user1)==>"+str2);
            System.out.println("\n****** JSON字符串 转 Java对象*******");
            User jp_user1=JSON.parseObject(str2,User.class);
            System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
            System.out.println("\n****** Java对象 转 JSON对象 ******");
            JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
            System.out.println("(JSONObject)
                    JSON.toJSON(user2)==>"+jsonObject1.getString("name"));
            System.out.println("\n****** JSON对象 转 Java对象 ******");
            User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
            System.out.println("JSON.toJavaObject(jsonObject1,
                    User.class)==>"+to_java_user);
        }
    }
    

");
User jp_user1=JSON.parseObject(str2,User.class);
System.out.println("JSON.parseObject(str2,User.class)>"+jp_user1);
System.out.println("\n
*** Java对象 转 JSON对象 ******");
JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);
System.out.println("(JSONObject)
JSON.toJSON(user2)>"+jsonObject1.getString(“name”));
System.out.println("\n****** JSON对象 转 Java对象 ******");
User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
System.out.println(“JSON.toJavaObject(jsonObject1,
User.class)==>”+to_java_user);
}
}






你可能感兴趣的:(SpringMVC)