SpringMVC

文章目录

  • Spring MVC学习
    • 简介
      • 概述
      • 特点
      • 中心控制器
    • HelloSpringMVC
    • 使用注解开发
      • Controller
      • RequestMapping
      • RestFul风格
    • SpringMVC中解决乱码问题
    • SpringMVC-json讲解
      • Jackson的使用
      • Fastjson的使用

Spring MVC学习

博主此篇学习笔记是跟随哔哩哔哩UP主:狂神说Java,视频讲解时整理
UP主链接:https://space.bilibili.com/95256449

简介

概述

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

特点

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

中心控制器

Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解的controller声明方式。

HelloSpringMVC

web.xml中配置DispatcherServlet:


<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>

新建springmvc配置文件(配置处理器映射器、处理器适配器、视图解析器以及注册bean)


<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" id="InternalResourceViewResolver">
        
        <property name="prefix" value="/WEB-INF/jsp/"/>
        
        <property name="suffix" value=".jsp"/>
    bean>

    
    <bean id="/hello" class="com.kx.controller.HelloController"/>
beans>

新建Controller类

//注意,这里先导入Controller接口
public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        // ModelAndView 模型和视图
        ModelAndView mv = new ModelAndView();

        // 调用业务层

        //封装对象放在ModelAndView中
        mv.addObject("msg", "HelloSpringMVC!");
        //封装要跳转的视图放在ModelAndView中
        mv.setViewName("hello");    //:  /WEB-INF/jsp/hello.jsp
        return mv;
    }
}

jsp文件

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


    Title


    ${msg}


配置tomcat

运行效果:
SpringMVC_第1张图片
SpringMVC_第2张图片

分析执行流程

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
  2. HandlerMapping为处理器映射。由DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler
  3. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器。
  4. HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
  5. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
  6. Handler让具体的Controller执行。
  7. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
  8. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet
  9. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
  10. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
  11. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
  12. 最终视图呈现给用户。

使用注解开发

注解实现SpringMVC

web.xml中配置DispatcherServlet:


<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>

springmvc-servlet.xml


<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>

创建Controller

  • @Controller 是为了让Spring IOC容器初始化时自动扫描到;
  • @RequestMapping 是为了映射请求路径;
@Controller
//  @RestController   //此注解会返回一个字符串,一般json会用。
public class HelloController {

    @RequestMapping("/hello")
    public String hello(Model model){
        //封装数据
        model.addAttribute("msg","Hello,SpringMVC-Annotation!");
        return "hello";     //会被视图解析器处理
    }
}

/*== 也可以不配置视图解析器,但是要返回全路径,默认请求转发
	return "/WEB-INF/jsp/hello.jsp";
//转发:return "forward:/index.jsp";
//重定向:return "redirect:/index.jsp";
==*/
/*== 配置视图解析器:重定向,不需要视图解析器,本质就是重新请求一个新地方,所以注意路径问题。也可以重定向到另一个请求实现。
转发:return "hello";
重定向:return "redirect:/index.jsp";
//return "redirect:hello.do";	//hello.do为另一个请求/
==*/

hello.jsp

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


    Title


    ${msg}


配置tomcat

运行效果:
SpringMVC_第3张图片

Controller

控制器Controller

  • 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
  • 控制器负责解析用户的请求并将其转换为一个模型。
  • 在Spring MVC中一个控制器类可以包含多个方法。
  • 在Spring MVC中,对于Controller的配置方式有很多种。

类似注解:Spring中注解开发有提到

@Component        组件
@Service          service
@Controller       controller
@Repository       dao
这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配Bean

RequestMapping

RequestMapping

  • @RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作物父路径。
  • 为了测试结论更加准确,可以加上项目名测试

RestFul风格

概念

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

功能

  • 资源:互联网所有的事物都可以被抽象为资源
  • 资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
  • 分别对应 添加、删除、修改、查询。

传统方式操作资源:通过不同的参数来实现不同的效果!方法单一:post和get

  • http://127.0.0.1/item/queryltem.action?id=1 查询,GET
  • http://127.0.0.1/item/saveltem.action 新增,POST
  • http://127.0.0.1/item/updateltem.action 更新,POST
  • http://127.0.0.1/item/deleteltem.action?id=1 删除,GET或POST

使用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

代码:

@Controller
public class RestFulController {

    //映射访问路径
    @RequestMapping("/add/{a}/{b}")
    public String test(@PathVariable int a, @PathVariable int b, Model model){
        int res = a+b;
        model.addAttribute("msg","结果为"+res);

        return "test";
    }
}

运行结果:
SpringMVC_第4张图片

@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)		//指定请求方式
//使用method属性指定请求类型

@PathVariable		//路径变量
//在Spring MVC中可以使用@PathVariable注解,让方法参数的值对应绑定到一个URL模板变量上

组合注解

@GetMapping

@PostMapping

@PutMapping

@DeleteMapping

@PatchMapping

405错误可能是请求方式与后台设置请求方式不符

当有两个相同的url请求且后台设置请求方式相同会报500错误

SpringMVC中解决乱码问题

tomcat修改编码格式

Tomcat文件夹->config->servlet.xml
SpringMVC_第5张图片
在web.xml中配置设置编码格式的过滤器:


<filter>
    <filter-name>encodingfilter-name>
    <filter-class>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>

SpringMVC-json讲解

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

语法格式:

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

JSON键值对是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值:

{"name": "kongxin"}
{"age": "18"}
{"sex": "男"}

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

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

JSON 和 JavaScipt 对象互转

  • 要实现从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"}'
    

Jackson的使用

添加依赖

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>2.11.0.rc1version>
dependency>

在springmvc配置文件springmvc-servlet.xml中加入乱码问题配置


<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>

controller类

@Controller
public class UserController {

    @RequestMapping("/j1")
    @ResponseBody
    //@ResponseBody不会走视图解析器,会直接返回字符串,与 @Controller配合使用;
    // 与@Controller一起与单独@RestController效果相同
    public String test() throws JsonProcessingException {
        //jackson,ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        //创建对象
        User user = new User("空心",18,"男");
        String str = mapper.writeValueAsString(user);
        return str;
    }

    @RequestMapping("j2")
    @ResponseBody
    public String test2() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();

        Date date = new Date();
        //自定义日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm:ss");
        // ObjectMapper,时间解析后的默认格式为:Timestamp,时间戳
        return mapper.writeValueAsString(sdf.format(date));
    }
}

Fastjson的使用

添加依赖

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

乱码配置、环境配置问题相同

Controller类

@RequestMapping("/j3")
@ResponseBody
public String test3() {
    User user = new User("空心",18,"男");

    return JSON.toJSONString(user);
    //Java对象转Json字符串
}

//JSON.parseObject			//Json字符串转Java对象
//JSON.toJSON				//Java对象转Json对象
//JSON.toJavaObject			//Json对象转Java对象

你可能感兴趣的:(框架)