java Spring MVC4环境搭建实例详解(步骤)
作者:东陆之滇 发布时间:2021-11-17 05:08:08
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跑不起来,可以到原文留言提出意见。
来源:http://blog.csdn.net/zixiao217
猜你喜欢
- java解析json数组最简单的json数组[ { &quo
- Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相
- PowerPoint幻灯片中可插入公式,用于在幻灯片放映时演示相关内容的论证、推算的依据,能有效地为演讲者提供论述的数据支撑。通过后端程序代
- 当我们在登录像QQ邮箱这种大多数的网站,往往在登录按键上会有下次自动登录这个选项,勾选后登录成功,在一段时间内,即便退出浏览器或者服务器重启
- 目录Sonar概述一、 搭建sona服务二、idea配置三、 配置maven的setting.xml文件四、idea中 mvn sonar:
- 利用闲余时间想自己搭建一个springboo
- 在[高并发Java 二] 多线程基础中,我们已经初步提到了基本的线程同步操作。这次要提到的是在并发包中的同步控制工具。1. 各种同步控制工具
- 开放端口安全组没开放端口是原罪!!!导致好多BUG费时费力。Hbase悄悄 * 的用了好多端口,比如被我抓到的42239,直接搜索报错药不对症
- 前言本文简单介绍抽象类,接口以及它们的异同点,另附简单的代码举例。一、抽象类是什么?在 Java 语言中使用 abstract class
- 本文是vhr系列的第十二篇,项目地址 https://github.com/lenve/vhr邮件发送也是一个老生常谈的问题了,代码虽然简单
- Lombok简介和其他语言相比,Java经常因为不必要的冗长被批评。Lombok提供了一系列注解用以在后台生成模板代码,将其从你的类中删除,
- 三态的基本概念1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据。用new创建的对象,它没有持久化,
- 本文实例讲述了C#逐行读取文件的方法。分享给大家供大家参考。具体如下:这里使用C#逐行读取文件,对于大文件的读取非常有用。StreamRea
- 什么是ShiroApache Shiro是一个功能强大且易于使用的Java安全框架,它执行身份验证、授权、加密和会话管理。借助Shiro易于
- 前言最近因为同事bean配置的问题导致生产环境往错误的redis实例写入大量的数据,差点搞挂redis。经过快速的问题定位,发现是同事新增一
- 这几天用winform做了一个设置壁纸的小工具, 为图片添加当月的日历并设为壁纸,可以手动设置壁纸,也可以定时设置壁纸,最主要的特点是在图片
- 什么是Java泛型Java 泛型(generics)是 Jdk 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制, 该机制允许程序
- 本文是基于springboot完成测试测试代码地址如下:https://github.com/Dr-Water/springboot-act
- SpringMVC中的 * 用于拦截控制器方法的执行,执行在Controller前后,和视图渲染完成后。如下图所示:一、创建 * 继承Han
- [LeetCode] 205. Isomorphic Strings 同构字符串Given two strings s