SpringMVC札集(01)——SpringMVC入门完整详细示例(上)

原创 2017年07月25日 09:54:24

自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


几年前写过一些后台,当时见得最多的就是SSH(Spring + Struts + Hibernate)。现在重新回到这里的时候发现大家谈论得更多不再是SSH的使用及其源码剖析;反而是关于它的弊端,比如Hibernate的过度设计和Struts的安全漏洞。在一些中小项目中,人们更多的去选用SSM(Spring+SpringMVC+MyBatis)或者使用SpringMVC+MyBatis的组合。嗯哼,既然时代的潮流不可阻挡,我又何必螳臂当车;现要拾起后台的开发技能,那就跳过Struts和Hibernate直接从SpringMVC作为切入点吧。


MVC

在讨论SpringMVC之前,我们先来看看MVC

关于MVC无需多说;一图胜千言,或许就是这个理。


SpringMVC

关于SpringMVC的执行流程,请参见上图;小结如下:

  • 01 浏览器向服务器发起请求
  • 02 DispatcherServlet接收到请求后利用处理器映射器HandlerMapping寻找Handler
  • 03 HandlerMapping返回一个包含Handler和拦截器的HandlerExecutionChain给DispatcherServlet
  • 04 DispatcherServlet调用处理器适配器HandlerAdapter执行Handler
  • 05 HandlerAdapter执行Handler(Controller)得到ModelAndView
  • 06 Handler返回ModelAndView至HandlerAdapter
  • 07 HandlerAdapter返回ModelAndView至DispatcherServlet
  • 08 DispatcherServlet调用视图解析器ViewResolver
  • 09 ViewResolver解析出ModelAndView中的View返回至DispatcherServlet
  • 10 DispatcherServlet将View与ModelAndView中的Model结合进行视图渲染
  • 11 试图渲染结果返回至DispatcherServlet
  • 12 DispatcherServlet应答浏览器

SpringMVC在MVC的大框架下做了一些调整:C和V基本不变,分别负责调度和视图渲染;但是把M拆开了,拆成了处理器映射器HandlerMapping,处理器适配器HandlerAdapter,视图解析器ViewResolver。这些组件有什么用呢?该怎么使用呢?请看如下示例。


SpringMVC入门示例

按照国际惯例,我们来写一个SpringMVC版本的Hello world.

第一步:准备jar包

这里写图片描述

第二步:配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

在web.xml文件中配置DispatcherServlet。嗯哼,发现了没有,它和我们之前配置servlet是非常的类似。

第三步:实现Controller

/** 
* @author 原创作者:谷哥的小弟
* @blog   博客地址:http://blog.csdn.net/lfdfhl
* @time   创建时间:2017年7月22日 下午4:57:04 
* @info   描述信息:自定义Controller
*/
package cn.com;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class MyController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("helloSpringMVC", "欢迎您学习SpringMVC");
        modelAndView.setViewName("test");
        return modelAndView;
    }

}

此处实现org.springframework.web.servlet.mvc.Controller接口并在handleRequest()方法中返回一个ModelAndView至DispatcherServlet;在这利用addObject()方法给View设置数据,数据的key是helloSpringMVC;我们会在稍后的步骤中取出该值。

请注意第19行代码:

modelAndView.setViewName(“test”);

在此设置的View的名字为test,表示响应的页面。这就有点奇怪了,不是应该是一个包含了test的url么,比如xxx/ooo/xxx/test.jsp么?别急,这里仅仅是一个逻辑视图,它所对应的物理视图的完整路径会在springmvc.xml中进行配置的。

第四步:配置springmvc.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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.2.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <!-- 处理器映射器 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>


    <!-- 处理器适配器 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>


    <!-- 自定义Controller -->
    <bean id="myController" name="/welcome.do" class="cn.com.MyController"></bean>


    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsps/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

在该springmvc.xml中配置了处理器映射器HandlerMapping,处理器适配器HandlerAdapter,视图解析器ViewResolver以及我们的Controller。其中,此处配置的HandlerMapping和HandlerAdapter均是SpringMVC的默认配置。其实,此处的HandlerMapping只要瞅瞅它的名字就很好理解它的作用:BeanNameUrlHandlerMapping——根据bean的name属性所设置的url去执行对应的Controller;正如此例:

<bean id="myController" name="/welcome.do" class="cn.com.MyController"></bean>

在Controller的配置为其设置name属性为/welcome.do,当用户在浏览器中输入http://xxx.ooo.xxx/welcome.do时BeanNameUrlHandlerMapping就会判断它所映射到的Controller是MyController,于是将该Controller返回至DispatcherServlet;再由SimpleControllerHandlerAdapter执行该Controller。至于,ViewResolver的配置,请注意前缀和后缀的配置;将它们与Controller中的逻辑视图一起组拼起来构成一个物理视图,比如:/WEB-INF/jsps/test.jsp;它就是用户最终看到的View。

第五步:编写jsp

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>SpringMVC_HelloWorld</title>
<style type="text/css">
p {
    font-size: 40px;
    font-family: 宋体;
    color: red;
    background-color: pink;
}
</style>
</head>
<body>
    <p>${helloSpringMVC}</p>
    <p>原创作者:谷哥的小弟</p>
    <p>博客地址:http://blog.csdn.net/lfdfhl</p>
</body>
</html>

在此编译一个非常简单的jsp页面,请注意第16行代码:

${helloSpringMVC}

获取第三步传递过来的数据!

第六步:部署验证

将项目部署至Tomcat,然后在浏览器中输入

http://localhost:8081/SpringMVC01/welcome.do

回车后,即可见test.jsp

这里写图片描述

最后,附上本示例的项目结构:

这里写图片描述


梳理小结

好了,代码写完了,测试也OK了。现在结合执行流程图和该示例再来梳理一下SpringMVC:

  • 第一步:浏览器发起请求
  • 第二步:DispatcherServlet接收到请求后利用HandlerMapping寻找Handler
  • 第三步:HandlerAdapter执行Handler并返回ModelAndView至DispatcherServlet
  • 第四步:DispatcherServlet进行视图渲染并将结果返回给浏览器

在该篇文章中展示了一个完整的SpringMVC入门示例。其实,比代码更重要的是原理。比如,自己梳理清楚了框架的执行流程,那么我们写起代码来思路也会清晰很多。

版权声明:本文原创作者:谷哥的小弟 http://blog.csdn.net/lfdfhl 举报

相关文章推荐

tomcat启动提示java.lang.UnsatisfiedLinkError: D:\soft\devTool\apache-tomcat-7.0.57\bin\tcnative-1.dll: C

tomcat启动提示java.lang.UnsatisfiedLinkError:

eclipse默认指向WebContent目录修改为webRoot 设置说明

在使用eclipse 中 , 相信大家比我更是轻车熟路了 ( 我平常一般用 Intellij idea 的 ), 下面讲解一下在 eclipse web项目中 , 如何设置 webroot 目录指向...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

linux下tomcat无法访问问题(换一种说法:无法访问8080端口)

有时候linux下的tomcat其他机器无法访问,比如主机无法访问linux虚拟机的tomcat,这是因为tocat的端口,linux没有对外开放,所以只能localhost访问,但是别的机器访问不了...

SpringMVC札集(03)——基于注解的SpringMVC入门完整详细示例

嗯哼,上次写了个基于xml配置的SpringMVC的HelloWorld。今天来实现基于注解的SpringMVC的HelloWorld。总体思路和之前是一样的,只不过实现的方式不同。所以,在本篇博客中...

SpringMVC札集(04)——SpringMVC传递参数

在本篇博客中主要讲述jsp页面向SpringMVC传递参数,例如:int,String,对象,包装类型,数组,List,Map。为清楚阐述每种类型的变量传递,故针对每种类型参数的传递都单独写了对应的测...

WebRoot与WebContent区别

引言:         在MyEclipse中创建web项目后,web程序的根目录文件夹是WebRoot,而创建dynam web project时候,web程序的根 目录文件夹是WebC...

SpringMVC札集(06)——转发和重定向

SpringMVC的转发与重定向

SpringMVC札集(05)——SpringMVC参数回显

在上一篇博客中,我们从index.jsp传递参数到Controller中;Controller收到参数后再跳转到test.jsp。即执行流程为:index.jsp ---> Controller --...

SpringMVC札集(02)——SpringMVC入门完整详细示例(下)

在上一篇中,我们完成了一个SpringMVC的HelloWorld。在这个示例中我们使用的系统默认的HandlerMapping和HandlerAdapter即BeanNameUrlHandlerMa...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)