一、MVC概要

MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑、数据、显示分离的方法组织代码,MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。

在web早期的开发中,通常采用的都是Model1。Model1中,如图所示主要分为两层,视图层和模型层。Model2把一个项目分成三部分,包括视图、控制、模型。这样不仅提高的代码的复用率与项目的扩展性,且大大降低了项目的维护成本。Model 1模式的实现比较简单,适用于快速开发小规模项目,Model1中JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展性和维护的难度。Model2消除了Model1的缺点。

Model1

Model2

常见的服务器端MVC框架有:Struts、Spring MVC、ASP.NET MVC、Zend Framework、JSF;常见前端MVC框架:angularjs、reactjs、vue.js;由MVC演化出了另外一些模式如:MVP、MVVM。

二、Spring MVC介绍

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。Spring MVC的特点:
1、轻量
2、高效
3、与Spring兼容性好
4、功能强大
RESTful、数据验证、格式化、绑定机制、本地化、主题等
5、简洁灵活

Spring的web框架围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解的controller声明方式。官网上说Spring的web模块提供了大量独特的功能,包括:
清晰的角色划分:控制器(controller)、验证器(validator)、 命令对象(command object)、表单对象(form object)、模型对象(model object)、 Servlet分发器(DispatcherServlet)、 处理器映射(handler mapping)、视图解析器(view resolver)等等。 每一个角色都可以由一个专门的对象来实现。

强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器(validator)的引用。

可适配、非侵入:可以根据不同的应用场景,选择合适的控制器子类 (simple型、command型、form型、wizard型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承。

可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。

可定制的绑定(binding) 和验证(validation):比如将类型不匹配作为应用级的验证错误, 这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象, 需要手动解析它并转换到业务对象。

可定制的handler mapping和view resolution:Spring提供从最简单的URL映射, 到复杂的、专用的定制策略。与某些web MVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。

灵活的model转换:在Springweb框架中,使用基于Map的 键/值对来达到轻易地与各种视图技术的集成。

可定制的本地化和主题(theme)解析:支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。

简单而强大的JSP标签库(Spring Tag Library):支持包括诸如数据绑定和主题(theme) 之类的许多功能。它提供在标记方面的最大灵活性。

JSP表单标签库:在Spring2.0中引入的表单标签库,使得在JSP中编写 表单更加容易。

Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。 准确的说,这并非Spring MVC框架本身特性,而应归属于Sping MVC使用的WebApplicationContext容器。

2.1、学习资料

http://7xvpsh.com1.z0.glb.clouddn.com/ Spring MVC翻译

http://spring.cndocs.tk/Spring翻译

http://blog.csdn.net/tangtong1/article/details/51326887 Spring 1-6章

https://github.com/linesh-simplicity/translation-spring-mvc-4-documentation 翻译列表

https://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/spring-framework-reference/html/mvc.html 官方帮助

三、第一个Spring MVC 项目:Hello World

3.1、IntelliJ IDEA中创建一个Maven项目

在IntelliJ IDEA中新建Maven项目,选择“File->New->Project”,创建一个简单项目,不选择模板。

选择“Maven”,不需要使用内置结构(模板)

填写包名与项目名:

选择项目位置,尽量不要有中文、空格或特殊字符,点击完成:

完成后点击“Enable-Auto import”

3.2、添加Web项目支持

前面我们创建好了一个普通的Java项目,现在需要将普通项目转换成Web项目

选择“Web Application”

点击OK后项目就变成Web项目了,且根据Maven风格创建了不同类型的文件夹

如果使用内置架构创建则需要手动添加不同的文件夹类型

3.3、配置Tomcat Web容器

点击右侧下拉列表,选择编辑配置文件

在配置窗口中点中左上角的“加号”->Tomcat Server->"Local"

命名

添加部署包

设置项目的虚拟目录名称(Application context应用上下文)

选择修改项目后服务器动作

修改index.jsp文件后运行项目

启动项目后的运行结果:

注意这里的tomcat的日志与eclipse整合后是不一样的,分开在多个窗口中输出。

3.4、将项目发布到Git远程仓库(非必要)

点击“VCS”->"Enable Version Control Integration",将项目集成到版本控制器中

选择版本控制器类型为Git

提交项目到本地仓库

选择要提交的文件并填写好日志信息:

管理远程仓库地址

点击加号添加

添加成功后

提交到远程仓库

点击push

提交成功

查看结果

3.5、添加依赖的jar包

1、修改pom.xml文件、添加jar包的依赖,主要有:Spring框架核心库、Spring MVC、JSTL等,具体信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.zhangguo</groupId>
<artifactId>springmvc08</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.0.RELEASE</spring.version>
</properties> <!--项目依赖 -->
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency> <!--j2ee相关包 servlet、jsp、jstl-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</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> <!--mysql驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency> <!--spring相关包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency> <!--其他需要的包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies> <build>
<finalName>maven-springmvc</finalName>
<resources>
<!--表示把java目录下的有关xml文件,properties文件编译/打包的时候放在resource目录下-->
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
</resource>
</resources>
<plugins>
<!--servlet容器 jetty插件-->
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.10.v20160621</version>
</plugin>
</plugins>
</build> </project>

如果需要其它的包可以去中心仓库搜索

如果下载太慢可以将maven的远程中心仓库的地址换成国内仓库。

默认会自动下载jar包,第一次下载会较慢,以后从本地引用就会快很多

当依赖成功时,会加载的jar包如下:

将maven依赖的包添加到项目中,发布时一起打包

3.6、将依赖的包添加到项目发布文件中

点击项目结构(ctrl+shift+alt+s)

点击“Artifacts”->"Output Layout"->双击要输出的包

成功添加后在lib目录下就可以看到输出的包了

3.7、修改web.xml注册中心控制器DispatcherServlet

Spring MVC框架像许多其他MVC框架一样, 请求驱动,围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。如下图所示当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。

修改web.xml文件注册该Servlet,修改后的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_3_1.xsd"
version="3.1"> <!--welcome pages-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <!--配置springmvc DispatcherServlet-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--Sources标注的文件夹下需要新建一个spring文件夹-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

3.8、添加Spring MVC配置文件

在src/main/resources源代码目录下添加spring目录与spring-mvc.xml配置文件,配置的形式与Spring容器配置基本类似,为了支持基于注解的IOC,设置了自动扫描包的功能,具体配置信息如下:

<?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
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
<!--启用spring的一些annotation -->
<context:annotation-config/> <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="com.zhangguo.springmvc08.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan> <!--HandlerMapping 无需配置,springmvc可以默认启动--> <!--静态资源映射-->
<mvc:default-servlet-handler/>
<!--如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处-->
<!--本项目把静态资源放在了WEB-INF的statics目录下,资源映射如下-->
<!--<mvc:resources mapping="/css/**" location="/WEB-INF/statics/css/"/>-->
<!--<mvc:resources mapping="/js/**" location="/WEB-INF/statics/js/"/>-->
<!--<mvc:resources mapping="/image/**" location="/WEB-INF/statics/image/"/>--> <!--但是项目部署到linux下发现WEB-INF的静态资源会出现无法解析的情况,但是本地tomcat访问正常,因此建议还是直接把静态资源放在webapp的statics下,映射配置如下-->
<!--<mvc:resources mapping="/css/**" location="/statics/css/"/>-->
<!--<mvc:resources mapping="/js/**" location="/statics/js/"/>-->
<!--<mvc:resources mapping="/image/**" location="/statics/images/"/>--> <!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
<mvc:annotation-driven/> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
<!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/><!--设置JSP文件的目录位置-->
<property name="suffix" value=".jsp"/>
</bean> <!-- springmvc文件上传需要配置的节点-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="20971500"/>
<property name="defaultEncoding" value="UTF-8"/>
<property name="resolveLazily" value="true"/>
</bean>
</beans>

在视图解析中我们把所有的视图都存放在/WEB-INF/目录下,这样是为了视图安全,因为这个目录客户端不能直接访问。

3.9、创建HelloWorld控制器

在src/main/java源代码目录下创建包com.zhangguo.springmvc08.controller,在包下创建一个普通的类:HomeController,具体代码如下:

package com.zhangguo.springmvc08.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; @Controller //声明为控制器
@RequestMapping(path = "/home") //请求映射
public class HomeController {
@RequestMapping(path = "/index") //请求映射
public String index(Model model){
model.addAttribute("message","Hello Spring MVC!");
return "home/index";
}
}

注解为@Controller是为了让Spring IOC容器初始化时自动扫描到;@RequestMapping是为了映射请求路径,这里因为类与方法上都有映射所以访问时应该是/home/index;方法中声明Model类型的参数是为了把Action中的数据带到视图中;方法返回的结果是视图的名称index。

3.10、创建视图

在WEB-INF/view目录中创建视图,视图将从Action中带回的信息展示,具体内容如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h2>
${message}
</h2>
</body>
</html>

3.11、测试运行

启动Tomcat运行项目,请注意查看启动信息,如果有异常应该先解决异常信息,运行成功后的结果如下所示:

四、用户管理示例

使用Spring MVC实现一个简单的用户管理示例,项目结构如下

运行结果:

4.1、用户Bean

用户实体类user.java

package com.zhangguo.springmvc08.entity;

/***
* 用户
*/
public class User {
public User(int id, String name, String address, String phone) {
this.id = id;
this.name = name;
this.address = address;
this.phone = phone;
} public User() {
} /**
* 编号
*/
private int id;
/**
* 姓名
*/
private String name;
/**
* 地址
*/
private String address;
/**
* 电话
*/
private String phone; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} /**
* 姓名
*/
public String getName() {
return name;
} /**
* 姓名
*/
public void setName(String name) {
this.name = name;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public String getPhone() {
return phone;
} public void setPhone(String phone) {
this.phone = phone;
}
}

4.2、用户数据访问对象

用户数据访问接口 IUserDAO

package com.zhangguo.springmvc08.dao;

import com.zhangguo.springmvc08.entity.User;

import java.util.List;

/**
* 用户数据访问接口
*/
public interface IUserDAO {
/**获得所有*/
List<User> getAll();
/**根据用户编号获得用户对象*/
User getUserById(int id);
/**新增*/
boolean add(User user);
/**删除*/
boolean delete(int id);
/**更新*/
boolean update(User user);
}

UserDAO.java

package com.zhangguo.springmvc08.dao;

import com.zhangguo.springmvc08.entity.User;
import org.springframework.stereotype.Repository; import java.util.ArrayList;
import java.util.List; /**
* 用户数据访问对象
*/
@Repository
public class UserDAO implements IUserDAO {
private static List<User> users = new ArrayList<User>(); static {
users.add(new User(1, "刘德华", "中国香港", "13767890098"));
users.add(new User(2, "张学友", "中国广东", "18989890767"));
users.add(new User(3, "张国立", "中国北京", "13345672345"));
users.add(new User(4, "张靓因", "中国上海", "15890908679"));
users.add(new User(5, "齐萍萍", "中国珠海", "13246712235"));
} /**
* 获得所有
*/
public List<User> getAll() {
return users;
} /**
* 单个用户
*/
public User getUserById(int id) {
for (User user : users) {
if (user.getId() == id) {
return user;
}
}
return null;
} /**
* 添加
*/
public boolean add(User user) {
if(user.getId()<=0)
{
user.setId(users.get(users.size()-1).getId()+1);
}
users.add(user);
return true;
} /**
* 删除
*/
public boolean delete(int id) {
users.remove(getUserById(id));
return true;
} /**
* 更新
*/
public boolean update(User user) {
User oldUser = getUserById(user.getId());
oldUser.setName(user.getName());
oldUser.setAddress(user.getAddress());
oldUser.setPhone(user.getPhone());
return true;
}
}

4.3、用户业务对象

用户业务类UserService.java

package com.zhangguo.springmvc08.service;

import com.zhangguo.springmvc08.dao.IUserDAO;
import com.zhangguo.springmvc08.dao.UserDAO;
import com.zhangguo.springmvc08.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import javax.annotation.Resource;
import java.util.List; /**用户业务*/
@Service
public class UserService { @Autowired
IUserDAO userdao; public List<User> queryAllUsers(){
return userdao.getAll();
} public User getUserById(int id){
return userdao.getUserById(id);
} public boolean deleteUser(int id){
return userdao.delete(id);
} public boolean addUser(User user){
return userdao.add(user);
} public boolean editUser(User user){
return userdao.update(user);
} }

4.4、控制器

用户控制器UserController.java

package com.zhangguo.springmvc08.controller;

import com.zhangguo.springmvc08.entity.User;
import com.zhangguo.springmvc08.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; @Controller //声明为控制器
@RequestMapping(path = "/user") //请求映射
public class UserController { @Autowired
UserService userService; @RequestMapping(path = "/index") //请求映射
public String index(Model model){
model.addAttribute("list",userService.queryAllUsers());
return "user/index";
} @RequestMapping("/delete/{id}")
public String delete(@PathVariable int id){
userService.deleteUser(id);
return "redirect:/user/index";
} @RequestMapping("/add")
public String add(){
return "user/add";
} @RequestMapping(value = "/add",method = RequestMethod.POST)
public String add(User user){
userService.addUser(user);
return "redirect:/user/index";
} @RequestMapping("/edit/{id}")
public String edit(@PathVariable int id,Model model){
model.addAttribute("user",userService.getUserById(id));
return "user/edit";
} @RequestMapping(value = "/edit",method = RequestMethod.POST)
public String edit(User user){
userService.editUser(user);
return "redirect:/user/index";
} }

4.5、用户视图

列表:user/index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>用户管理</title>
</head>
<body>
<h2>
用户管理
</h2>
<table width="100%" border="1">
<tr>
<th>编号</th>
<th>姓名</th>
<th>地址</th>
<th>电话</th>
<th>操作</th>
</tr>
<c:forEach items="${list}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.address}</td>
<td>${user.phone}</td>
<td>
<a href="delete/${user.id}" class="del">删除</a> |
<a href="edit/${user.id}">修改</a></td>
</tr>
</c:forEach>
</table>
<p>
<a href="add">新增</a>
</p>
<script>
var items = document.querySelectorAll(".del");
for (var i = 0; i < items.length; i++) {
items[i].onclick = function () {
return confirm("您确认要删除吗?");
}
}
</script>
</body>
</html>

新增:user/add.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>用户管理</title>
</head>
<body>
<h2>
添加用户
</h2>
<form method="post" action="add">
<fieldset>
<legend>用户信息</legend>
<p>
<label for="name">姓名:</label>
<input name="name" id="name" type="text" required="required" maxlength="32"/>
</p>
<p>
<label for="address">地址:</label>
<input name="address" id="address" type="text" required="required" maxlength="128"/>
</p>
<p>
<label for="phone">电话:</label>
<input name="phone" id="phone" type="text" required="required" maxlength="11"/>
</p>
<p>
<button>提交</button>
</p>
</fieldset>
</form>
<a href="index">列表</a>
</body>
</html>

编辑:user/edit.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>用户管理</title>
</head>
<body>
<h2>
修改用户
</h2>
<form method="post" action="../edit">
<fieldset>
<legend>用户信息</legend>
<p>
<label for="id">编号:</label>
<input name="id" id="id" type="text" required="required" readonly="readonly" maxlength="32" value="${user.id}"/>
</p>
<p>
<label for="name">姓名:</label>
<input name="name" id="name" type="text" required="required" maxlength="32" value="${user.name}"/>
</p>
<p>
<label for="address">地址:</label>
<input name="address" id="address" type="text" required="required" maxlength="128" value="${user.address}"/>
</p>
<p>
<label for="phone">电话:</label>
<input name="phone" id="phone" type="text" required="required" maxlength="11" value="${user.phone}"/>
</p>
<p>
<button>提交</button>
</p>
</fieldset>
</form>
<a href="index">列表</a>
</body>
</html>

4.6、Spring-MVC配置文件

resources/spring/spring-mvc.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
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"> <!--启用spring的一些annotation -->
<context:annotation-config/> <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="com.zhangguo.springmvc08">
</context:component-scan> <!--HandlerMapping 无需配置,springmvc可以默认启动--> <!--静态资源映射-->
<mvc:default-servlet-handler/>
<!--如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处-->
<!--本项目把静态资源放在了WEB-INF的statics目录下,资源映射如下-->
<!--<mvc:resources mapping="/css/**" location="/WEB-INF/statics/css/"/>-->
<!--<mvc:resources mapping="/js/**" location="/WEB-INF/statics/js/"/>-->
<!--<mvc:resources mapping="/image/**" location="/WEB-INF/statics/image/"/>--> <!--但是项目部署到linux下发现WEB-INF的静态资源会出现无法解析的情况,但是本地tomcat访问正常,因此建议还是直接把静态资源放在webapp的statics下,映射配置如下-->
<!--<mvc:resources mapping="/css/**" location="/statics/css/"/>-->
<!--<mvc:resources mapping="/js/**" location="/statics/js/"/>-->
<!--<mvc:resources mapping="/image/**" location="/statics/images/"/>--> <!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
<mvc:annotation-driven/> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
<!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/><!--设置JSP文件的目录位置-->
<property name="suffix" value=".jsp"/>
</bean> <!-- springmvc文件上传需要配置的节点-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="20971500"/>
<property name="defaultEncoding" value="UTF-8"/>
<property name="resolveLazily" value="true"/>
</bean>
</beans>

五、示例下载

https://git.coding.net/zhangguo5/SpringMVC08.git

点击下载示例

六、视频

https://www.bilibili.com/video/av16991874/

七、作业

6.1、请使用Spring MVC在页面上显示当前日期

6.2、请使用Spring MVC完成如下功能(三选一),可以不使用数据库,直接使用集合就可以了

Spring MVC 学习总结(八)——Spring MVC概要与环境配置(IDEA+Maven+Tomcat7+JDK8、示例与视频)的更多相关文章

  1. Spring MVC 学习总结(一)——MVC概要与环境配置(IDea与Eclipse示例)

    一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...

  2. Spring MVC 学习总结(一)——MVC概要与环境配置 转载自【张果】博客

    Spring MVC 学习总结(一)--MVC概要与环境配置   目录 一.MVC概要 二.Spring MVC介绍 三.第一个Spring MVC 项目:Hello World 3.1.通过Mave ...

  3. 2017.3.31 spring mvc教程(八) <mvc:annotation-driven />所做的工作

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  4. Spring Boot 学习1-创建Spring Boot应用

    如果使用Maven, 确保先安装好Maven再继续. 创建POM文件 在这里有两种方式: 继承Spring Boot parent的pom. 不继承. 继承Spring Boot pom 1 2 3 ...

  5. Spring MVC 学习总结(一)——MVC概要与环境配置

    一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...

  6. Spring.Net学习笔记(八)-设置配置文件参数

    一.开发环境 VS2013 .netframework4.5 spring.net1.3.1 二.项目结构 三.开发过程 1.编写Person类 namespace SpringNetConfigAr ...

  7. spring揭密学习笔记(1) --spring的由来

    1.spring起源于在EJB暴露出各种严重问题的情况应运而生. Spring是于2003年兴起的一个轻量级的Java开发框架, Spring倡导一切从实际出发,以实用的态度来选择适合当前开发场景的解 ...

  8. 【Spring Boot学习之四】Spring Boot事务管理

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.springboot整合事务事务分类:编程事务.声明事务(XML.注解),推荐使用注解方式,springboot默 ...

  9. 【Spring Boot学习之三】Spring Boot整合数据源

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.Spring Boot整合Spring JDBC 1.pom.xml <project xmlns=&quo ...

随机推荐

  1. Tracker-store

    升级后发现有个tracker-store占用cpu非常厉害,查了下,好像是GNOME 3使用 Documents 來整合 本机 以及 在线(Google / Twitter)账户的文件,这个功能会呼叫 ...

  2. 【前端】javascript实现导航栏筋斗云效果特效

    实现效果: 实现效果如下图所示 实现原理: 什么是筋斗云效果: 这个效果很简单,就是鼠标移到其他导航目录时会有背景图片跟着鼠标滑动到当前的目录. 实现思路: 鼠标经过的时候,利用offsetLeft获 ...

  3. javascript的一些算法的实用小技巧

    一.交换两个数字的值 我们交换两个数字的值想到的方法一般就是用一个新的变变量,让他把一个数存起来,然后在交换两个数字的值,看下面这种. var a = 1, b = 2; //交换两个数字的值 var ...

  4. 循环渐进linux笔记——linux系统基本机构

    第一篇 linux的基础介绍 1.linux是一个支持多用户多任务的超棒系统,它具由六个字符控制台,每个控制台都能独立作业,不会互相影响,如果需要在几个字符控制台互相切换的话可以用组合键 ctrl+a ...

  5. 基于HTML5及WebGL的工控SCADA模拟飞机飞行

    昨天看到一篇文章说是学习如何开飞机的,然后我就想,如果我也可以开飞机那就好玩了,每个人小时候都想做飞行员!中国飞行员太难当了,再说也不轻易让你开飞机!后来我就想如果能用 HT 开飞机那就是真的有趣了, ...

  6. 什么是Echarts?Echarts如何使用?

    什么是Echarts? Echarts--商业级数据图表    商业级数据图表,它是一个纯JavaScript的图标库,兼容绝大部分的浏览器,底层依赖轻量级的canvas类库ZRender,提供直观, ...

  7. Spring读书笔记——bean创建(下)

    有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...

  8. 有关CUBLAS中的矩阵乘法函数

    关于cuBLAS库中矩阵乘法相关的函数及其输入输出进行详细讨论. ▶ 涨姿势: ● cuBLAS中能用于运算矩阵乘法的函数有4个,分别是 cublasSgemm(单精度实数).cublasDgemm( ...

  9. HTML学习笔记 w3sCss盒子模型应用案例(div布局) 第十一节 (原创) 参考使用表

    * { margin: 0px; padding: 0px; } .top { width: 100%; height: 50px; background-color: antiquewhite; } ...

  10. Oracle - java创建Oracle 的触发器

    Oracle - java创建Oracle 的触发器 今天碰到这个问题,遇到点问题,到这来 总结一下解决的办法, 需求,为一个用户当中的表增加一个自动增长列,我还没有学Oracle 的这部分,只是简单 ...