这里有新鲜出炉的 Java 设计模式,程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称.
spring web MVC 框架提供了一个 MVC(model-view-controller)模型 - 视图 - 控制器的结构和组件,利用它可以开发更灵活,松耦合的 web 应用.MVC 模式使得整个服务应用的各部分 (控制逻辑,业务逻辑,UI 界面展示) 分离开来,使它们之间的耦合性更低
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 映射配置):
<!--声明一个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>
首先: web.xml 文件根据 servlet 规范放在 WebContent/WEB-INF 目录下,使用 Mavan 风格的放在 scr/main/webapp/WEB-INF 目录下.
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
一旦初始化 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>
接下来: 使用自定义 servlet 上下文配置后,我们来看看 spring-mvc-config.xml 文件的配置信息, 该文件放在 src/main/resources 目录下,文末会展示 Demo 结构视图:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
这里有几点比较重要:
<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 注入失败问题解决
标签用于激活 Spring MVC 注解扫描功能,像 @Controller, @RequestMapping 等
InternalResourceViewResolver 将使用下面定义的规则来解析视图名称. 按照我们配置的规则:一个名为 "hello" 的逻辑视图的实现将会是 / WEB-INF/jsp / 目录下的 hello.jsp 文件来渲染.
接下来: 我们编写一些实际使用的组件例如 Controller, Model and View.
定义一个 Controller
DispatcherServlet 代表请求通过控制器来执行该请求的指定业务处理功能.@Controller 注解表明该类是一个控制器.@RequestMapping 注解用于请求的 URL 映射到一个类或一个特定的处理方法
@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) 即可.
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 替换成下面的的这种写法:
功能是一样的.
@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:
这里的 ${message} 是 Controller 中模型对象设置的属性 message 的值.你还可以在你的视图中展示另外的其他属性.
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
demo 最后自定义的 web.xml:
<!--声明一个servlet配置-->
<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>
<init-param>
<!-- 分发器拦截的上下文-contextConfigLocation|指定servlet context配置文件的位置 -->
<!--配置servlet与处理请求的映射模式,会对所有*.jsp的后缀请求处理-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--指定上下文配置文件的位置,指定classpath下的spring-mvc-config.xml文件
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
使用Maven风格,可以将该文件放在src/main/resources目录下
<!--增加监听器-->
-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc-config.xml</param-value>
</context-param>
demo 项目的 pom.xml:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
<url>http://blog.csdn.net/zixiao217</url>
<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>
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<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>
以下是 demo 在 eclipse 的 package explorer 视图:
<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 的 navigator 视图:
运行项目,在浏览器输入 http://localhost:8080/helloWeb/hello, 显示:
若参考本文编写第一个 SpringMVC Demo 跑不起来,可以到原文留言提出意见.
来源: http://www.phperz.com/article/18/0110/354315.html