学习笔记_J2EE_SpringMVC_01_入门

时间:2022-10-24 18:25:51

1.    概述

  笔者作为一个不太正经的不专业佛教信仰者,习惯了解事物的因果关系,所以概述就有点BBB...了。如果不喜欢这些的,请自行跳过概述章节,直接进入第二章的操作实践:2 入门示例。

1.1.   为什么学习SpringMVC

  以Java为例,在开发web项目的时候,之前所用的技术都是Servlet/JSP。

  这种方式,优点很明显:运行效率快,服务器负载小。

  但,缺点也很明显:代码冗余多,可维护性差,开发成本高。

  学习笔记_J2EE_SpringMVC_01_入门

  为了改善这些明显的缺点,基于面向对象编程思想和MVC设计理念,于是就有了WEB框架。

  而比较让行业普遍接受的通用性web框架是 Struts2 (Struts2 之前的和Struts2 的由来就不在此阐述了,具体的等更新Struts2 框架实践笔记事再说明)。

  学习笔记_J2EE_SpringMVC_01_入门

  Struts2 的出现大大降低了开发人员的开发成本,提高了开发效率。业界因此得以大量应用。

  但是随着时间的增长,Struts2 的臃肿与安全性,让开发人员感到了强烈的不适,然而他们只能忍着。

  面对日益迫切的轻量级需求,在诸多业界精英的努力下,Spring框架横空出世,而SpringMVC就包含于Spring之中。

  SpringMVC架构

学习笔记_J2EE_SpringMVC_01_入门

  SpringMVC 是类似于 Struts2 的一个 MVC 框架,在实际开发中,接收浏览器的请求响应,对数据进行处理,然后返回页面进行显示。

  实现了Struts2有的通用功能,运行效率比Struts2快,但是上手难度却比 Struts2 简单的多。

  而且由于 Struts2 所暴露出来的安全问题,SpringMVC 已经成为了大多数企业优先选择的框架。

1.2.   什么是SpringMVC

  

  说起SpringMVC,那就不得不说Spring了,上面我们已经了解到SpringMVC包含于Spring。所以学习SpringMVC的前提,必须对Spring有一定的掌握。

  所以在了解springMVC之前,来回顾一下Spring的结构图:

学习笔记_J2EE_SpringMVC_01_入门

  从上图可以看到spring的基本框架里面包含一个叫Spring Web MVC(红色框起来的那块)的组件,这个组件是Spring对于web的支撑组件(如果把spring看作是一个系统那么springMVC就是它的子系统),也就是SpringMVC。

  Spring的核心设计理念就是MVC设计思想,而SpringMVC其实是Spring框架内置的MVC实现。所以SpringMVC就是一个Spring内置的MVC子框架.或者称为模块。

  SpringMVC属于Spring基本架构里面的一个组成部分,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面,所以我们在后期和 Spring 进行整合的时候,几乎不需要别的什么配置。

  SpringMVC的特点:  

  1. 支持直接一个方法对一请求
  2. 支持数据的自动封装
  3. 自动支持上传组件
  4. 自动支持JSON的转成

  

  Spring子框架:意味着SpringMVC的包都在Spring框架里面,也意味着不可脱离Spring单独使用。

  MVC:Model-View-Control (模型-视图-控制器),这是一种解决页面代码(视图代码)和后台代码分离的设计思想!!

   如要了解Spring的基本使用,请看博文:学习笔记_J2EE_Spring 系列

1.3.   SpringMVC配置流程图

 学习笔记_J2EE_SpringMVC_01_入门

概念说明:

  1. 核心控制器:因为SpringMVC为了实现一个请求对一个方法这个功能,所以必须需要一个Web组件来拦截所有请求。这个拦截并且处理所有请求的Web组件称为核心控制器。
  2. 业务控制器(Controller),在SpringMVC经过核心控制器跳转到一个处理自身需求业务的普通类,这个类称为业务控制器。

配置流程图说明:

  1. 我们必须在网站的入口(web.xml,WEB描述符),配置一个核心控制器,拦截所有的的请求
  2. 核心控制器通过加载Spring配置文件,获得请求路径对应业务控制器的方法
  3. 业务控制器的方法返回一个ModelAndView的对象给核心控制器
  4. 核心控制器根据业务控制器再加载配置的视图解释器跳转到对应的返回视图

    SpringMVC请求响应具体流程:
    (1)首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
    (2)DispatcherServlet——>HandlerMapping,处理器映射器将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象;
    (3)DispatcherServlet——>HandlerAdapter,处理器适配器将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
    (4)HandlerAdapter——>调用处理器相应功能处理方法,并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
    (5)ModelAndView对象(Model部分是业务对象返回的模型数据,View部分为逻辑视图名)——> ViewResolver, 视图解析器将把逻辑视图名解析为具体的View;
    (6)View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构;
    (7)返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

2.      入门示例

2.1.   配置流程说明

第一步:导入包

第二步:构建一个请求,编写请求页面

第三步:配置核心控制器

第四步:构建一个业务控制器

第五步:编写Spring配置文件

第六步:编写一个返回页面

2.2.   配置流程-基于XML的配置

1.导入包

                                       学习笔记_J2EE_SpringMVC_01_入门

                            

2.创建一个请求的发送页面 index.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>Insert title here</title>

</head>

<body>

<a href="${pageContext.request.contextPath }/print.do">say hello</a>

</body>

</html>

3.在web.xml配置核心控制器

<?xml version="1.0" encoding="UTF-8"?>

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

<!-- 核心控制器 -->

  <servlet>

  <servlet-name>dispatcherServlet</servlet-name>

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!-- 指定配置文件的路径 -->
    <init-param>
      <!-- 注意:任何框架的参数名都可以在代码里面找到 -->
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>

  </servlet>

  <servlet-mapping>

  <servlet-name>dispatcherServlet</servlet-name>

  <!-- 请求的后缀是do -->

  <url-pattern>*.do</url-pattern>

  </servlet-mapping>

  <welcome-file-list>
  <welcome-file>index.html</welcome-file>
  <welcome-file>index.htm</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  <welcome-file>default.html</welcome-file>
  <welcome-file>default.htm</welcome-file>
  <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

</web-app>

4.创建一个业务控制器  HelloController

package cn.slm.controller;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

/**

* 业务控制器,必须继承一个类MultiActionController或它的父类

*

*/

public class HelloController extends MultiActionController {

/**

* 执行方法的参数是固定.HttpServletRequest request,HttpServletResponse response

*/

public ModelAndView print(HttpServletRequest request,HttpServletResponse response){

System.out.println("-你好世界!-");

ModelAndView mv=new ModelAndView();

//设置返回的视图

mv.setViewName("/hello.jsp");

mv.addObject("msg", "李白");

return mv;

}

}

5.创建一个Spring的配置文件 spring-mvc.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">

<!-- 请求路径与业务控制器的执行方法的关系 -->

<!-- 请求与执行方法的规则:

1. SpringMVC会根据请求的名字:/print.do的print,去自动找到print这个方法

-->

<bean name="/print.do" class="cn.slm.controller.HelloController"></bean>

<!-- 2.视图解释器,不用配置.默认已经配置了jsp视图解释器了 -->

</beans>

注意:默认的Spring配置文件放在WEB-INF下,名为{servlet-name}-servlet.xml

{servlet-name}指的是,核心控制器配置的名字

如:dispatcherServlet-servlet.xml

<servlet>

<servlet-name>dispatcherServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

</servlet>

6.创建一个返回的视图页面 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>Insert title here</title>

</head>

<body>

${msg },欢迎您!

</body>

</html>

3.      总结

  从上面的代码来看,虽然实现了正常的访问处理功能,但对比Struts2,除了支撑包需要的较少,似乎感觉不到任何比Struts2好的地方。除此以外还有一下缺点:

  1. 业务控制器需要继承一个类或事项一个接口(这种设计称为入侵性的设计),优秀的设计不需要继承任何东西的!也就是说分离的不彻底。
  2. 业务控制器方法的参数是固定的,不人性化,我们希望可以做到需要什么参数就加什么参数,而不写死它。适用性不强。
  3. 返回的路径为什么要用一个ModelAndView对象这么麻烦, 而不能返回一个字符串?

  SpringMVC基于XML的配置是SpringMVC的第一版,发行在spring2.5里面. 非常难用。所以这并不是它流行起来的原因。

  原因在于,对于上述问题,Spring团队很快就接受社区的建议,对SpringMVC做出了重大的修改.发布了Spring3.0版本,解决了但不止于上述的所有问题。

    其中最大修改就是将原来基于XML的配置,修改为基于注解,大大减少了需要编写的代码和文件,并让代码更易编写。

  关于注解的实现方式,请阅读下一篇博文: