SpringMVC全面入门篇

2019-09-05 17:12:33 浏览数 (1)

其实SpringMVC的服务实际是对Servlet的扩展,其本质还是使用的Servlet只是对其进行了扩展,解决了原来的 web页面与业务逻辑强耦合的弊病

上图是早期的web方式:

业务逻辑和web完全耦合在一起

前后端相互依赖

开发人员需要前端和后端均掌握

后续进行调整

Servlet接受请求===》JavaBean进行业务处理访问数据等=======》返回数据给Servlet=====》装入JSP展示给用户

最终形成了目前比较统一的模式

传统的模型层被拆分为了业务层(Service)和数据访问层(DAO,Data Access Object)。在 Service 下可以通过 Spring 的声明式事务操作数据访问层,而在业务层上还允许我们访问 NoSQL ,这样就能够满足异军突起的 NoSQL 的使用了,它可以大大提高互联网系统的性能。

  • 特点:

结构松散,几乎可以在 Spring MVC 中使用各类视图

松耦合,各个模块分离

与 Spring 无缝集成

采用Idea搭建

idea搭建必须选择MVC , web services

web service提供web模块

MVC提供Controller View Model

结合起来是就一个SpringMVC的web服务

后续的搭建就是一轮顺丰 添加Tomcat配置和打包运行

web.xml配置:只需要修改里面默认的拦截为我们通用的,修改如下

代码语言:javascript复制
<servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
<!--        <url-pattern>*.form</url-pattern>-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

dispatch-servlet.xml的配置

重点有3

一是扫包 这个是之前bean通过注解进行转配的常识需要

<context:component-scan base-package="com.mvc"/>

二是作用域 这里主要是context为我们的扫包做准备

代码语言:javascript复制
//加入context
 xmlns:context="http://www.springframework.org/schema/context"
 
 //context的xsd,否则会出现无法解析的问题
 http://www.springframework.org/schema/context/spring-context-4.3.xsd

三是重修修改jsp文件放置位置 前后缀等方便进行统一管理

代码语言:javascript复制
<bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

最终如下(可以作为通用的模版来处理)

代码语言:javascript复制
<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.3.xsd">

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <context:component-scan base-package="com.mvc"/>
</beans>

到此我们的配置算是基本完成

然后还有个小问题就是web访问的路径中的applicationContext(可以忽略不计)

接下来就是完全的基于Servlet的响应请求操作

代码语言:javascript复制
@RestController
public class IndexController {
    @RequestMapping("/")
    public ModelAndView index() {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        HashMap map = new HashMap();
        map.put("Title", "index title");
        modelAndView.addAllObjects(map);
        modelAndView.addObject("Title", "我是标题");

        return modelAndView;
    }
    
}

Controller响应用户请求 返回一个ModelAndView(包含数据和jsp页面模版)

@RestController 说明这个是响应氢气的控制器,也就是SpringMVC架构图中的响应控制部分

@RequestMapping("/") 将相应映射到 / 这个请求上

代码语言:javascript复制
@RequestMapping("/param")
public ModelAndView getParamater(@RequestParam("userName") String name,
@RequestParam("password") String pwd, ModelAndView modelAndView) {
System.out.println("userName:"   name   "n"   "password:"   pwd);
modelAndView.setViewName("test");
return modelAndView;
}
@RequestMapping("/test")
public ModelAndView test() {
ModelAndView modelAndView = new ModelAndView("test");
return modelAndView;
}

我们通过test发送一个form表单

代码语言:javascript复制
<form action="${pageContext.request.contextPath}/param" role="form" method="post">
  用户名:<input type="text" name="userName"><br/>
  密码:<input type="text" name="password"><br/>
  <input type="submit" value="提  交">
</form>

最终@RequestMapping("/param")获得了响应

从中有两点

@RequestMapping("/param")是响应GETPOST

@RequestParam是一个参数注解

对应的还有Path的注解

对于上述的响应我们可以让其有SpringMVC作为一个转换器来帮忙完成转化为更加人性的Model,但是这个model不能在Controller中声明需要独立声明为Public的类

代码语言:javascript复制
 @RequestMapping("/model")
 @ResponseBody
public User model(User user) {
    return user;
}





package com.mvc;

public class User {
    String userName;
    String password;

    public User() {
    }

    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

使用Model

在控制器中声明一个Model,这样本Controller中的所有都会走这个Model

代码语言:javascript复制
@ModelAttribute
public void model(Model model) {
    model.addAttribute("message", "注解成功");
}

好处是后续不需要每次都ModelView只需要返回View的名称即可

代码语言:javascript复制
@RequestMapping("/aModel")
public String attrModel(Model model) {

    return "test";
}

坏处是每个氢气都会走Model的创建函数

0 人点赞