前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC全面入门篇

SpringMVC全面入门篇

作者头像
大话swift
发布2019-09-05 17:12:33
3720
发布2019-09-05 17:12:33
举报
文章被收录于专栏:大话swift大话swift

其实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的创建函数

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档