1.SpringMVC介绍
SpringMVC是Spring框架中的一个组件,是一个轻量级的web的MVC框架,充当controller,其本质就是一个Servlet。
1.1 传统Servlet的不足
每个请求,都需要定义一个Servlet。虽然可以在service方法中,根据业务标识进行业务分发,但是每个Servlet中的service方法的实现是重复。如果想要对service进行更高层次的封装,就可以解决service的重复代码问题。
每个请求的参数,都需要根据request对象,从Map逐一的获取,单调且含量低。将所有的参数,自动封装映射,简化开发。
request.getParameter(“”)
每个Servlet,向客户端返回数据时,需要单独的处理。
request.getRequestDispatcher(“/路径”).forward(request,response)
Response.sendRedirect(“/路径”)
针对于Servlet在实际使用中的不便,Spring中提供了组件,SpringMVC,更进一步的简化了Servlet的开发。
1.2 SpringMVC的架构
1.2.1 DispatcherServlet
核心控制器,本质上就是一个Servlet,处理所有的客户端的请求。根据请求的资源路径,在处理器映射器中查找对应的处理器。
1.2.2 HandlerMapping
处理器映射器,存储所有当前程序中的处理器,如果在处理器映射器中查找不到资源路径,直接返回404。
1.2.3 HandlerAdapter
处理器适配器,用于适配各种处理器,调用具体的处理器程序。
1.2.4 Handler
具体处理器,开发者实现相应接口或者使用注解声明的程序。用于处理具体的请求。
1.2.5 ViewResolver
视图解析器,根据处理器返回的数据,进行数据处理,将数据处理成相应的格式。
JSP/JSON等等。
2.SpringMVC使用
2.1 SpringMVC入门使用
2.1.1 导入SpringMVC相关jar包
<?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>org.example</groupId>
<artifactId>01-mvc01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- 引入springmvc 相关jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
</dependencies>
</project>
2.1.2 编写SpringMVC配置文件
<?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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置了一个自定义的处理器 -->
<bean id="controller01" name="/controller01.do" class="com.bjpowernode.controller.Controller01"></bean>
<bean id="controller02" name="/controller02.do" class="com.bjpowernode.controller.Controller02"></bean>
<!-- 开启springmvc 注解 -->
<!-- 开启组件扫描 -->
<context:component-scan base-package="com.*" />
<!-- 开启springmvc 相关注解 -->
<mvc:annotation-driven />
</beans>
2.1.3 编写相关类
package com.bjpowernode.controller;
import org.springframework.web.HttpRequestHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Controller01 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
System.out.println("你好啊 springmvc");
}
}
package com.bjpowernode.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Controller02 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("Hello SpringMVC 02");
//模型视图
//模型就是数据
//视图 界面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name","Hello SpringMVC");
modelAndView.setViewName("/index.html");//springmvc中 /表示当前项目
return modelAndView;
}
}
package com.bjpowernode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping
public class Controller03 {
@RequestMapping("hello1.do")
public String hello(String name){
System.out.println("name:"+name);
System.out.println("你好springmvc");
return "/index.html";
}
@RequestMapping("hello2.do")
public String hello1(String name){
System.out.println("name:"+name);
System.out.println("你好springmvc");
return "/index.html";
}
}
2.1.4 在web.xml中配置SpringMVC
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置自定义的处理器清单 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置服务器启动时 就初始化DispatcherServlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
2.1.5 进行测试
使用bean标签的name属性进行访问。注意,每个名字必须有个/,如果多个名字,之间使用逗号。
2.2 SpringMVC的数据绑定
在SpringMVC中为了简化开发,SpringMVC对请求的参数进行预处理,SpringMVC支持按照参数名称,直接将请求参数封装传递给处理器中的方法,处理无需单独的获取。
2.2.1 请求参数
请求参数,是指基本数据类型和字符串、对象、数组、Map等。
2.2.2 获取请求参数
package com.bjpowernode.controller;
import com.bjpowernode.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 处理简单的参数
* @return
*/
@RequestMapping("/simple.do")
public String doSimpleParam(Integer id,boolean flag,String name,@RequestParam("City") String city){
System.out.println("id: "+id);
System.out.println("flag: "+flag);
System.out.println("name: "+name);
System.out.println("city: "+city);
return "/success.html";//默认当做内部转发处理 默认当做视图路径
}
/**
* 使用对象接收请求参数
* 请求参数的名称 必须 和 对象中属性名一致 类型要支持转换
* @param user
* @return
*/
@RequestMapping("/obj.do")
public String objParam(User user){
System.out.println("id: "+user.getId());
System.out.println("flag: "+user.getFlag());
System.out.println("name: "+user.getName());
return "/success.html";//默认当做内部转发处理 默认当做视图路径
}
/**
* 使用map接收请求参数
* 默认是不支持使用map集合接收数据 需要使用注解@RequestParam
* RequestParam :
* name/value : 绑定请求参数 ,默认根据名称注入值,当名称不一致,可以使用RequestParam设置对应的参数的名称,进行绑定
* required : 是否需要这个参数 默认true 如果有使用了RequestParam这个注解,默认必须传这个参数 如果不是必传 设置为 false
* defaultValue : 如果没有这个请求参数时或者请求参数值为null 设置默认值
* @param param
* @return
*/
@RequestMapping("/map.do")
public String mapParam(@RequestParam Map<String,Object> param){
System.out.println("id: "+param.get("id"));
System.out.println("flag: "+param.get("flag"));
System.out.println("name: "+param.get("name"));
return "/success.html";//默认当做内部转发处理 默认当做视图路径
}
@RequestMapping("/arr.do")
public String arr(Integer id,boolean flag,String name,String[] likes){
System.out.println("id: "+id);
System.out.println("flag: "+flag);
System.out.println("name: "+name);
List<String> strings = Arrays.asList(likes);
System.out.println(strings);
return "/success.html";//默认当做内部转发处理 默认当做视图路径
}
@RequestMapping("/list.do")
public String arr(Integer id,boolean flag,String name,@RequestParam("likes") List<String> likes){
System.out.println("id: "+id);
System.out.println("flag: "+flag);
System.out.println("name: "+name);
System.out.println(likes);
return "/success.html";//默认当做内部转发处理 默认当做视图路径
}
}
2.2.3 页面代码
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>简单的数据</h1>
<form action="param/simple.do" method="get">
<p>ID:<input name="id" /></p>
<p>boolean:<input name="flag" type="radio" value="true" />男<input name="flag" type="radio" value="false" />女</p>
<p>String:<input name="name" /></p>
<p>city:<input name="City" /></p>
<input type="submit" value="提交" />
</form>
<h1>对象的数据</h1>
<form action="param/obj.do" method="get">
<p>ID:<input name="id" /></p>
<p>boolean:<input name="flag" type="radio" value="true" />男<input name="flag" type="radio" value="false" />女</p>
<p>String:<input name="name" /></p>
<input type="submit" value="提交" />
</form>
<h1>map的数据</h1>
<form action="param/map.do" method="get">
<p>ID:<input name="id" /></p>
<p>boolean:<input name="flag" type="radio" value="true" />男<input name=