一、Spring-mvc
(一)概述
1)定义
MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活、松散耦合的 web 应用程序的组件。
2)作用域
controller控制层(servlet)
3)优缺点
MVC 模式导致了应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑)的分离,同时提供了在这些元素之间的松散耦合。
4)M-V-C
- 模型M封装了应用程序数据,并且通常它们由 POJO 组成。
- 视图V主要用于呈现模型数据,并且通常它生成客户端的浏览器可以解释的 HTML 输出。
- 控制器C主要用于处理用户请求,并且构建合适的模型并将其传递到视图呈现。
(二)执行过程
具体流程
- 收到一个 HTTP 请求后,DispatcherServlet 根据 HandlerMapping 来选择并且调用适当的控制器。
- 控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法。Service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中。
- DispatcherServlet 会从 ViewResolver 获取帮助,为请求检取定义视图。
- 一旦确定视图,DispatcherServlet 将把模型数据传递给视图,最后呈现在浏览器中。
大概流程
- 客户端发送相应的请求到
DispatcherServlet -
DispatcherServlet把请求给HandlerMapping -
handlerAdapter进行处理1 - 把这个
ModelAndView——>给你的DispatcherServlet——>给你的视图渲染器——>DispatcherServlet - 呈现在浏览器,用户看到一个好网页。
图解:
(三)实例:开发一个基础的springmvc
核心配置文件:①核心文件要配置到web.xml文件;②配置servlet
- 导入相关的jar包
- 核心xml文件
- 配置统一前缀(目录文件)。后缀(.jsp .html)
(四)代码及解析2
1)代码
- spring_mvc基础版图解
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_4_0.xsd"
version="4.0">
<!--开始配置servlet-->
<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-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--当你的请求地址为index.HTML时,就回到UserController-->
<!--<bean name="/index.html" class="com.offcn.controller.UserController"></bean>-->
<!--扫描controller下所有的包-->
<context:component-scan base-package="com.offcn.controller"/>
<!--开启注解驱动-->
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
UserController
package com.offcn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/*
*第一种方法:实现Controller接口
*/
@Controller
/*@RequestMapping("/userController")*/
public class UserController {
/*8080/userController/index*/
/*把页面的数据放到controller*/
/*代表请求的路径*/
/*有一个参数的注解*/
/*userName:第一个为这个代表你参数的键,第二个为值*/
/*method = RequestMethod:设置请求方式*/
/*@RequestMapping(value = "/index",params = {"userName"},method = RequestMethod.GET)*/
/*value = "/index/*.do":只要是index下面以.do结尾的都能匹配到*/
// @RequestMapping(value = "/index/*.do",params = {"userName"},method = RequestMethod.GET)
/*value 代表网页中拼接的键;required 代表是否必须拼接这个参数,false代表可以(或者不可以)拼接 true必须拼接*/
/*PathVariable:匹配uri上的任何参数,注解上的pid跟@RequestMapping(value ="")中的值一样*/
@RequestMapping(value = "/index/{pid}")
// public String index(@RequestParam(value = "userName",required = false) String userName){
// public String index(String userName){
public String index(@PathVariable String pid){
/*jsp——>Control*/
System.out.println(pid);
/*返回的界面*/
return "dolndex";
}
/*@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
return new ModelAndView("dolndex");
}*/
/*Control——>jsp*/
@RequestMapping("/toDolndex")
/*@RequestParam:注解可要可不要*/
public ModelAndView toDolndex(@RequestParam(value = "userName",required = false) String userName){
/*构建modelAndView*/
ModelAndView modelAndView = new ModelAndView();
/*把值放入modelAndView(以键值对的形式来传递)*/
modelAndView.addObject("userName",userName);
/*把跳转界面放到modelAndView里*/
modelAndView.setViewName("dolndex");
System.out.println("1234567667890");
return modelAndView;
}
/*返回要跳转的地址 view Model,这个Model不用实例化,直接传进去*/
@RequestMapping("/toDolndex1")
public String toDolndex1(String userName, Model model){
/*Model里面添加数据,以键值对的形式来传递*/
model.addAttribute("userNmae",userName);
System.out.println(userName);
return "dolndex";
}
/*通过map把数据传过去*/
@RequestMapping("/toDolndex2")
public String toDolndex2(String userName, Map<String,Object> map){
map.put("userName",userName);
return "dolndex";
}
/*
* 最终版
*
* */
@RequestMapping("/toUpdata")
public String toUpdata(
@RequestParam(value = "userName",required = false) String userName,
@RequestParam(value = "userPwd",required = true) String userPwd){
return "dolndex";
}
/*返回要跳转的地址 view Model,这个Model不用实例化,直接传进去*/
@RequestMapping("/toDolndex3")
public String toDolndex3(String userName, Model model){
/*Model里面添加数据,以键值对的形式来传递*/
model.addAttribute("userNmae",userName);
System.out.println(userName);
return "dolndex";
}
}
- 返回界面
<%--
Created by IntelliJ IDEA.
User: Dk502可分
Date: 2018/10/16
Time: 10:07
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${userName}
</body>
</html>
2)解析3
jsp——>Control
Control——>jsp
- ModelAndView
- @RequestParam:注解可要可不要
- 构建modelAndView
- 把值放入modelAndView(以键值对的形式来传递)
- 把跳转界面放到modelAndView里
①
@RequestMapping("/toDolndex")
public ModelAndView toDolndex(@RequestParam(value = "userName",required = false) String userName){
/*构建modelAndView*/
ModelAndView modelAndView = new ModelAndView();
/*把值放入modelAndView(以键值对的形式来传递)*/
modelAndView.addObject("userName",userName);
/*把跳转界面放到modelAndView里*/
modelAndView.setViewName("dolndex");
System.out.println("1234567667890");
return modelAndView;
}
②
@RequestMapping("/toDolndex1")
public String toDolndex(String userName, Model model){
/*Model里面添加数据,以键值对的形式来传递*/
model.addAttribute("userNmae",userName);
System.out.println(userName);
return "dolndex";
}
-
Model
- model,不用实例化
- 以键值对的形式把值通过model传进去
- 跳转界面
① 如需从界面拿值,则需要给方法传入参数
/*返回要跳转的地址 view Model,这个Model不用实例化,直接传进去*/
@RequestMapping("/toDolndex1")
public String toDolndex1(String userName, Model model){
/*Model里面添加数据,以键值对的形式来传递*/
model.addAttribute("userNmae",userName);
System.out.println(userName);
return "dolndex";
}
② 如需从数据库拿值,则不需给方法传入参数
@RequestMapping("/addUser")
public String addUser( Model model){
List<User> userList=new ArrayList<User>();
User user1 = new User(1,"asd","123");
User user2 = new User(2,"asd","123");
User user3 = new User(3,"asd","123");
userList.add(user1);
userList.add(user2);
userList.add(user3);
model.addAttribute("userList",userList);
return "userIndex";
}
- map集合
/*通过map把数据传过去*/
@RequestMapping("/toDolndex2")
public String toDolndex2(String userName, Map<String,Object> map){
map.put("userName",userName);
return "dolndex";
}
- RequestParam
@RequestMapping("/toUpdata")
public String toUpdata(
@RequestParam(value = "userName",required = false) String userName,
@RequestParam(value = "userPwd",required = true) String userPwd){
return "dolndex";
}
- 加粗的为最终版(常用+重要,需记住)
二、面试题4
- 什么是Spring MVC?
① Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一部分,它和Struts2一样都属于表现层的框架。
②MVC(Model模型 View 视图 Controller 控制器):这是一种软件架构思想,是一种开发模式,将软件划分为三种不同类型的模块,分别是模型,视图,和控制器。
③模型:用于封装业务逻辑处理(java类);
④视图:用于数据展现和操作界面(Servlet);
⑤控制器:用于协调视图和模型(jsp);
⑥处理流程:视图将请求发送给控制器,由控制器选择对应的模型来处理;模型将处理结果交给控制器,控制器选择合适的视图来展现处理结果; - Spring MVC的五大组键?
①前端控制器DispatcherServlet
②映射处理器HandlerMapping
③处理器Controller
④模型和视图ModelAndView
⑤视图解析器ViewResolver - SpringMVC中控制器的注解一般用哪个,有没有别的注解可以代替?
① 一般用@Controller注解,表示是表现层,不能使用别的注解代替。 -
@RequestMapping注解用在类上面有什么作用?
① 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。 - 基于注解的Spring MVC的应用编程步骤
① 导包Spring-webmvc,添加spring配置文件,配置前端控制器dispatcherServlet
② 创建Controller
③ 创建JSP
④ 在Spring的配置文件里面添加视图解析器、组建扫描、mvc注解扫描 - 待更新