Spring MVC使用入門級SSM框架整合

前言&準備

SpringMVC是一套輕量級web開發(fā)框架,可以容易的和Spring整合,簡單易用,其底層依然基于Servlet。使用SpringMVC之前,首先需要引入相關的Jar包,這里使用Maven包管理工具實現。

  • 需要的Jar
<dependencies>
        <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>
  • 引入之后為項目添加框架支持


    添加框架支持
  • 配置本地tomcat

    配置本地tomcat

  • 將項目中用到的依賴添加到WEB-INF/lib下


    image.png

使用SpringMVC

在真正使用SpringMVC框架開發(fā)之前,先回憶一下,在JavaWeb中,我們利用Servlet進行開發(fā),只要編寫好一個實現Servlet接口的類,實現對應的方法,然后在web.xml配置好<servlet><servlet-mapping>后, 訪問特定路經,請求就會自動跳轉到其對應的Servlet進行處理,這樣其實也不算復雜,但是隨著需求的增加,就需要配置大量的Servlet,為此SpringMVC給我們提供了一個好的解決方法,它內置了一個DispatcherServlet類,其繼承結構如下

DispatcherServlet

可以看到其本質還是一個Servlet,但是它并不直接處理業(yè)務邏輯,而是提供一個轉發(fā)功能,為某個url下的所有子路徑,找到一個對應的處理對象中某個處理方法,而這個處理對象,我們將其以Bean的形式加入Spring容器中,Spring容器托管。因此配置SpringMVC的核心,就是配置這個DispatcherServletSpring的容器。

  • web.xml中配置DispatcherServlet
<?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">
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

可以看見我們現在只需要配置一個DispatcherServlet即可,<url-pattern>/<url-pattern>指明了匹配除了靜態(tài)資源以為的所有請求,也就是說現在所有的請求都由SpringMVC框架來管理。重點關注DispatcherServlet 種的contextConfigLocation參數,由于所有進行實際請求處理的controller(即MVC模式中的控制器層)都會被注入一個Spring容器中contextConfigLocation便指明了這個Spring容器配置文件的路徑,我們可以通過注解或xml的方式把Controller注入到容器中。

  • 配置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>
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <bean id="/hello" class="com.spmvc.controller.HelloController">
    </bean>
</beans>

這里需要關注的地方有2點,一個是InternalResourceViewResolver(內置視圖解析器),在非前后端分離的模式下,通常controller會返回一個String,我們要做的是將其轉化成對應的視圖名稱,InternalResourceViewResolver配置了前綴/WEB-INF/jsp/,和后綴.jsp,當Controller返回一個hello字符串時,該視圖解析器會將其轉換成/WEB-INF/jsp/hello.jsp,然后SpringMVC框架會去把這個位置的資源返回給游覽器。BeanNameUrlHandlerMapping是一個在非注解形式下才會用到的Bean,收到的請求url和配置在該容器中對應idController匹配,假若我們這里訪問localhost:8080/hello,則就會匹配到 id=/hello的HelloController。

  • 以非注解的形式編寫一個Controller
public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", "HelloWorld");
        modelAndView.setViewName("hello");
        return modelAndView;
    }
}

這種方式不經常使用,主要是實現一個Controller接口,其中方法會返回一個ModelAndView對象,這個對象包含了2大部分內容,即視圖的名稱,比如xxx.jsp還有需要傳遞的數據(以鍵值對的形式存在)。

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

利用注解配置Controller

之前實現Controller接口的方式和Servlet似乎大同小異,但是如果使用注解就方便多了。

  • 利用注解配置
@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String hello(Model model){
        model.addAttribute("msg", "Hello world~!");
        return "hello"; // 被view解析器處理
    }
}

只要在一個類上添加@Controller便可以,然后在具體方法上添加@RequestMapping("/hello")表明所有訪問/hello的請求都會被該方法處理,也就是說從原來的一個請求對應一個實現類,變成一個請求對應一個方法。Model是一個Springmvc管理的類,通過對其設置鍵值對的方式可以傳遞數據給對應的view,光有注解不夠,我需要配置Spring容器來掃描識別注解

  • 配置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"
       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="com.spmvc.controller"></context:component-scan>
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven/>

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

</beans>

至此,就可以簡單的使用SpringMVC框架了。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容