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