java Spring MVC4环境搭建实例详解(步骤)

spring WEB MVC框架提供了一个MVC(model-view-controller)模型-视图-控制器的结构和组件,利用它可以开发更灵活、松耦合的web应用。MVC模式使得整个服务应用的各部分(控制逻辑、业务逻辑、UI界面展示)分离开来,使它们之间的耦合性更低。

Model
模型层封装了整个应用程序的数据对象并且将会持久化POJO
View
视图层负责渲染模型层的数据,一般最终使用HTML展示到用户浏览器或移动设备终端
Controller
控制层负责处理用户的请求、构建合适的模型数据并将其传输到视图层进行渲染

SpringMVC核心-DispatcherServlet分发器

SpringMVC框架是设计用来处理所有的HTTP请求和响应的,它的核心是围绕着一个分发器DispatcherServlet。在Spring Web MVC DispatcherServlet的请求处理流程如下图所示:

以下是对应一个HTTP请求时分发器的处理流程:

1.接收到一个Http请求后,DispatcherServlet 告诉映射处理器HandlerMapping 去调用相应的Controller(控制器)。

2.然后Controller控制器根据接收到的的请求调用相应的Service服务方法,基于请求所使用的GET或PUT等其它请求方式。Service方法将会根据业务逻辑设置模型数据并且返回一个视图给DispatcherServlet分发器。

3.DispatcherServlet 分发器将会请求视图解析器ViewResolver去处理找到该请求对应的已经定义的视图view。

4.一旦视图确定了,DispatcherServlet 会将模型数据传输给该视图view,最终渲染到用户浏览设备上。

上述提到的所有组件:映射处理器HandlerMapping, 控制器Controller 和视图解析器ViewResolver都是WebApplicationContext 的组成部分。WebApplicationContext 扩展了ApplicationContext ,但是为web应用程序提供了更多的必要的特性。

SpringMVC需要的配置要求

为了将用户的请求映射到分发器DispatcherServlet 去处理,需要在web.xml中配置URL映射。
以下是一个声明和映射了Demo应用HelloWeb的分发器DispatcherServlet 的配置示例(就是servlet映射配置):

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

 <display-name>Spring MVC Application</display-name>

 <!--声明一个servlet配置-->
 <servlet>
 <servlet-name>HelloWeb</servlet-name>
 <servlet-class>
  org.springframework.web.servlet.DispatcherServlet
 </servlet-class>
 <load-on-startup>1</load-on-startup>
 </servlet>

 <!--配置servlet与处理请求的映射模式-->
 <servlet-mapping>
 <servlet-name>HelloWeb</servlet-name>
 <url-pattern>/</url-pattern>
 </servlet-mapping>

</web-app>

首先: web.xml文件根据servlet规范放在WebContent/WEB-INF目录下,使用Mavan风格的放在scr/main/webapp/WEB-INF目录下。

一旦初始化HelloWeb的的DispatcherServlet,框架将会尝试从WebContent/WEB-INF目录下的[servlet-name]-servlet.xml配置文件加载应用上下文application context。在这个Demo中,会去加载 HelloWeb-servlet.xml文件。这是默认行为,我们也可以指定加载配置文件的位置,这点后面会有实例示范。

然后: <\servlet-mapping>标签指明什么样的URL才会被DispatcherServlet映射处理。这里配置的是所有的HTTP请求都会被HelloWeb的DispatcherServlet映射处理

如果你不想使用默认的文件名[servlet-name]-servlet.xml和默认的context加载位置WebContent/WEB-INF(或者scr/main/webapp/WEB-INF),你也可以在web.xml中通过添加一个servlet监听器ContextLoaderListener来自定义指定文件名和位置。示例配置如下:

<web-app...>

<!-------- DispatcherServlet的定义,上面的配置这里略过了----->
....

<!--指定上下文配置文件的位置,指定classpath下的spring-mvc-config.xml文件
使用Maven风格,可以将该文件放在src/main/resources目录下
-->
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath:spring-mvc-config.xml</param-value>
</context-param>
<!--增加监听器-->
<listener>
 <listener-class>
 org.springframework.web.context.ContextLoaderListener
 </listener-class>
</listener>
</web-app>

接下来: 使用自定义servlet上下文配置后,我们来看看spring-mvc-config.xml文件的配置信息,该文件放在src/main/resources目录下,文末会展示Demo结构视图:

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 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="org.byron4j" />

 <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>

 <mvc:resources mapping="/resources/**" location="/resources/" />

 <mvc:annotation-driven />

</beans>

这里有几点比较重要:

[servlet-name]-servlet.xml文件(现在我们自定义为spring-mvc-config.xml) 会创建已经定义的bean, 会覆盖其他位置已经定义的同名的全局的bean,这点是血泪的教训,参见mapper注入失败问题解决

<context:component-scan...> 标签用于激活Spring MVC注解扫描功能,像@Controller、 @RequestMapping等

InternalResourceViewResolver 将使用下面定义的规则来解析视图名称。 按照我们配置的规则:一个名为”hello”的逻辑视图的实现将会是/WEB-INF/jsp/目录下的hello.jsp文件来渲染。

接下来: 我们编写一些实际使用的组件例如Controller, Model and View。

定义一个Controller

DispatcherServlet代表请求通过控制器来执行该请求的指定业务处理功能。@Controller 注解表明该类是一个控制器。@RequestMapping注解用于请求的URL映射到一个类或一个特定的处理方法

package org.byron4j.helloWeb;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Hello world!
 *
 */
@Controller
@RequestMapping("/hello")
public class HelloController{

 @RequestMapping(method = RequestMethod.GET)
 public String printHello(ModelMap model) {
 model.addAttribute("message", "Hello Spring MVC Framework!");
 return "hello";
 }

}

@Controller注解将一个类定义为Spring MVC 的控制器controller。 在这里@RequestMapping的第一个使用位置是表明这个Controller类的所有方法都是处理/hello请求的。 第二个位置的用法@RequestMapping(method = RequestMethod.GET) 表明printHello()方法作为这个Controller类的默认服务方法去处理HTTP的GET请求。你可以依葫芦画瓢定义一个方法处理同名的的URL的POST请求,试试,你仅仅需要在新方法中将@RequestMapping(method = RequestMethod.GET)替换为@RequestMapping(method = RequestMethod.POST)即可。

你也可以将上面的Controller替换成下面的的这种写法:

@Controller
public class HelloController{

 @RequestMapping(value = "/hello", method = RequestMethod.GET)
 public String printHello(ModelMap model) {
 model.addAttribute("message", "Hello Spring MVC Framework!");
 return "hello";
 }

}

功能是一样的。

@RequestMapping的value属性指明该方法仅仅映射处理的GET方式的请求/hello。 以下有几点比较重要:

你可以在Controller的处理方法中调用其他业务方法去处理业务逻辑。

基于定义的业务逻辑,你需要在该方法中创建一个模型对象。你可以设置不同的模型属性,这些属性可以让视图访问最终渲染给用户。这个demo中创建了一个包含”message”属性的模型对象。

一个定义的服务方法可以返回一个包含渲染模型的视图名字的字符串。这个demo返回的”hello” 作为一个逻辑视图的名字。

创建JSP视图

SpringMVC支持多种类型的视图显示技术。包括 JSP, HTML, PDF, Excel worksheets, XML, Velocity 末班, XSLT, JSON, Atom 和RSS feeds, JasperReports, Thymeleaf等等。这里我们使用jap视图, 在/WEB-INF/hello/jsp目录下创建一个hello.jsp:

<html>
 <head>
 <title>Hello Spring MVC</title>
 </head>
 <body>
 <h2>${message}</h2>
 </body>
</html>

这里的${message} 是Controller中模型对象设置的属性message的值。你还可以在你的视图中展示另外的其他属性。

demo最后自定义的web.xml:

<web-app 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"
 version="2.5">

 <display-name>Spring MVC Application</display-name>
 <welcome-file-list>
 <welcome-file>
  /index.jsp
 </welcome-file>
 </welcome-file-list>
 <!--声明一个servlet配置-->
 <servlet>
 <servlet-name>dispatcherServlet</servlet-name>
 <servlet-class>
  org.springframework.web.servlet.DispatcherServlet
 </servlet-class>
 <!-- 自定义servlet文件名、文件位置需要使用该参数配置 -->
 <init-param>
 <!-- 分发器拦截的上下文-contextConfigLocation|指定servlet context配置文件的位置 -->
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring-mvc-config.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
 </servlet>

 <!--配置servlet与处理请求的映射模式,会对所有*.jsp的后缀请求处理-->
 <servlet-mapping>
 <servlet-name>dispatcherServlet</servlet-name>
 <url-pattern>/</url-pattern>
 </servlet-mapping>

 <!--指定上下文配置文件的位置,指定classpath下的spring-mvc-config.xml文件
使用Maven风格,可以将该文件放在src/main/resources目录下
-->
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath:spring-mvc-config.xml</param-value>
</context-param>
<!--增加监听器-->
<listener>
 <listener-class>
 org.springframework.web.context.ContextLoaderListener
 </listener-class>
</listener>
</web-app>

demo项目的pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>org.byron4j</groupId>
 <artifactId>helloWeb</artifactId>
 <version>1.0.0-SNAPSHOT</version>
 <packaging>war</packaging>

 <name>helloWeb</name>
 <url>http://blog.csdn.net/zixiao217</url>

 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <spring.version>4.2.5.RELEASE</spring.version>
 <log4j.version>1.2.17</log4j.version>
 </properties>

 <dependencies>

 <!-- Spring -->
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>${spring.version}</version>
 </dependency>

 <!-- Log4j -->
 <dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>${log4j.version}</version>
 </dependency>

 <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
 <dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
  <version>2.5</version>
 </dependency>

 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
 </dependency>
 <dependency>
  <groupId>jstl</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
 </dependency>
 </dependencies>

 <build>
 <plugins>
  <plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.5.1</version>
  <configuration>
   <source>1.8</source>
   <target>1.8</target>
  </configuration>
  </plugin>
 </plugins>
 <finalName>helloWeb</finalName>
 </build>
</project>

以下是demo在eclipse的package explorer视图:

以下是demo在eclipse的navigator视图:

运行项目,在浏览器输入http://localhost:8080/helloWeb/hello,显示:

若参考本文编写第一个SpringMVC Demo跑不起来,可以到原文留言提出意见。

(0)

相关推荐

  • java Spring MVC4环境搭建实例详解(步骤)

    spring WEB MVC框架提供了一个MVC(model-view-controller)模型-视图-控制器的结构和组件,利用它可以开发更灵活.松耦合的web应用.MVC模式使得整个服务应用的各部分(控制逻辑.业务逻辑.UI界面展示)分离开来,使它们之间的耦合性更低. Model 模型层封装了整个应用程序的数据对象并且将会持久化POJO View 视图层负责渲染模型层的数据,一般最终使用HTML展示到用户浏览器或移动设备终端 Controller 控制层负责处理用户的请求.构建合适的模型数据

  • Java 获取服务器环境的实例详解

    Java 获取服务器环境的实例详解 废话不多说,直接上代码,代码中的注释写的比较清楚,请大家好好看, package com.rapido.utils; import java.util.Properties; /** * 获取服务器环境信息 * @author X-rapido * */ public class SystemDataUtil { public static Properties getSystemProperties() { Properties props = System

  • Java CountDownLatch完成异步回调实例详解

    Java CountDownLatch完成异步回调实例详解 实例代码: public class AsyncDemo { private static void doSomeTask() { System.out.println("Hello World"); } private static void onCompletion() { System.out.println("All tasks finished"); } public static void ma

  • SpringCloud2020版本配置与环境搭建教程详解

    1.maven父子工程搭建 项目使用maven工程搭建,下面是工程的结构图.SpringCloud2020是父工程,仅负责依赖的管理,eureka是注册中心的服务端,testclient是测试的客户端. 1.1 父工程pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu

  • redis debug环境搭建过程详解(使用clion)

    目录 概要 环境搭建的大体思路 windows下安装linux工具链 什么是make和cmake 安装c语言开发的ide 具体安装步骤 cygwin安装 clion安装及插件安装 克隆redis 代码 如何调试 如何调试redis-server 概要 最近写了spring系列,这个系列还在进行中,然后有些同学开始叫我大神,然后以为我各方面都比较厉害,当然了,我是有自知之明的,大佬大神什么的,当作一个称呼就好,如果真的以为自己就是大神,那可能就走偏了. 其实我不少方面都比较薄弱,比如redis.m

  • Java Spring Boot消息服务万字详解分析

    目录 消息服务概述 为什么要使用消息服务 异步处理 应用解耦 流量削峰 分布式事务管理 常用消息中间件介绍 ActiveMQ RabbitMQ RocketMQ RabbitMQ消息中间件 RabbitMQ简介 RabbitMQ工作模式介绍 Work queues(工作队列模式) Public/Subscribe(发布订阅模式) Routing(路由模式) Topics(通配符模式) RPC Headers RabbitMQ安装以及整合环境搭建 安装RabbitMQ 下载RabbitMQ 安装R

  • Shell执行/调用Java/Jar程序例子的实例详解

    Shell执行/调用Java/Jar程序例子的实例详解 前言: 最近要写一个独立的Java程序去监控Hadoop和Oozie,通过Shell去调用.写代码到现在也4年多了,貌似就从来没在生产环境中写过一个独立的Java程序,不是部署到Tomcat就是直接丢给Hadoop.于是参考Hadoop等开源环境,自己写了一个demo,并且可以通过Ant打包生成可运行的程序.所以这里有三步:Java程序,Shell,Ant      1.首先建立Java程序,由于是例子,所以这里很简单,只是输出传入参数的个

  • Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别?    总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上编译成class文件,而javascript则直接在浏览器上加载运行. 2.由第一点可看出,java代码需要编译,而javascript不需要编译. 3.从语言性质来说,java是一种高级编程语言,对变量检查要求严格,javascript只是一个简单的解释性的脚本语言,对变量检查及要求很弱.

  • Java Spring开发环境搭建及简单入门示例教程

    本文实例讲述了Java Spring开发环境搭建及简单入门示例.分享给大家供大家参考,具体如下: 前言 虽然之前用过Spring,但是今天试着去搭建依然遇到了困难,而且上网找教程,很多写的是在web里使用Spring MVC的示例,官方文档里的getting start一开始就讲原理去了(可能打开的方法不对).没办法,好不容易实验成功了,记下来免得自己以后麻烦. 添加依赖包 进入spring官网,切换到projects下点击 spring framework.官网上写的是以maven依赖的形式写

  • Android Studio开发环境搭建教程详解

    对于移动端这块,笔者之前一直都是进行iOS开发的,也从来没用过Java.但是因为进入了Google Android全国大学生移动互联网创新挑战赛(进入官网)的总决赛(笔者"西部计算机教育提升计划"的项目被直接推荐进入决赛),这个比赛要求一定要提交apk程序,所以我不得不赶紧学习一下Android开发了. 下面就对自己学习的过程做一个记录. 一.安装Android Studio 笔者用的计算机配置如下: Mac下安装Android Studio应该更简单一些,只需要下载一个Android

随机推荐