SpringMVC简介

Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分。

JavaEE三层架构

  1. 表现层 WEB层(采用JSP/Servlet/Struts2/SpringMVC技术):展示数据用的。
  2. 应用层 Service层(采用Bean/EJB技术):处理业务逻辑,一般if判断,循环之类。
  3. 数据层 Dao层(准确的说是数据接口,采用JDBC/Hibernate/Mybatis技术):保存数据和访问数据的。

解释下MVC们

SpringMVC架构

请求流程

  • 1、 用户发送请求至前端控制器DispatcherServlet
  • 2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  • 3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  • 4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
  • 5、 执行处理器(Controller,也叫后端控制器)。
  • 6、 Controller执行完成返回ModelAndView
  • 7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  • 8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
  • 9、 ViewReslover解析后返回具体View
  • 10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
  • 11、 DispatcherServlet响应用户

组件说明

DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

HandlerMapping:处理器映射器

HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

Handler:处理器

Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。

由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

HandlAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

下图是许多不同的适配器,最终都可以使用usb接口连接

ViewResolver:视图解析器

View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

View:视图

springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。

一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

一.SpringMVC搭建

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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--*****************配置各种 注解******************--><!-- 配置注解驱动(由于默认的已经过时),用于扫描RequestMapping等注解 --><mvc:annotation-driven /><!-- 扫描@Controler,@Service...   --><context:component-scan base-package="cn.x5456"/><!--视图解释器modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");  ==>  modelAndView.setViewName("itemList");--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean></beans>

3、配置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_3_1.xsd"version="3.1"><!-- 配置寻找的配置文件+监听器 --><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 前端控制器 --><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><!--1. /*  拦截所有   jsp  js png .css  真的全拦截   建议不使用2. *.action *.do 拦截以do action 结尾的请求     肯定能使用   ERP3. /  拦截所有 (不包括jsp) (包含.js .png.css)  强烈建议使用     前台 面向消费者  www.jd.com/search   /对静态资源放行--><url-pattern>*.action</url-pattern></servlet-mapping>
</web-app>

4、书写controller

// 将类交由Spring管理
@Controller
public class ItemsController {@Autowiredprivate ItemService itemService;// 配置请求的url@RequestMapping("/itemList.action")public ModelAndView queryItemList(){// 创建页面需要显示的商品数据List<Item> items = itemService.selectItemsList();ModelAndView modelAndView = new ModelAndView();// 放到request域中modelAndView.addObject("itemList",items);//modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");modelAndView.setViewName("itemList");return modelAndView;}

注:不要导错包

二.与Mybatis整合

1、配置与Mybatis整合的applicationContext.xml

<!-- ****************整合Mybatis**************** --><!-- 读取配置文件 -->
<context:property-placeholder location="classpath:db.properties"/><!-- 设置数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><property name="maxActive" value="10" /><property name="maxIdle" value="5" />
</bean><!-- 建立Mybatis的SQLSessionFactory工厂 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 注入连接池 --><property name="dataSource" ref="dataSource"/><!-- 核心配置文件的位置 --><property name="configLocation" value="classpath:sqlMapConfig.xml"/>
</bean><!-- Mapper动态代理开发   扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 基本包,会自动扫描子包 --><property name="basePackage" value="cn.x5456.dao"/>
</bean><!--******************配置 注解 事务********************--><!-- 配置事务核心管理器,封装了所有事务操作. 依赖于连接池 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" ><property name="dataSource" ref="dataSource" />
</bean><!-- 开启使用注解管理aop事务 -->
<tx:annotation-driven/>

2、配置sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 设置别名 --><typeAliases><!-- 指定扫描包,会把包内所有的类都设置别名,别名的名称就是类名,大小写不敏感 --><package name="cn.x5456.domain" /></typeAliases><mappers><package name="cn.x5456.dao"/>  <!--配置扫描mapper接口(一定要配)--></mappers></configuration>

3、db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=xxx

4、service层

ItemService.java

public interface ItemService {public List<Item> selectItemsList();
}

ItemServiceImpl.java

@Service
public class ItemServiceImpl implements ItemService {@Autowiredprivate ItemDao itemDao;public List<Item> selectItemsList() {List<Item> itemList = itemDao.findItemList();return itemList;}
}

5、Dao层

ItemDao.java

public interface ItemDao {List<Item> findItemList();
}

ItemDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.x5456.dao.ItemDao">   <!-- 将当前接口与接口绑定 --><!-- 查询所有订单 --><select id="findItemList" resultType="Item">select * from `item`</select></mapper>

三.接收参数

方式一:接收HttpServletRequest,HttpServletResponse,HttpSession, Model转Servlet时代的开发

// 获取与当前线程绑定的request,response,session,model
@RequestMapping("/itemEdit.action")
public ModelAndView itemEdit(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model){// 方式一:Servlet时代开发方式// 1.接受参数String id = request.getParameter("id");// 2.获取当前商品信息Item item = itemService.selectItem(Integer.parseInt(id));System.out.println(item);// 3.放到request域中ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("item",item);// 4.设置跳转的页面modelAndView.setViewName("editItem");return modelAndView;
}

方式二:直接接收参数

// 获取与当前线程绑定的request,response,session,model
@RequestMapping("/itemEdit.action")
public ModelAndView itemEdit(Integer id,HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model){// 方式二:直接接收参数,字段名必须和表单传来的一样// 1.接受参数//String id = request.getParameter("id");// 2.获取当前商品信息Item item = itemService.selectItem(id);System.out.println(item);// 3.放到request域中ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("item",item);// 4.设置跳转的页面modelAndView.setViewName("editItem");return modelAndView;
}

方式三:接收参数,封装到POJO中

// 获取与当前线程绑定的request,response,session,model
@RequestMapping("/itemEdit.action")
public ModelAndView itemEdit(Item itemPOJO,HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model){// 方式三:接收参数,封装到POJO中// 1.接受参数//String id = request.getParameter("id");// 2.获取当前商品信息Item item = itemService.selectItem(itemPOJO.getId());System.out.println(item);// 3.放到request域中ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("item",item);// 4.设置跳转的页面modelAndView.setViewName("editItem");return modelAndView;
}

四.其他

1、配置POST提交乱码问题

web.xml

<!-- 处理POST提交乱码问题 -->
<filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter><filter-mapping><filter-name>encoding</filter-name><url-pattern>*.action</url-pattern>
</filter-mapping>

2、配置转换器

applicationContext.xml

<!-- 配置注解驱动(由于默认的已经过时),用于扫描RequestMapping等注解 -->
<!-- 配置转换器 -->
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/><!-- 配置Conveter转换器  转换工厂 (日期、去掉前后空格)... -->
<bean id="conversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"><!-- 配置 多个转换器--><property name="converters"><list><!--只要是Date格式的,就走这个转换器(因为接受的是Date类型)--><bean class="cn.x5456.conversion.DateConveter"/></list></property>
</bean>

DateConveter.java

public class DateConveter implements Converter<String, Date> {  // Sting--页面传来的类型,Date--转换后类型@Overridepublic Date convert(String s) {if (s!=null&&!s.equals("")){try {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy:MM-dd HH_mm-ss");Date realDate = simpleDateFormat.parse(s);return realDate;} catch (ParseException e) {e.printStackTrace();}}return null;}
}

springmvc与struts2不同

1、 springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器。

2、 springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

3、 Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。Jsp视图解析器默认使用jstl。

转载于:https://www.cnblogs.com/x54256/p/8543134.html

SpringMVC——架构,搭建,SSM搭建,POST请求乱码问题,参数转换器相关推荐

  1. SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)

    SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一) 1. 前言 最近在写毕设过程中,重新梳理了一遍SSM框架,特此记录一下. 附上源码:https://gitee ...

  2. 软件工程课程设计·SOA架构搭建SSM框架的网上商城系统

    软件工程课程设计·SOA架构搭建SSM框架的网上商城系统 项目简介 本系统利用SSM框架.Dubbo框架.Maven模块化开发等技术开发的一个网上商城项目,主要包括订单系统模块.购物车系统模块.搜索系 ...

  3. eclipse maven 搭建 SSM(Spring+SpringMVC+MyBatis)开发环境 和 MyBatis 自动生成的 maven 插件配置

    最近研究java web开发,首先需要配置好开发环境,查阅网上各位大神的文章后搭建完成,记录下来作为备忘. 1.安装Maven Maven下载地址:http://maven.apache.org/do ...

  4. Spring+Mybatis+SpringMVC+Maven+MySql(SSM框架)搭建实例

    这篇文章我们来实现使用maven构建工具来搭建Spring+Mybatis+SpringMVC+MySql的框架搭建实例.工程下载 使用maven当然得配置有关环境了,不会配置的请看我前几篇文章,都有 ...

  5. idea搭建SSM项目这一篇就够了

    目录 1. 创建Maven项目 1.1 创建一个新的项目  (请先连接好网络) 1.2 选择maven --> 选择你的jdk版本 --> 勾选Create from archetype ...

  6. maven整合SSM搭建项目

    Maven整合SSM搭建项目 目录 一.概要. 2 1.1 Maven2 1.1.1 Maven的基本概念. 2 1.1.2 Maven的核心概念. 2 1.1.2 Maven的目标. 5 1.1.3 ...

  7. 使用maven搭建ssm框架的javaweb项目

    目前主流的javaweb项目,常会用到ssm(Spring+Spring MVC+Mybatis)框架来搭建项目的主体框架,本篇介绍搭建SSM框架的maven项目的实施流程.记之共享! 一.SSM框架 ...

  8. MyEclipse使用Maven创建web项目+搭建SSM框架教程

    MyEclipse使用Maven创建web项目+搭建SSM框架教程 博文中的代码:链接:http://pan.baidu.com/s/1o8tqIMI 密码:m3si 安装maven和配置 1.下载m ...

  9. 【建议收藏】手把手带你搭建SSM项目

    1.简介SSM SSM(Spring+SpringMVC+MyBatis) 框架集由Spring.MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容).常作为数据源较简单 ...

  10. 手把手教你SSM搭建Easymall电商项目 (二)

    SSM搭建Easymall电商项目 (二) 目录 SSM搭建Easymall电商项目 (二) 一.Easymall需求代码实现 1.测试类测试请求地址路径IndexController.java    ...

最新文章

  1. 最小生成树(kruskal+prime)
  2. rsync+shell脚本完成自动化
  3. “白痴“上帝视角调节反序列化链之CC2
  4. mysql数据库new和old_数据库触发器中new表和old表是什么意思?
  5. 工作144:时间戳格式化
  6. ActiveMQ消费者平滑关闭
  7. 受限玻尔兹曼机(RBM)与python在Tensorflow的实现
  8. 2021泗阳致远中学高考成绩查询,2021高考成绩什么时候发布?可通过哪些途径查询?...
  9. Grafana 中存在严重的未授权任意文件读取漏洞,已遭利用
  10. docker安装部署和常用命令
  11. 洛谷——P1219 [USACO1.5]八皇后 Checker Challenge
  12. Atitit.ide代码块折叠插件 eclipse
  13. tkinter 界面设计工具
  14. 服务器虚拟资源池,大型医院基于Hyper-V的虚拟化服务器资源池构建
  15. 新型材料集成墙面,到底“新”在哪里?
  16. Photoshop脚本 压缩并输出GIF图片
  17. 数据分析-数据分析报告
  18. 月份查询(指针数组)
  19. 你想要的宏基因组-微生物组知识全在这(1907)
  20. C版的迷你程序——快速排序算法

热门文章

  1. dlib android 识别时间,android dlib调用
  2. 计算机科学技术专业词汇,计算机专业一些单词
  3. 详述ArrayList类contains方法
  4. mysql数据库教程官网_数据库MySQL官方推荐教程-MySQL入门到删库
  5. C++ 编译运行报错 error: stray ‘\200’ in program 解决方案
  6. C++ boost锁的概述
  7. edi python_在不从edi运行的情况下调用python函数
  8. matlab图像分割基于小波变换,图小波变换在图像分割中的应用研究
  9. 基于SSM的猫头鹰物流网站
  10. linux apache支持ipv6,如何在Nginx和Apache中启用IPv6?