Spring MVC入门以及实现Hello World实例
简介
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。它是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架。Spring MVC 框架并不知道使用的视图,所以不会强迫开发者只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。
Spring MVC主要组件
DispatcherServlet:前端控制器(不需要程序员开发)
作用:接收请求,响应结果,相当于转发器,有了DispatcherServlet就减少了其它组件之间的耦合度;
HandlerMapping:处理器映射器(不需要程序员开发)
作用:根据请求的url来查找Handler;
HandlerAdaptor:处理器适配器
注意:在编写Handler的时候要按照HandlerAdaptor的要求规则去编写,这样适配器HandlerAdaptor才可以正确地去执行Handler;
Handler:处理器(需要程序员开发);
ViewResolver:视图解析器(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图View;
View:视图(需要程序员开发jsp)
作用:View是一个接口,它的实现类支持不同的视图类型(jsp、freemarker、pdf等)。
Spring MVC核心架构与流程
核心构架如图所示:
流程:
1,浏览器发送请求到前端控制器DispatcherServlet
2,前端控制器DispatcherServlet再把请求转送到处理器映射器HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)
3,从DispatcherServlet到HandlerAdapter,处理器适配器将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器
4,HandlerAdapter到处理器Handler调用相应功能处理方法,并返回一个ModelAndView对象(包含模型数据、逻辑视图名)
5,前端控制器DispatcherServlet请求视图解析器ViewResolver进行视图解析
6, 视图解析器将把逻辑视图名解析为具体的View,Model部分是业务对象返回的模型数据,View部分为逻辑视图名
7,前端控制器进行视图渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构
8,前端控制器向用户响应结果
(在流程中前端控制器DispatcherServlet相当于一个中央控制器,接收请求,转发请求,起着重要的作用)
实例:利用登录完成Hello World
创建Maven项目
创建好maven项目后解决项目报错问题
引入pom.xml的依赖,改变web.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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hsl</groupId>
<artifactId>s_mvc</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>s_mvc Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- 使用 <properties>标签可控制所以spring的版本 在调用时使用${spring.version}即可调用, 以方便日后进行版本修改 -->
<properties>
<spring.version>4.3.0.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
<build>
<finalName>s_mvc</finalName>
<!--插件-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
web.xml版本:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
</web-app>
创建登录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>登录</title>
</head>
<body>
<form action="Login" method="post">
<div>
账号:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
<input type="submit" value="登录"/>
</div>
</form>
</body>
</html>
配置Spring-mvc.xml核心配置文件
(创建在WEB-INF下)
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 配置controller的扫描包,注意是自己创建的包 -->
<context:component-scan base-package="com.hsl" />
<!-- 配置处理器映射器 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 配置处理器适配器 -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
<!-- 配置注解驱动,相当于同时使用最新处理器映射器和处理器适配器,对json数据的响应提供支持 -->
<mvc:annotation-driven />
<!-- 配置视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
改变web.xml的配置
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<!--这是登录界面-->
<welcome-file-list>
<welcome-file>/login.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
创建建立control类
package com.hsl.control;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ManygeSystem {
@RequestMapping("/Login")
public ModelAndView hello(@RequestParam("username") String userName,
@RequestParam("password") String passWord) {
//System.out.println(userName);
ModelAndView mv= new ModelAndView("index");//跳转到指定视图
mv.addObject("name", userName);
return mv;
}
}
特别注意:
一定别忘了写@Controller注解,否则会报如图所示的错
创建测试页面
<%@ 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>测试</title>
</head>
<body>
<h2>Hello World!欢迎${name}你的到来!</h2>
</body>
</html>
测试结果
登录界面:
测试结果: