介绍
了解SpringMVC之前我们先要了解什么是三层架构
三层架构
1.开发服务器端程序,一般都基于两种形式,一种C/S架构程序,一种B/S架构程序
2.使用Java语言基本上都是开发B/S架构的程序,B/S架构又分成了三层架构
3.三层架构
表现层:WEB层,用来和客户端进行数据交互的。表现层一般会采用MVC的设计模型
业务层:处理公司具体的业务逻辑的
持久层:用来操作数据库的
MVC(Model-View-Controller)是一种常见的软件设计模式,用于将应用程序的逻辑分离成三个独立的组件:
Model:数据模型,JavaBean的类,用来进行数据封装。
View:指JSP、HTML用来展示数据给用户
Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等
Spring Web MVC是基于Servlet API构建的原始Web框架,也是Spring框架的一部分。它提供了灵活可扩展的MVC架构,方便开发者构建高性能的Web应用程序,并与 Spring 生态系统无缝集成。
SpringMVC的入门程序
执行流程
入门程序
打开idea创建一个mavenWEB项目,在pom文件中导入依赖
<!-- 版本锁定 -->
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<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>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
编写index.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%--超链接--%>
<h3>入门</h3>
<a href="/hello.do" >入门程序</a>
</body>
</html>
编写Controller类和方法
/**
* 表现层的类 交给spring去管理
*/
@Controller
//@RequestMapping("/hello") //第一层路径
public class HelloController {
@RequestMapping("/hello.do") //第二层路径
public String sayHello(){
System.out.println("SpringMVC入门程序!!");
return "suc";
}
}
创建一个springMVC.xml配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<!-- 配置spring创建容器时要扫描的包 -->
<context:component-scan base-package="com.qcby.controller"/>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
在WEB-INF下面放置一个pages包,创建一个suc.jsp,这就是成功页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>成功页面</title>
</head>
<body>
<h1>SpringMVC入门案例成功了!!</h1>
</body>
</html>
配置核心的控制器(配置DispatcherServlet)
在web.xml配置文件中核心控制器DispatcherServle
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 总的Servlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc.xml配置文件,配置的是Spring配置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC.xml</param-value>
</init-param>
<!-- 配置启动加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
之后直接打开就可以了
流程如下:启动tomcat后找到web.xml,就可以加载入SpringMVC.xml的配置文件,配置文件中可以加载视图解析器和找到要管理的类,通过web.xml中的拦截器找到*.do就可以找到方法,调用方法返回字符串suc,最后通过视图解析器找到WEB-INF/pages中的suc.jsp,启动界面
执行流程
RequestMapping注解
在上面的controller中用到了RequestMapping注解,
RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系,通过该注解才能使前端发起请求时找到后端中对应的方法。
RequestMapping注解可以作用在方法和类上
1.作用在类上:第一级的访问目录
2.作用在方法上:第二级的访问目录
3.细节:路径可以不编写 / 表示应用的根目录开始
RequestMapping的属性
1.path 指定请求路径的url
2.value value属性和path属性是一样的,但不可以省略
3.mthod 指定该方法的请求方式
4.params 指定限制请求参数的条件
例如:
@RequestMapping(path = "/save.do",method = {RequestMethod.GET},params = "username")
请求参数的绑定
SpringMVC 简单的一个或者两个直接可以传递的用参数就可以接收,但是要保证参数名和表单里的input标签的name属性一样
底层通过反射获取到参数进行对比,一旦匹配了就可以接收到
配置文件:
<context:component-scan base-package="com.qcby"/>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
基本类型数据
Controller类中接收数据
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save.do")
public String save(String username,Integer age){
System.out.println("名字:"+username);
return "suc";
}
}
jsp页面中表单提交数据
<head>
<title>演示请求参数的绑定</title>
</head>
<body>
<h3>SpringMVC请求参数的绑定</h3>
<form method="post" action="/user/save.do">
姓名:<input type="text" name="username">
年龄:<input type="text" name="age">
<input type="submit" value="提交" />
</form>
</body>
引用类型和集合数据类型
加上了引用数据类型和list集合和map集合
前端:
</form>
<h3>SpringMVC请求参数的绑定(实体类中由引用类型和集合的绑定)</h3>
<form method="post" action="/user/save3.do">
姓名:<input type="text" name="username">
年龄:<input type="text" name="age">
工资:<input type="text" name="address.money">
工资1:<input type="text" name="list[0].money">
工资2:<input type="text" name="map['aaa'].money">
<input type="submit" value="提交" />
</form>
实体类:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save3.do")
public String save3(User user){
System.out.println(user);
return "suc";
}
}
public class Address {
private Double money;
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Address{" +
"money=" + money +
'}';
}
}
public class User {
private String username;
private Integer age;
private Address address;
private List<Address> list;
private Map<String,Address> map;
public String getName() {
return username;
}
public Map<String, Address> getMap() {
return map;
}
public void setName(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public List<Address> getList() {
return list;
}
public void setList(List<Address> list) {
this.list = list;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
", address=" + address +
", list=" + list +
", map=" + map +
'}';
}
}
如果出现中文乱码问题
可以在配置文件中添加
<!-- 配置过滤器,解决中文乱码的问题 -->
<filter>
<filter-name>characterEncodingFilter</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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
日期类型数据
使用日期时xxxx/xx/xx这种形式是可以绑定的,但是实际中xxxx-xx-xx这种形式更多,因此要用别的方法来获取绑定
一、使用DateTimeFormat注解的方式
在类型中的变量前加上注解,pattern为数据按什么格式返回
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
再在配置文件中加上
<mvc:annotation-driven>
二、自定义类型转换器
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
*
* 自定义类型转换器 把String转换成Date
*/
public class StringToDate implements Converter<String,Date>{
/**
* 进行类型转换的方法
* @param s 用户输入的内容
* @return
*/
@Override
public Date convert(String s) {
// 判断
if(s == null){
throw new RuntimeException("请输入内容");
}
// 进行转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
// 进行转换
return sdf.parse(s);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
注册自定义类型转换器,在springmvc.xml配置文件中编写配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<!-- 配置spring创建容器时要扫描的包 -->
<context:component-scan base-package="com.qcby"/>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value