初认SpringMVC

  目录

  • 介绍Spring
  • 介绍Spring Framework
  • IOC 和AOP
  • Spring MVC介绍
  • Hello World

  Spring 

  Spring Framework    Spring框架(Spring:一般都是指这个)

  Spring boot       Spring快速开发框架

  Spring Cloud     Spring 微服务

  


  Spring FrameWork 七大核心模块

  • Spring Core : 核心容器提供与Spring 框架基本功能。核心容器的主要组件时BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(loc)

  模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

  • Spring Context:Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如 JNDL, EJB, 电子邮件,国际化,校验和调度功能。
  • Spring AOP:通过配置管理特征,Spring AOP 模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何对象AOP。Spring

  AOP 模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。

  • Spring DAO: JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常结构层次简化了错误处理。并且

  极大的降低了需要编写的异常代码数量(例如打开连接和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。

  • Spring ORM: Spring框架插入若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO,Hibernate和IBatis SQL Map。所有这些都遵从Spring的通用事务和DAO

  异常层次结构。

  • Spring Web:Web 上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文。所以,Spring框架支持与Jakarta Struts的集成。

  WEB模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

  • Spring Web MVC:mvc框架是一个全功能的构建Web应用程序的mvc的实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括JSP POL iText。

  

 

 

   


  对应的JDK版本

  • 适用于Spring Framework5.x的JDK8+
  • 用于Spring Framework 4.x的JDK6+
  • JDK 5+ for Spring Framework 3.x

 

 


  IOC和AOP

  • IOC,控制反转

   不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务器连接,但在配置文件中描述哪一个组件需要那一项服务。容器(在Spring框架中是IOC容器)负责将这些联系在一起。

  • AOP,面向切面编程

   AOP是一种编程技术,它允许程序员在横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。


  Spring  Web MVC 是什么?

  Spring Web MVC :是一种基于java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了mvc架构模式的思想,将web层进行职责解耦,基于请求驱动就是指的使用请求-响应模型,框架的目的就是帮我们简化开发,Spring Web MVC也就是要简化我们日常对WEB的开发 

  Spring  Web MVC能帮我们做什么

  • 让我们能非常简单的设计出干净的Web层和薄薄的Web层(web层就是controoler层)。
  • 进行更简洁的Web层开发。
  • 天生与Spring框架集成(如IOC容器,AOP等)。
  • 提供强大的约定大于配置的锲约式的编程支持。
  • 能简单的支持web层的单元测试。
  • 支持灵活的URL到页面控制层的映射。
  • 非常容易与其他视图集成,如Velocity. FreeMarker 等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构化实现,因此很容易被其它框架使用)。
  • 非常灵活的数据验证,格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定的框架API。
  • 提供一套强大的JSP标签库,简化jsp开发。
  • 支持的灵活本地化,主题等解析。
  • 更加简单的异常处理。
  • 对静态资源的支持。
  • 支持Restful风格。

   


  Web开发中的请求-响应模式

  

 

 

   因此,在web的世界里:都是Web客户发起请求,Web服务器接受,处理并响应。

  一般Web服务器是不能主动通知Web客户端更新内容。

  虽然现在有些技术如服务器推(如Comet),还有现在的HEML5 ,websocket可以实现web服务器主动通知Web客户端。

 

  SpringMVC 工作原理

  

 

 

   上面这张图很重要,希望大家能好好看。

 


  第一个例子 Hello World!

  下载spring框架jar (我使用的版本是 4.x)

  依赖jar包:

  1》Spring框架框架依赖的jar包:需要添加Apache commons logging 日志,此处使用的是commons.logging-1.1.1.jar.

  2》需要添加jstl标签库支持,此处使用的是jstl-1.1.2.jar.

  百度网盘:链接:https://pan.baidu.com/s/1oEcAcTXs8dpRRPHpwz1LCw    提取码:4idj    (包括依赖的jar也在里面)

  

  代码:

  1,新建一个web项目

  在web.xml文件中配置 

<servlet>
      <servlet-name>demo1</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>demo1</servlet-name>
      <url-pattern>/</url-pattern>
  </servlet-mapping>

  自此请求已交给Spring Web MVC 框架处理,因此我们需要配置Spring 的配置文件,默认DispatcherServlet 会加载WEB-INF/[DispatcherServlet 的servelt的名字 ]-servelt.xml配置文件。

  本例子为 WEB-INF/demo1-servlet.xml。

 

  在Spring配置文件中(demo1-servlet.xml)配置ViewResolver(视图解析器)demo1-servlet.xml文件需要放在WEB-INF下

<!-- ViewResolver 视图解析器  -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <!-- 映射视图路径 -->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!-- 映射视图后缀 -->
    <property name="suffix" value=".jsp"/>
</bean>
InternalResourceViewResolver :用于支持Servlet,jsp视图解析
viewClass:JstlView表示 JSP 模板页面需要使用 JSTL 标签库,classpath中必须包含jstl的相关jar包
(如果想换其他模板引擎,就修改这里,如:freemarker)
prefix和suffix:查找视图页面的前缀和后缀(前缀【逻辑视图名】后缀),比如传进来的逻辑视图名为hello,则该jsp视图页面应该存放在“WEB-INF/JSP/HELLO.JSP”.

 

 开发处理器/页面控制器(也在demo1-servlet.xml中配置)

<!-- 配置处理器 --> <bean name="/hello" class="indi.xiaoen.demo1.web.HelloWorldController"/>

 

  name:表示如果请求的URL为 “上下文/hello”,则将会交给该bean进行处理。

  class:为自定义控制器的类路径。

 

  控制器类:HelloWorldControoler  

/** 控制器实现 Controller接口 */
public class HelloWorldController implements Controller {

    /**
     * 重写 handleRequest 方法
     */
    @Override
    public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws
            Exception {
        //1、收集参数、验证参数
        //2、绑定参数到命令对象
        //3、将命令对象传入业务对象进行业务处理
        //4、选择下一个页面
        ModelAndView mv = new ModelAndView();
        //添加模型数据 可以是任意的POJO对象
        mv.addObject("message", "Hello World!");
        //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
        mv.setViewName("hello");
        return mv;
    }
}

  

  开发视图页面

  创建/WEB-INF/jsp/hello.jsp 视图界面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Hello World</title>
</head>
<body>
    是否获取到了Request 里的message :${requestScope.message}<br>
    是否获取到了Session 里的message :${sessionScope.message}
</body>
</html>

 

  ModelAndView.addObject 作用范围是:request

 

  

  运行项目

  • 地址栏输入:http://localhost:8080/demo1/hello
  • 看是否看到hello world

  

 

 


  ModelAndView

  • 控制器处理方法的返回值如果结果为:ModelAndView,则其既包含视图信息,也包含模型数据信息。
  • 添加数据模型:
ModelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObjects(Map<String, ?> modelMap)
  • 设计视图

 

void setViewName(String viewName)
void setView(View view)

 


  运行步骤

  

1、 首先用户发送请求 http://localhost:8080/demo1/hello——>web 容器,web 容器根据“/hello”路径映射到 DispatcherServlet(url-pattern 为/)进行处理; 

2、 DispatcherServlet——>BeanNameUrlHandlerMapping 进行请求到处理的映射,BeanNameUrlHandlerMapping 将 “/hello”路径直接映射到名字为“/hello”的 Bean 进行处理,即 HelloWorldController,BeanNameUrlHandlerMapping 将其包装为 HandlerExecutionChain(只包括 HelloWorldController 处理器,没有拦截器); 

3、 DispatcherServlet——> SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter 将 HandlerExecutionChain 中的处理器(HelloWorldController)适配为 SimpleControllerHandlerAdapter;

 4、 SimpleControllerHandlerAdapter — — > HelloWorldController 处理器 功 能 处 理 方 法 的 调 用 , SimpleControllerHandlerAdapter 将会调用处理器的 handleRequest 方法进行功能处理,该处理方法返回一 个 ModelAndView 给 DispatcherServlet; 

5、 hello(ModelAndView 的逻辑视图名)——>InternalResourceViewResolver, InternalResourceViewResolver 使用 JstlView,具体视图页面在/WEB-INF/jsp/hello.jsp; 

6、 JstlView(/WEB-INF/jsp/hello.jsp)——>渲染,将在处理器传入的模型数据(message=HelloWorld!)在视图中展示出 来;
 
7、 返回控制权给 DispatcherServlet,由 DispatcherServlet 返回响应给用户,到此一个流程结束。

 

 

  


  POST中文乱码解决方案(wen.xml文件中配置)

<!--使用Spring框架自带的字符过滤器-->
<filter>
 <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>

  

 ok ,希望大家好好看。然后有疑问可以评价或加我微信18179068936来咨询。谢谢大家!

 

posted @ 2019-09-25 20:22  听~风在北边  阅读(195)  评论(0编辑  收藏  举报