Spring MVC

Spring Web MVC(Model View Controller )是一种基于Java,并实现了Web MVC设计模式的请求驱动类型(即请求-响应模型)的轻量级Web框架;

SpringMVC的前端控制器是DispatcherServlet,其可以拆解为:

  • 处理器管理(Handler Mapping)
  • 视图解析器进行视图解析(View Resolver)
  • 页面控制器/动作/处理器为Controller接口

 

DispatcherServlet流程图:

具体流程:

1.用户发请求->DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;

2.DispatcherServlet->HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(一个Handler处理器,多个HandlerInterceptor拦截器);

3.DispatcherServlet->HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,用来支持多种类型的处理器;

4.HandlerAdapter->处理器功能处理方法的调用,HandlerAdapter会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理,并返回ModelAndView对象(模型数据和逻辑视图名);

5.ModelAndView逻辑视图名->ViewResolver,ViewResolver将其解析为具体的View;

6.View->渲染,view会根据传进来的Model模型数据进行渲染,Model为一个Map数据结构

7.返回控制权到DispatcherServlet,然后由其响应给客户;

 


 SpringMVC简单实例(xml):

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">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <!--所有访问的 URL 都由DispatcherServlet来解析,但是这里最好配置静态文件不由DispatcherServlet来解析 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

dispatcher-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 id="simpleUrlHandlerMapping"
          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <!-- /hello 路径的请求交给 id 为 helloController 的控制器处理-->
                <prop key="/hello">helloController</prop>
            </props>
        </property>
    </bean>
    <!-- 控制器-->
    <bean id="helloController" class="controller.HelloController"></bean>
    <!-- 视图解析器(jsp)-->
    <bean id="ViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>
HelloController:(实现controller接口实现处理器类)
package controller;


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

public class HelloController implements Controller {
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mav = new ModelAndView("fir");
        mav.addObject("message", "Hello Spring MVC1");
        return mav;
    }
}

index.jsp:(用户请求)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <a href="/hello">fir</a>
  </body>
</html>

fir.jsp:(响应)

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

将响应的jsp放在WEB-INF下是不想让用户可以直接访问到;

运行结果:


SpringMVC简单实例(注解):

gradle:

repositories {
    mavenCentral()
    maven{ url 'http://maven.aliyun.com/nexus/content/groups/public'}
}

dependencies {
    compile group: 'junit', name: 'junit', version: '4.11'
    compile group: 'org.springframework', name: 'spring-webmvc', version: '5.1.5.RELEASE'
    // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
    compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
    // https://mvnrepository.com/artifact/org.springframework.restdocs/spring-restdocs-mockmvc
    compile group: 'org.springframework.restdocs', name: 'spring-restdocs-mockmvc', version: '2.0.2.RELEASE'
// https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl
    compile group: 'javax.servlet', name: 'jstl', version: '1.2'
}

配置DispatcherServlet:

package answer.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {//返回自身web框架的配置
        return new Class[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

 


@EnableWebMvc
@Configuration
@ComponentScan("answer")
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver v=new InternalResourceViewResolver();
        v.setPrefix("/WEB-INF/view/");
        v.setSuffix(".jsp");
        return v;
    }


    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();//把静态资源做放行处理
    }
    
}

controller:

package answer.control;

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

import java.util.Map;

@Controller
public class UserControl {
    @RequestMapping("/z1")
    public String method(Map map){
        map.put("msg","spring 注解");
        return "success";
    }
}

indes.jsp:

<a href="/z1">z1</a>

success.jsp:

:${msg}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream答案

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值