一,定义
Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。 MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合。
模型(Model)封装了应用程序数据,通常它们将由POJO类组成。
视图(View)负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出。
控制器(Controller)负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。
二,SpringMVC执行流程
1、发起请求到前端控制器(DispatcherServlet )
2、前端控制器请求HandlerMapping查找Handler(可以根据xml、注解进行查找)
3、处理器映射器HandlerMapping向前端控制器DispatcherServlet 返回Handler
4、前端控制器DispatcherServlet 调用处理器适配器HandlerAdapter 执行Handler
5、处理器适配器HandlerAdapter 执行Handler
6、Handler执行完给处理器适配器返回ModelAndView
7、处理器适配器向前端控制器返回ModelAndView (ModelAndView 是SpringMvc的底层对象 包括model和view)
8、前端控制器请求视图解析器去解析视图
根据逻辑视图名解析成真正的视图(jsp)
9、视图解析器向前端控制器返回view
10、前端控制器进行视图渲染
视图渲染将模型数据(模型数据在ModelAndView对象中)填充到request域
11、前端控制器向用户响应结果
三,入门程序
一,步骤:
1.建立工程
2.导入所需jar包 比之前spring多了一个springmvc包
3.在web.xml文件中配置我们的前端控制器 DispatherServlet
4.创建springMvc.xml 与之前spring一样
配置处理器映射器
处理器适配器
视图解析器
5.创建MyController 实现Controller
6.在springMvc.xml中配置我们的MyController
7.创建jsp
8.部署启动
二,示例:
1,建立一个web工程
2,导入jar包
3,在web.xml文件中配置我们的前端控制器 DispatherServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 如果不配置,默认加载WEB-INF下面的springmvc-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
4,创建springMvc.xml 与之前spring一样
配置处理器映射器
处理器适配器
视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!-- 1,配置处理器映射器 如果不配置默认就是他 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 2,配置处理器适配器 如果不配置默认就是他 在servlet启动后会被加载-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--3,配置识图解析器 把逻辑视图解析成真正的物理视图-->
<!-- 即把mv.setViewName("/WEB-INF/jsp/index.jsp")改为mv.setViewName("index"); -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 逻辑视图前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 逻辑视图后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 4,自定义Controller 配置我们的Controller -->
<bean name="/myCon.do" class="com.xl.action.MyController"></bean>
</beans>
5,创建MyController 实现Controller
package com.xl.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
/*
* 自定义controllertr
* */
public class MyController implements Controller {
public ModelAndView handleRequest(HttpServletRequest arg0,
HttpServletResponse arg1) throws Exception {
//1,接受参数
//2,封装参数,调用业务层
//3,返回视图
ModelAndView mv =new ModelAndView();
mv.addObject("msg","在学习SpringMvc");
//物理视图
//mv.setViewName("/WEB-INF/jsp/index.jsp");
//逻辑视图
mv.setViewName("index");
return mv;
}
}
6,在springMvc.xml中配置我们的MyController
上述代码已经配置
7.创建jsp
在WEB-INF下配置,创建jsp包
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
${msg}
</body>
</html>
8.部署启动
四,3个处理器映射器
1.BeanNameUrlHandlerMapping
功能:寻找Controller
根据url请求去匹配bean的name属性url,从而获取Controller
2.SimpleUrlHandlerMapping
功能:寻找Controller
根据浏览器url匹配简单url的key,key又Controller的id找到Controller
3.ControllerClassNameHandlerMapping
注:2个处理器映射器不能共存
五,两个处理器适配器
1.SimpleControllerHandlerAdapter(默认的)
功能:执行controller
调用controller里面方法,返回modelAndView。
2.HttpRequestHandlerAdapter
功能:执行controller
配置文件
注:2个处理器适配器能共存
处理器映射器就是:根据我们的 URL 寻找 Handler
处理器适配器就是:按照它要求的规则去执行 Handler
六,注解开发
一,步骤:
1.建立工程
2.导入所需jar包 比之前spring多了一个springmvc包
3.在web.xml文件中配置我们的前端控制器 DispatherServlet
4.创建springMvc.xml 与之前spring一样
扫描装配bean
配置注解开发的处理器映射器
配置注解开发的处理器适配器
视图解析器
5.创建MyannoAction, 加上注解@Controller
6.创建jsp
7.部署启动
注:执行逻辑
参照:https://www.cnblogs.com/gdwkong/p/8784591.html
六,封装参数
示例:
recieveObject.jsp
<body>
<h3>封装参数</h3>
<form action="<%=request.getContextPath() %>/recieve/recieveObj.do" method="post">
name:<input type="text" name="userName">
<input type="submit" value="提交">
</form>
<br>
<h3>封装int类型</h3>
<form action="<%=request.getContextPath() %>/recieve/recieveInt.do" method="post">
id:<input type="text" name="id">
<input type="submit" value="提交">
</form>
<br>
<h3>封装String类型</h3>
<form action="<%=request.getContextPath() %>/recieve/recieveStr.do" method="get">
Str:<input type="text" name="userName">
<input type="submit" value="提交">
</form>
<br>
<h3>封装Array类型</h3>
<form action="<%=request.getContextPath() %>/recieve/recieveArr.do" method="post">
爱好:<input type="checkbox" name="likes" value="1">钓鱼
<input type="checkbox" name="likes" value="2">煮鱼
<input type="checkbox" name="likes" value="3">吃鱼
<input type="submit" value="提交">
</form>
<br>
<h3>封装对象</h3>
<form action="<%=request.getContextPath() %>/recieve/recieveUser.do" method="post">
id:<input type="text" name="id">
username<input type="text" name="username">
birthday<input type="text" name="birthday">
sex<input type="text" name="sex">
address<input type="text" name="address">
<input type="submit" value="提交">
</form>
<br>
<h3>封装包装类型</h3>
<form action="<%=request.getContextPath() %>/recieve/recieveUserVo.do" method="post">
id:<input type="text" name="user.id">
username<input type="text" name="user.username">
birthday<input type="text" name="user.birthday">
sex<input type="text" name="user.sex">
address<input type="text" name="user.address">
<input type="submit" value="提交">
</form>
<br>
<h3>封装集合</h3>
<form action="<%=request.getContextPath() %>/recieve/recieveList.do" method="post">
id:<input type="text" name="users[0].id">
username<input type="text" name="users[0].username">
birthday<input type="text" name="users[0].birthday">
sex<input type="text" name="users[0].sex">
address<input type="text" name="users[0].address"><br>
id:<input type="text" name="users[1].id">
username<input type="text" name="users[1].username">
birthday<input type="text" name="users[1].birthday">
sex<input type="text" name="users[1].sex">
address<input type="text" name="users[1].address"><br>
<input type="submit" value="提交">
</form>
<br>
<h3>封装map</h3>
<form action="<%=request.getContextPath() %>/recieve/recieveMap.do" method="post">
id:<input type="text" name="maps['id']">
username<input type="text" name="maps['name']">
<input type="submit" value="提交">
</form>
<br>
</body>
对应的类:
@Controller
@RequestMapping("/recieve")
public class RecieveAction {
// 因为WEB-INF下面的jsp不能直接方法,必需通过Controller跳转
@RequestMapping("goRecieveObject")
public String goRecieveObject(){
return "recieveObject";
}
@RequestMapping("/recieveObj.do")
public String recieveObject(HttpSession session,HttpServletRequest request){
System.out.println(request.getParameter("userName"));
return "userList";
}
//封装int类型
@RequestMapping("recieveInt")
public String recieveInt(Integer id){
System.out.println("接收到的参数是"+id);
return "userList";
}
//封装Stirng
@RequestMapping("recieveStr")
public String recieveStr(String userName,Model model) throws UnsupportedEncodingException{
//get编码格式处理方式
String name = new String(userName.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("str:"+name);
model.addAttribute("msg", name);
return "userList";
}
//封装数组
@RequestMapping("recieveArr")
public String recieveArr(Integer[] likes,Model model){
System.out.println("str:"+likes);
model.addAttribute("msg", likes);
return "userList";
}
//接收对象
@RequestMapping("recieveUser")
public String recieveUser(User user,Model model){
System.out.println("str:"+user);
model.addAttribute("msg", user);
return "userList";
}
//接收包装类型
@RequestMapping("recieveUserVo")
public String recieveUserVo(UserVo vo,Model model){
System.out.println("str:"+vo.getUser());
model.addAttribute("msg", vo.getUser());
return "userList";
}
//接收List集合
@RequestMapping("recieveList")
public String recieveList(UserVo vo,Model model){
for(User user:vo.getUsers()){
System.out.println(user);
}
return "userList";
}
//接收List集合
@RequestMapping("recieveMap")
public String recieveMap(UserVo vo,Model model){
System.out.println(vo.getMaps());
return "userList";
}