栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > 架构设计

SpringMVC体系结构and处理请求控制器

架构设计 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC体系结构and处理请求控制器

SpringMVC MVC设计模式:

首先先熟悉回忆一下MVC设计模式, 了解

MVC分层设计模式:

它是软件架构模式的一种, 强制的将软件系统的: 输入 处理 输出
把软件系统分为三个部分:模型(Model) 视图(View) 控制器(Controller)

视图(View):
负责: 数据展示 用户交互 数据验证 界面设计 …等功能;
组件: JSP 或 HTML文件…
控制器(Controller):
负责:接收并转发请求,对请求进行处理,做出对于的响应操作;
组件:Servlet…
模型(Model):是应用程序的主体部分
负责:数据业务逻辑操作处理, 实现数据的存取操作… JavaBean(Java类)
组件:业务逻辑(Service) 与数据库交互(Dao) 贯穿各层的数据模型,实体类(POJO/以前我都是entity)


JSP Model1

只有视图 和 模型…

当业务流程为简单的时候,可以把控制器的功能交给视图来实现, 这种模式被称为 JSP Model1
总结:
Model1 在一定基础上,实现了MVC :JSP( 控制层和视图层 ) + JavaBean为模型层;
但 其中JSP 身兼数职, 又要负责数据展示, 还要注意 业务流程控制, 结构较为混乱…
而且 也不是程序适合的 松耦合架构模式 当业务流程复杂时候不推荐使用

JSP Model2

这种模式就是 JSP+Servlet+JavaBean
(哈哈哈,以前学过现在在学框架,有点忘记了有对这方面的笔记,在oneNote上… 还做了一个小型电商项目)

相比 Model1 , Model2是将控制层(Servlet)单独划分出来负责业务流程的控制, 接收请求 创建所需的JavaBean实例;
并将处理后的数据,响应给视图层(JSP)
总结:
相比 Model1 , Model2结构更清晰 JSP不在一个人抗下所有 是一个相对 松耦合 的架构模式;
所以除非项目非常简单使用 Model1, 一般都使用 Model2

MVC处理过程


MVC 优点
多视图共享一个模型,大大提高代码的可重用性
MVC三个模块相互独立,松耦合架构
控制器提高了应用程序的灵活性和可配置性
有利于软件工程化管理
完美的系统架构 = 松耦合+高重用性+高扩展性
MVC 缺点
原理复杂
增加了系统结构和实现的复杂性
视图对模型数据的低效率访问 (中间还要经过一个控制器~必定会影响…)
so:它并不适合, 小型项目,花费大量时间将 MVC应用到并不是很大的 应用程序中通常 "得不偿失"


智勇建议你可以:细品细品


SpringMVC 介绍及环境搭建:

ok, 了解了MVC设计模式之后就可以更容易的, 接收SpringMVC 框架了
SpringMCV 就是 Spring框架提供一个用于 Web应用开发中的一个框架;
SpringMVC框架介绍:
在MVC设计模式中, SpringMVC 就是作为控制器( Controller ) 来建立模型与视图的数据交互; 结构最清晰的MVC Model2实现
SpringMVC 框架采用松耦合 可拔插的组件结构, 相比其它 MVC框架 ,具有高度可扩展性;

SpringMVC环境搭建:

在MyElicpse 中新建Web ProJect项目后配置 SpringMVC框架;
Spring MVC框架搭建步骤:
下载jar文件并导入工程 :(Myelicpse工具有自带的类库~ )
spring-web-3.2.13.RELEASE.jar Web应用开发的使用 Spring框架所需的 核心类;
spring-webmvc-3.2.13.RELEASE.jar 框架相关的类,包含框架的 Servlets WebMVC 以及对控制器 和 视图的支持;
配置文件在web.xml中配置< Servlet> 元素;
创建Spring MVC的配置文件(也是Spring 核心配置文件)
创建Controller-处理请求的控制器BeanNameUrlHandlerMapping (相当于以前写的 Servlet ;)
创建View-JSP
部署运行

正片开始!

项目连接

配置文件: 在web.xml中配置< Servlet> 元素;
web.xml




	
	
		
		mvc
		org.springframework.web.servlet.DispatcherServlet 
		
		
			contextConfigLocation
			classpath:applicationContext.xml
		
		
		1
	
	
	
	
		mvc 
		/ 	  
	
	



	
	 
	
		
		
		
	
	

最后奉上 index.jsp 可以运行了

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<% 
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>



  
     
    
    My JSP 'index.jsp' starting page
	
	
	    
	
	
	
  
  
  
     

${msg }


验证, 提交后程序经过了 控制器处理后,再次呈现给用户看…


注解操作 + 参数传递;

上述示例通过 BeanNameUrlHandlerMapping 访问完成了请求与 Contorller 之间的映射关系;
那如果存在很多映射则就要写很多的 … Spring容器提供了注解~
修改Demo…
applicationContext.xml




	
	  
	
	

	
	 
	
		 
		
		
	
	

HelloController.java

package com.wsm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller   					//@Controller是为了让Spring IOC容器初始化时自动扫描到;
//@RequestMapping("/WSM")		//@RequestMapping 声明在类上;  (对应示例二,示例一注释即可..)
public class HelloController {
//示例一 
	 @RequestMapping("/Hollo1.html") 
	public ModelAndView Hollo(String name){				//方法参数 name 和表单name 一样可以自动匹配,如果不一样会返回null; 
		//控制台打印输出显示								//所以一定要注意参数名一致哦!
		System.out.println("进入Hello:Controller");
		
		name = "Hello:"+name;							//参数拼接
		//创建一个 ModelAndView 对象;
		ModelAndView mav = new ModelAndView();	
		mav.addObject("msg",name);						//存储
		mav.setViewName("index");						//返回响应
		return mav;
	}
	 
	 
	 
// 这里开始使用注解修改Demo

 	 
//示例二
	 @RequestMapping(value="/Hollo2.html")  			
	 //可以看到 类/方法上各有一个注解; 使用时 URL: localhost:8080/项目名/WSM/Hollo2.html 指向该控制器; 方便分类操作,不同的控制器类针对不同的增删改查.. 
	public String Hollo2(@RequestParam(value="name",required=false) String na,Model model){													
		na = "Hello:"+na;								//参数拼接
		//创建一个 ModelAndView 对象;
		ModelAndView mav = new ModelAndView();	
		mav.addObject("msg",na);						//这里方法返回的是String 而不是 ModelAndView 所以存储在这里的数据,页面并不会在接收到了...
		//参数对象 model
		model.addAttribute("msg",na);					//将数据存储在 model中,返回给页面接收;
		return "forward:../index.jsp";					//因为在类上加:@RequestMapping("/WSM")	会在根目录上默认加上 /WSM 所以需要 ../返回上一级目录;
		// 可以使用  return "redirect:页面" 或 return "forward:页面" 来完成 重定向/转发...
		// return 指定转发/重定向 ,跳转页面需要  文件后缀名,它不会在经过,前端控制器; 进行后缀的添加; 而是直接进行了重定向/转发;
		// 也不一定是非要带上 后缀。
		// 重定向就相当于是重新请求了一次:当前目录 + "重定向的页面:xxxx";  URL地址发送变化;
		// 转发  就相当于在当前目录下请求:当前目录 + "转发  的页面:xxxx";  URL地址不发生变化;
		// 经过web.xml 的DispatcherServlet 因为 / 所以 .jsp 会不在经过控制器直接去找页面. 如果不加 .jsp 还是会回到 控制中走~一遍 (亲测~)
	 }	 
	 // Model对象方法;
	 //	addAttribute(String,Object);		通过 key-value 方式来存储数值,默认存储request 中; 	
	 // addAttribute(Object); 				没有指定 key 直接存储value 方法会默认根据对象类型来作为 key; eg: String类型 key默认为 string 页面通过 ${string} 取值;
}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>



  
     
    
    My JSP 'index.jsp' starting page
	
	
	    
	
	
	
  
  
  
     

${msg }

参数传递(Controller to View)

1.ModelAndView

方法返回值为一个 ModelAndView 类型对象;
就像实例一通过对应的方法, 进行传参, 视图名称… 至前端控制器——视图解析器… 最终返回浏览器

2.Model

方法返回值是String 参数 Model 类型 (就像实例二一样)

3.Map

方法返回值是String 参数 Map< String,Object > 类型
实例中没有就是和 实例二类似, 参数为 Map< String,Object > ;
方法中通过 Map 对象.put 存储key-value

解释:

SpringMVC 的控制器的处理方法中 如果有 Map或Model 参数, 就会将请求内的 “隐含模型对象” 传递给这些形参,
因此可以通过 Map 和 Model 形参对模型中数据进行读写操作, (个人比较喜欢使用Model)
隐藏模型: SpringMVC 在调用方法前会 创建出一个隐含的模型对象,作为模型的存储容器;
如果传入参数为 Model ,SpringMVC 会将隐含模型传递给这些 参数存储;
开发者可以通过 参数访问到模型中的所有数据,当然也可往模型中新增属性数据。。。。

感谢观看-_-

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/911404.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号