[学习笔记] SpringMVC之初识SpringMVC
# 学习 # · 2021-02-16
MVC设计模式
1、MVC设计模式:是软件工程中的一种软件架构模式,它强制性地使软件系统的输入、处理和输出分开,把软件系统分为三个基本部分,即模型(Model)、视图(View)、控制器(Controller)。
(1)视图(View):负责格式化数据并把他们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。对应组件:JSP/HTML。
(2)控制器(Controller):负责接收并转发请求,对请求进行处理后指派视图并响应结果并发送给客户端。对应组件:Servlet。
(3)模型(Model):拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作。对应组件:JavaBean(Service+Dao+POJO)。
2、Model 1时代:在WEB早期的开发中,通常采用的都是Model1。在Model1中,主要分为两层,视图层和模型层。
(1)Model1优点:架构简单,比较适合小型项目开发。
(2)Model1缺点:JSP职责不单一,职责过重,不便于维护。
3、Model 2时代:Model2把一个项目分成三部分,包括视图、控制、模型。
4、MVC的处理流程:
(1)执行流程:用户发请求、Servlet接收请求数据,并调用对应的业务逻辑方法、业务处理完毕,返回更新后的数据给servlet、servlet转向到JSP,由JSP来渲染页面、响应给前端更新后的页面。
(2)Controller控制器:取得表单数据、调用业务逻辑、转向指定的页面。
(3)Model模型:业务逻辑、保存数据的状态。
(4)View视图:显示页面。
5、MVC的优点:完美的系统架构 = 松耦合+高重用性+高扩展性
(1)多视图共享一个模型,大大提高代码的可重用性。
(2)MVC三个模块相互独立,松耦合架构。
(3)控制器提高了应用程序的灵活性和可配置性。
(4)有利于软件工程化管理。
6、MVC的缺点:
(1)原理复杂。
(2)增加了系统结构和实现的复杂性。
(3)视图对模型数据的低效率访问。
初识Spring MVC
1、Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架,它本质上相当于 Servlet。Spring MVC作为控制器来简历模型与视图的数据交互,是结构最清晰的MVC Model2实现。
2、Spring MVC框架的特点:
(1)清晰地角色划分。
(2)灵活的配置功能。
(3)提供了大量的控制器接口和实现类。
(4)真正做到与View层的实现无关(JSP、Velocity、Xslt等)。
(5)国际化支持。
(6)面向接口编程。
(7)Spring提供了Web应用开发的一整套流程,不仅仅是MVC,他们之间可以很方便的结合一起。
3、Spring MVC搭建方法之配置版:
(1)新建Maven项目,导入相关依赖jar包,并添加Web Application支持。
(2)在web.xml中配置Servlet,定义DispatcherServlet。
<!-- 配置Spring MVC的核心控制器DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 为DispatcherServlet关联一个springmvc的配置文件:<servlet-name>-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 标记容器在启动的时候就加载此DispatcherServlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- / 匹配所有的请求,不包括.jsp-->
<!-- /* 匹配所有的请求,包括.jsp-->
<url-pattern>/</url-pattern>
</servlet-mapping>
(3)创建Spring MVC的配置文件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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--
prefix:前缀
suffix:后缀
通过配置前后缀,将视图逻辑名解析为/WEB-INF/jsp/<viewName>.jsp
-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
(4)创建控制器HelloController:
package com.demo.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController extends AbstractController {
protected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//ModelAndView 模型和视图
ModelAndView mv = new ModelAndView();
//【业务代码】封装对象,放在ModelAndView中
mv.addObject("msg","Hello SpringMVC!");
//【视图跳转】封装要跳转的视图,放在ModelAndView中
mv.setViewName("index"); //视图文件位置:/WEB-INF/jsp/index.jsp
return mv;
}
}
(5)注册Bean:
<bean id="/hello" class="com.demo.controller.HelloController"></bean>
(6)创建视图页面(index.jsp):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>index</title></head>
<body>
${msg}
</body>
</html>
(7)部署运行测试:链接/hello访问测试。
4、Spring MVC框架的请求处理流程:
(1)用户发送请求到前端控制器(DispatcherServlet),前端控制器根据请求的信息决定选择哪个页面控制器进行处理,并把请求委托给它,即Servlet控制器的控制逻辑部分。
(2)页面控制器接收到请求后,进行业务处理,处理完毕后返回一个ModelAndView(模型数据和逻辑视图名)。
(3)前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的真正视图,并把模型数据传入一遍将视图渲染展示。
(4)前端控制器再次收回控制权,将响应结果返回给用户。
5、Spring MVC的执行原理:
(1)DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
(2)HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
(3)HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器。
(4)HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
(5)HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
(6)Handler让具体的Controller执行。
(7)Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
(8)HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
(9)DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
(10)视图解析器将解析的逻辑视图名传给DispatcherServlet。
(11)DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
(12)最终视图呈现给用户。
6、Spring MVC搭建方法之注解版:
(1)配置web.xml,注册DispatcherServlet并关联SpringMVC的配置文件。
(2)添加Spring MVC配置文件。
<?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">
<!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
<context:component-scan base-package="com.demo.controller"/>
<!-- 让Spring MVC不处理静态资源 -->
<mvc:default-servlet-handler />
<!--
自动注册DefaultAnnotationHandlerMapping(处理器映射)和AnnotationMethodHandlerAdapter(处理器适配器)
一键式配置,通过注解的方式进行Spring MVC开发。
-->
<mvc:annotation-driven />
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
(3)创建控制器HelloController:
@Controller
public class HelloController {
//RequestMapping表示用哪个url来对应(此处:"/index")
@RequestMapping("/hello")
public String hello(Model model){
//封装数据
model.addAttribute("msg","Hello SpringMVC Two New Action!");
//返回视图名称
return "index";
};
}
(4)创建视图层,并配置Tomcat测试运行。
参数传递
1、View-Controller的参数传递:
(1)方法一:将Controller方法中参数直接入参。
//访问路径:http://localhost:8022/hello?username=小红
@RequestMapping("/hello")
public String hello(@RequestParam String username){
System.out.println("Hello," + username);
return "index";
}
(2)方法二:通过请求URL进行映射。
//访问路径1:http://localhost:8022/SpringMVC_war_exploded/hello/?username=小红
//访问路径2:http://localhost:8022/SpringMVC_war_exploded/hello?username=小红
@RequestMapping({"/hello","/"})
public String hello(@RequestParam String username){
System.out.println("Hello," + username);
return "index";
}
(3)方法三:通过请求参数、请求方法进行映射。
//访问路径:http://localhost:8022/SpringMVC_war_exploded/hello?username=小红
/**
* value:请求URL
* method:请求方法,GET/POST/PUT/DELETE等
* params:请求参数
*/
@RequestMapping(value="/hello",method=RequestMethod.GET,params="username")
public String hello(@RequestParam String username){
System.out.println("Hello," + username);
return "index";
}
(4)方法四:借助@ RequestParam
注解指定其对应的请求参数。
//访问路径:http://localhost:8022/SpringMVC_war_exploded/hello?username=小红
@RequestMapping(value="/hello")
/**
* value:参数名
* required:是否必须,默认为true,表示请求中必须包含对应的参数名,若不存在将抛出异常。
*/
public String hello(@RequestParam(value="username",required=false) String username){
System.out.println("Hello," + username);
return "index";
}
2、Controller-View的参数传递
(1)ModelAndView:设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面。
/**
* 参数传递:controller to view -(ModelAndView)
* @param username
* @return
*/
@RequestMapping("/hello")
public ModelAndView index(String username){
System.out.println("Hello," + username);
/**
* ①添加模型数据
* ModelAndView addObject(String key, Object value)
* ModelAndView addAllObjects(Map<String,?> modelMap)
*/
ModelAndView mView = new ModelAndView();
mView.addObject("username", username);
/**
* ②设置视图
* void setView(View view)
* void SrtViewName(String viewName)
*/
mView.setViewName("index");
return mView;
}
/**
* 参数传递:controller to view -(ModelAndView)
* 在视图页面通过EL表达式读取
*/
<h1>username(key:username) --> ${username}</h1>
(2)Model:
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, Model model){
//封装要显示到视图中的数据
//相当于req.setAttribute("name",name);
model.addAttribute("msg",name);
System.out.println(name);
return "index";
}
(3)Map:
@RequestMapping("/hello")
public String index(String username,Map<String, Object> model){
model.put("username", username);
return "hello";
}
3、无视图解析器的情况下实现转发和重定向:
(1)转发方法一:
@RequestMapping("/test1")
public String test1(){
//转发到index2.jsp
return "/index2.jsp";
}
(2)转发方法二:
@RequestMapping("/test2")
public String test2(){
//转发到index2.jsp
return "forward:/index2.jsp";
}
(3)重定向方法一:
@RequestMapping("/test3")
public String test3(){
//重定向到index2.jsp
return "redirect:/index.jsp";
}
如若转载,请注明出处:一木林多 - https://www.l5v.cn/archives/221/
评论