SpringMVC框架简介

时间:2024-04-07 08:33:07

前言

现在由于功能以及业务的复杂性,大部分系统从技术上就拆分开为前后端分离,单体应用我都很少没接触了,导致现在对springMVC那套都忘记了很多东西,因此这篇文章在来回忆一下SpringMVC这个框架;很多时候因为业务的需求,本地功能不是很大,以后扩展性也不多,主要访问就几个业务员或者技术维护系统,就考虑单体应用,并不需要复杂,怎么简单怎么来就行,快速开发一套系统。

MVC模式

MVC(Model-View-Controller)模式是一种常用的软件架构模式,用于分离应用程序的业务逻辑、用户界面和数据模型。

在MVC模式中,应用程序被分为三个核心部分:

  1. 模型(Model):负责处理应用程序的数据逻辑,包括数据的读取、写入、更新和删除。模型通常是应用程序中的数据对象或数据库的接口。

  2. 视图(View):负责显示应用程序的用户界面,包括各种UI元素和用户交互。视图是应用程序中用户可以看到和操作的部分。

  3. 控制器(Controller):负责处理用户输入和整个应用程序的控制流程。控制器接收用户输入并调用模型或视图来响应用户操作。它将用户输入转化为对模型的操作,然后更新视图以反映新的状态。

MVC模式的优点包括:

  1. 分离关注点:MVC模式允许开发人员将应用程序的不同部分分开开发,使得代码更易于理解和维护。

  2. 可重用性:由于模型、视图和控制器之间的分离,可以更容易地重用这些组件,以构建不同的应用程序或模块。

  3. 可测试性:由于模型、视图和控制器的独立性,可以更容易地编写和运行单元测试,以确保每个组件的正确性。

MVC模式可以应用于各种各样的应用程序,包括Web应用程序、桌面应用程序和移动应用程序等。

对于MVC模式,业务开发人员主要精力,或者说业务操作,主要放在控制器上操作,或者说专注于控制器就行。

SpringMVC框架

mybatis ---解决java代码和sql语句之间的耦合---代替DAO层

Spring ---解决了业务层和其他各层之间的耦合---优化Service层

SpringMVC---解决了java代码和servlet之间的耦合---代替servlet(SpringMVC本质还是Servlet,实现了对Servlet解耦)

我们在使用servlet初期的时候发现,每一个请求都对应一个servlet ,如果有100个请求,这个时候就需要写100个servlet,这样一来就 会造成servlet的数量太多,尽管后期进行了Servlet合并,但是任然是手动进行的,耦合度太高了。

使用servlet进行数据接受的时候,比较的麻烦

并且springMVC是基于spring 开发的,这个完整的生态链,以及扩展性,促使我们不得不用springMVC.强大的拦截器,aop 对象的生命周期,我们确实用这个框架用的很爽的感觉

1.Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。

SpringMVC和Spring关系

1.SpringMVC是Spring framework的子框架.

2.SpringMVC运行后形成自己的容器.Spring也有自己的容器. ​ 2.1 称Spring的容器和SpringMVC的容器是父子容器

3.SpringMVC就是比直接使用Spring多了spring-webmvc-xxx.jar

4.在环境搭建时,区分开父子容器. ​ 4.1 直观表现:Spring和SpringMVC的内容可以配置在一个配置文件中.区分不开父子容器.可能导致出现问题:例如声明式事务绑定无 效(不报错,还没有效果.) ​ 4.2 处理办法:Spring的东西配置一个配置文件中,SpringMVC的东西配在一个文件中.

2.Spring MVC是一个基于MVC的web框架,Spring MVC分离了控制器,模型对象,过滤器以及处理程序对象的角色,这种分离让他们更 容易进行定制。

3.Spring MVC 3.0 后全面超越Struts2,成为最优秀的MVC框架

2.Spring MVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口

4.采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性

5.进行更简洁的Web层的开发

6.天生与Spring框架集成(如:IOC容器,AOP等)

7.能简单的进行web层的单元测试

8.支持灵活的URL到页面控制器的映射

9.非常容易与其他试图技术集成,

执行流程

流程描述

当用户发起请求后,执行DiapacherServlet,如果是JSP直接调用jsp页面.如果不是JSP,DiapacherServlet调用HandlerMapping判断请求URL是否合法,如果URL不存在报错,如果URL存在使用HandlerAdapter调用具体的HandlerMethod,当Handler执行完成后会返回ModelAndView,会被ViewResovler解析,调用具体的物理视图. 最终响应给客户端浏览器.

SpringMVC环境搭建

创建maven web项目

1.New Project  点击Maven 先勾选Create from archetype 选择org.apache.maven.archetypes:maven-archetype-webapp
2.设置项目名称
3.创建完成后,手动添加resources和java目录

添加依赖

<dependencies>
    <!--进行junit单元测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

	<!--Spring的5大核心jar包 -->
    <!--依赖于commons-logging日志管理 -->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>

    <!--提供了框架的基本组成部分,包括IOC 和 DI-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.1.6.RELEASE</version>
    </dependency>

    <!-- 提供了BeanFactory-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.1.6.RELEASE</version>
    </dependency>

    <!--上下文配置对象,提供一个框架式的对象访问方式-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.1.6.RELEASE</version>
    </dependency>

    <!--提供了强大的表达式语言-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>4.1.6.RELEASE</version>
    </dependency>

    <!--springMVC的jar包-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.1.6.RELEASE</version>
    </dependency>
    
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.1.6.RELEASE</version>
    </dependency>
    
    <!--java web依赖 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.3</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
    </dependency>

    <!-- jstl表达式 -->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>

  </dependencies>

web.xml

<web-app version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <display-name>Archetype Created Web Application</display-name>
    <!--设置欢迎页 -->
    <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

	<!--配置前端控制器,拦截的是以do结尾的url -->
    <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- 自启动-在启动tomcat时立即加载对应的Servlet -->
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>*.do</url-pattern>
    </servlet-mapping>

  </web-app>

创建Spring核心配置文件

1.在WEB-INF下

2.新建名字叫:<servlet-name>-servlet.xml配置文件,并配置内容

==说明:<servlet-name>-servlet.xml 的意思是:如果web.xml中,<servlet-name>springmvc</servlet-name>那么创建的Spring框架的核心配置文件名就叫做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: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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 设置注解扫描路径 -->
    <context:component-scan base-package="com.controller"></context:component-scan>
	<!-- 默认加载注解处理器映射器和处理器适配器及很多的参数绑定 -->
	<mvc:annotation-driven/>
</beans>

编写控制器

@Controller
public class UserController {

   @RequestMapping("/show")
    public ModelAndView show(HttpServletRequest request){
        ModelAndView mv=new ModelAndView();
        String name=request.getParameter("username");
        request.setAttribute("uname",name);
        mv.setViewName("show.jsp");
        return mv;
    }
}

创建index.jsp页面

<body>
    <form action="reg.do" method="post">
        用户名:<input type="text" name="username"><br/>
        密码:<input type="password" name="password"/><br/>
        <input type="submit" value="提交">
    </form>
</body>

九大内置对象和四大作用域

九大内置对象

类型 对象名 描述 获取对象
HttpServletRequest request 请求对象 方法参数
HttpServletResponse response 响应对象 方法参数
HttpSession session 会话对象 req.getSession();
ServletContext application 应用程序对象 getServletContext()
PrintWriter out 输出对象 res.getWriter();
Exception out 异常对象
PageContext pageContext 页面上下文对象
ServletConfig config 配置对象
Object page 当前页面对象

输出对象(2):

out , response

作用域对象(4):

pageContext ,request , session , application

打酱油对象(3):

exception , config , page

四大作用域对象

1.九大内置对象中可以在特定情况下传递内容 ​

2.四大作用域对象: ​

      1 application: 整个应用程序任何时间内容 ​

      2 session:一次会话 ​ 浏览器关闭无效 ​ 超过默认tomcat中设置的Session时间 ​ 代码手动设置的有效时间 session.setMaxInactiveInterval(123); ​

      3 request:一次请求,只要跳转必须使用转发才能继续传递 ​

      4 pageContext : 当前页面内 ​

3.常用方法 ​

        1 setAttribute();设置值 ​

        2 getAttribute();获取值 ​

        3 removeAttribute();删除某个值 ​

        4.其他可能使用方法: ​

                1 application.getRealPath(“/”);获取到参数的真实全路径(发布到tomcat后的路径) ​

                2 request.getRequestURL();获取请求路径. ​

                 3 request.getPrameter();获取请求参数 ​

                4 request.setCharacterEncoding(“utf-8”);设置请求编码

                ​5 response.setContentType(“text/html;charset=utf-8”);设置响应头中响应内容.        

映射请求

SpringMVC 使用 @RequestMapping 注解为控制器指定可以处理哪些URL请求

@RequestMapping修饰类

注解@RequestMapping修饰类,提供初步的请求映射信息,相对于WEB应用的跟目录。

如果在类名前,使用了注解@RequestMapping,那么在处理器的方法里,在进行页面跳转的时候:

如果不经过视图解析器,那就要在跳转页面名的前面 加上“ / ”,表示页面的跳转位置从项目根目录开始;

如果没加“ /” 的意思是,以上面的例子来说,那么页面的跳转位置是从items这个逻辑文件夹开始!

@RequestMapping修饰方法

  

1.@RequestMapping("/show.do")

===加 / 是当前工程下,不加默认也是当前工程下

2.@RequestMapping(value={"show.do",”reg.do“})

===表示两个url请求都可以进入此控制器的此方法里。

===如果value的值只有一个的话,不需要加{}

===如果@RequestMapping注解里只有value这一个属性的话,并且该value属性还只有一个值的话,value也可以省去。如 上面的1。

3.@RequestMapping(value={"show.do",”reg.do“} ,method={RequestMethod.POST})

===value 和method两个属性之间使用 逗号,隔开

===method={RequestMethod.POST} 表示当前方法只能处理POST请求,若缺省,则get/post都可以处理。

4.对请求的参数加以限制:

@RequestMapping(value={"show.do",”reg.do“} ,params={”参数名1“,”参数名2“})

===表示当前方法请求参数中,必须有参数名叫 参数名1 和 参数名2 这两个参数。

@RequestMapping(value={"show.do",”reg.do“} ,params={”参数名1=value1“,”参数名2“})

===表示当前方法请求参数中,必须有参数名叫 参数名1 和 参数名2 这两个参数,并且参数1的值必须为value1。

5.headers属性:作为了解

指定request中必须包含某些指定的header值,才能让该方法处理请求。

@RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=凤凰网")

===表示仅处理request的header中包含了指定“Refer”请求头和对应值为“http://www.ifeng.com/”的请求;

返回值类型

controller 方法的返回值有三种:

A.ModelAndView

B.String

C.void

拦截器

1.拦截器和 过滤器的区别和联系:

联系:都是在进入目标代码前,提前做一些其他的事情。

区别:过滤器:----依赖于Servlet,在web.xml中进行配置

----函数回调实现的。

拦截器: ----依赖于MVC框架,在ApplicationContext.xml中进行配置

----本质拦截器是反射实现的。

-----过滤器能做的活,拦截器都能完成。----使用拦截器比较多。

执行顺序: 过滤器 拦截器 控制器

public class MYHandler implements HandlerInterceptor {

@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("执行完控制器的方法后,执行的拦截器方法。。。。");
	
}
	
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		
		System.out.println("请求已经进入到控制器了,但是还没有执行完控制器的时候,回到拦截器里来,执行该方法。");
}
	
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
	
		System.out.println("进入控制器方法前,要执行的拦截器方法。。。。。");
		//返回值:返回值为true----说明,符合通过条件,可以进行进入到控制器里。
		//      返回值为 false----说明:不符合通过条件,拦截此次请求。  不在继续进入控制器。     
		return false;
}
}

配置拦截器

  <!-- 配置拦截器 -->
  <mvc:interceptors>
  	<mvc:interceptor>
  	  <mvc:mapping path="/**"/>  <!-- /表示项目根目录;** 项目下任意路径以及任意子路径; 拦截所有请求路径 -->
 	  <mvc:exclude-mapping path="/index.do"/>   <!-- 放行请求路径 -->
 	  <mvc:exclude-mapping path="/reg.do"/>
 	  <mvc:exclude-mapping path="/login.do"/>
  	  <bean class="com.msb.handler.MYHandler"></bean>
  	</mvc:interceptor>
  </mvc:interceptors>