SpringMVC

回顾MVC

回想一下什么是MVC?曾今在web阶段,我们第一次接触到了MVC。

MVC:模型(dao、service)、视图(jsp)、控制器(servlet)

MVC是一种架构模式,是一种规范,它将代码的工作职责划分的很清晰。

回顾Servlet

我们先写一个基础的web时代的小程序来唤醒久远的记忆。

首先导入一会要用的一些依赖

1.Spring-MVC常用依赖

<!--导入的依赖-->
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2.1-b03</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp.jstl</groupId>
        <artifactId>jstl-api</artifactId>
        <version>1.2-rev-1</version>
    </dependency>
</dependencies>

然后我们需要构建web框架支持,在项目右键添加架构支持就好了

想想下一步,我们需要写一个继承了HttpServlet的java类,来作为我们的servlet

2.Servlet

只要实现了Servlet接口的类,就是一个Servlet

public class Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取前端封装的数据
        String method = req.getParameter("method");
        if (method.equals("add")){
            req.getSession().setAttribute("msg","执行了add方法");
        }else if (method.equals("delete")){
            req.getSession().setAttribute("msg","执行了delete方法");
        }

        //2.调用业务层
        //3.视图转发或者重定向
        req.getRequestDispatcher("/hello.jsp").forward(req,resp);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

在这个Servlet中,我们之前需要做三个步骤:

  1. 获取前端数据,并做不同的处理
  2. 调用业务层
  3. 视图转发或者重定向

由于这个小程序里我们没写业务层,所以我们只实现1和3就好了。

我们需要从前端获得名字位“method”的参数,并将其封装为字符串,对字符串进行比较后,做不同的处理判断,比如向seession内放入名为msg的参数

现在我们已将做完处理,现在只需要做转发或者重定向就好了。

3.重定向与转发

先让我们回忆一下什么是转发什么是重定向

  • 转发(forward):转发是服务器行为,客户是感受不到服务器做了转发的,同时转发能够携带一次数据(req,resp),转发的请求只有一次,而且他的地址栏也不会改变
  • 重定向(sendRedirect):相比起来重定向有点捞,重定向是客户端行为,所以相当于进行了两次请求,地址栏也会改变,而且由于是浏览器重新发出了请求,就没有什么request传递的概念了。

两者的区别:

  1. 是服务器行为还是客户端行为
  2. 用户能否感受到
  3. 能否携带数据
  4. 请求次数
  5. 地址栏是否会改变

转发是服务器行为,重定向是客户端行为

4.配置Servlet

接下来我们就可以去写xml文件配置servlet了

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.zhaox.servlet.Servlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

另外我们也可以在这里设置session超时和欢迎页之类的。

5.写JSP

index.jsp

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

  <form action="/hello" method="get">
    <input type="text" name="method">
    <input type="submit" name="提交">
  </form>
  </body>
</html>

hello.jsp

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

这里复习一下jsp的知识,首先进入index.jsp页面,随后利用form表单提交到/hello(xml里注册的servlet),设置提交方式为get。

内部设置一个text和一个提交按钮,将text的名字设置为method

这样后台servlet就可以提取名为method的参数,并且根据参数进行不同操作

接下来是跳转的hello.jsp

这里用一下EL表达式,取得后端获得的msg参数

HelloSpringMVC

首先,我们要先知道为什么要学SpringMVC呢

SpringMVC的特点:

  1. 轻量级,简单
  2. 不需要太多依赖
  3. 高效,基于请求和响应的MVC框架
  4. 与Spring无缝结合
  5. 约定大于配置
  6. 功能强大:RESTful,数据验证,格式化,本地化,主题等

当然最重要的还是用的人多哈哈哈哈哈哈

Spring的web框架围绕DispatcherServlet来实现,DispatcherServlet的作用就是将请求分发到不同的处理器(Servlet)。

想想以前我们写的servlet开发的时候,我们要经过servlet,service,dao最终到达数据库来完成一个事件。


但是如果我们需要的交互操作比较多,可能就需要创建成批的Servlet,用户也需要去调用许多不同的Servlet,看起来复杂又麻烦。

在架构里没有什么是加一层不能解决的

我们可以增加一个DispatcherServlet来解决这些问题


现在我们来快速搭建一个SpringMVC框架

当然,配置地狱嘛,你懂的

来人,上配置!

  • web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <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">
      <!--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>
    </web-app>
    
  • springmvc-servlet.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <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"/>
      <!--视图解析器: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.zhaox.controller.HelloController"/>
    </beans>
    

接下来我们来写对应的控制层

//注意:这里我们先导入Controller接口
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;
    }
}

然后是视图层!

  • hello.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
      <title>zhaox</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
    
  • index.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
      <title>Title</title>
    </head>
    <body>
    welcome
    <form action="/hello" method="get">
      <input type="text" name="method">
      <input type="submit" name="提交">
    </form>
    </body>
    </html>
    

醉后不知天在水,满船清梦压星河