了解掌握Servlet之后,我们会发现Servlet开发在接受请求数据参数,数据共享,页面跳转等操作相对比较复杂。SpringMvc框架则是对Servlet的操作进行了整合封装处理。

  • SpringMVC底层就是的Servlet,SpringMVC就是对Servlet进行更深层次的封装

Springmvc模式

什么是mvc?
  mvc分别指的是模型model(javabean), 视图view(jsp/img) ,控制器Controller(Action/servlet) 控制器就是为了保证M和V的一致性,当模型发生改变时,控制器可以把模型中的新内容更新到视图上,这样就达到了页面代码和后台代码的分离的效果。
什么是SpringMvc?
  SpringMVC是Spring框架内置的MVC的实现。SpringMVC就是一个Spring内置的MVC框架,它解决WEB开发中常见的问题(参数接收、文件上传、表单验证、国际化、等等),而且使用简单,与Spring无缝集成。 支持 RESTful风格的 URL 请求 。
  用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。

SpringMvc案例

1.创建maven项目,导入jar包

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

2.编写Controller控制器(类似编写Servlet类)

  • 实现Controller接口,与Servlet类作用类似(封装,处理数据)。
public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //ModelAndView 模型和视图
        ModelAndView mv = new ModelAndView();

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

3.注册DispacherServlet

  与注册Servlet相似,只不过我们用Controller代替Servlet之后,需要注册DispacherServlet来对Controller进行处理映射。所以DispacherServlet也是SpringMvc框架的核心。

<!--1.注册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>

4.配置SpringMvc.xml文件

  在注册DispacherServlet时,关联了一个SpringMvc.xml文件,表示通过Spring容器来获得相关的Controller类,处理器,适配器,以及视图解析器。

spring的mvc容器和servlet容器_java

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--视图解析器: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>
    <!--Handler-->
    <bean id="/hello" class="com.jack.controller.HelloController"/>

5.准备一个jsp页面获取Controller类封装的数据

在web目录下创建jsp包,新建.jsp文件在jsp包下

spring的mvc容器和servlet容器_spring_02


hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    ${msg}
</body>
</html>

6.配置Tomcat

spring的mvc容器和servlet容器_java_03


选择需要运行的项目

spring的mvc容器和servlet容器_User_04


添加成功后开始运行服务器测试SpringMvc

  • 在url路径输入命令/hello,成功获取到controller类里的信息“HelloSpringMVC!”

SpringMvc基于注解配置

  • 开发时往往使用的是注解方式配置,以此来提高开发效率。

1.注解Controller类

  • 此时在controller类里,使用的不是ModelAndView对数据进行封装,采用的是Model类进行封装处理。

2.配置注解xml文件

spring的mvc容器和servlet容器_spring_05


wen.xml文件配置,jsp页面都不需要改变

3.配置Tomcat,测试SpringMvc注解。

  • 添加运行的项目
  • spring的mvc容器和servlet容器_spring_06

  • 输入注解RequestMapping添加的路径值,显示封装好的数据。

spring的mvc容器和servlet容器_java_07

SpringMvc表单提交数据跳转页面

1.创建一个表单页面

  • “/e/t1”表示的是跳转页面命令路径值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="/e/t1" method="post">
    <input type="test" name="name">
    <input type="submit">
</form>
</body>
</html>

注意:from.jsp放在子包下,从默认页面跳转表单页面,视图解释器解析不了,所以from.jsp应该与默认页面一样,直接放在web包下。

2.编写提交页面Controller类

public class EncodingController {
    @PostMapping("e/t1")
    public String test(String name, Model model){
        model.addAttribute("msg",name);
        return "test";
    }
}
  • 表单页面的name提交后,赋值给Controller类的name在test页面显示。
    3.配置Tomcat,测试。
  • 输入from.jsp路径访问表单页面
  • 输入字符,成功跳转页面显示

3.解决乱码问题

  • 当我们在表单输入时,跳转页面会出现乱码问题。
  • 此时我们需要在web.xml文件中配置一个SpringMvc过滤器。
<!--配置SpringMvc过滤器,解决乱码问题-->
    <filter>
        <filter-name>encodingFilter</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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

SpringMvc的过滤器可以解决大多数的乱码问题。

通过路径赋值显示

  • 创建一个Controller类
  • 通过路径赋值

    RestFul风格路径赋值
      RestFul风格的作用主要是简化一般路径赋值的格式,便于使用,并且可以让前端无法知道赋值的变量名,较为安全。
  • 创建一个Controller类:
  • 测试RestFul风格
      成功完全赋值,并且返回正确值显示。

Json

1.什么是Json?

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

2.Jackson的使用

  简单的理解Jackson使用就是将Json字符串在前端页面进行展示。

  • Maven项目导入Jackson包
<dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.10.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
    </dependencies>

lombok包是为了后面便于User类设置属性。

  • 创建需要显示信息字符串的用户类
    利用lombok注解User类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private String sex;
}
  • 创建Controller类
@RequestMapping("/j1")
//    @ResponseBody注解之后对的方法前端不会返回视图,而是字符串。
    public String json1() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("杰克1", 3, "男");
        String str = mapper.writeValueAsString(user);
        return str;
    }
  • 配置Tomcat,测试jackson
    成功显示用户信息

3.fastjson的使用

  • 导入fastjson包
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
  • 创建Controller类
@RequestMapping("/j4")
    public String json4(){
        List<User> user = new ArrayList<User>();
        User user1 = new User("杰克1",3,"男");
        User user2 = new User("杰克2",3,"男");
        User user3 = new User("杰克3",3,"男");
        User user4 = new User("杰克4",3,"男");
        user.add(user1);
        user.add(user2);
        user.add(user3);
        user.add(user4);
        String str = JSON.toJSONString(user);
        return str;
    }
  • 测试fastjson

总结

  SpringMvc项目在idea中配置好Tomcat后,在代码没有任何错误时也有可能会出现报错,需要在Project Structrue中Artifacts的指定项目下的WEB-INF添加一个lib目录,把maven项目所有的jar包添加到lib目录下。因为服务器在加载web项目时,web项目下并没有jar包。

spring的mvc容器和servlet容器_User_08