SpringMVC_01
A.快速搭建一个SpringMVC环境
1.搭建框架
<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>org.wpf</groupId> <artifactId>SpringMVC</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>SpringMVC Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.14.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalName>SpringMVC</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
2.配置前端控制器 web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!-- 配置分发器Dispatcher --> <servlet> <servlet-name>wpf</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 随系统启动 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>wpf</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
3.添加Servlet相关的核心配置
位于WEB-INF下,名称为:<Servlet名称>-servlet.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:c="http://www.springframework.org/schema/c" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 打开mvc应用中的注解支持 --> <mvc:annotation-driven /> <!-- 配置视图解析器,将逻辑地址名转换为物理地址,其中prefix用于设置前缀,suffix用于设置后缀,viewClass用于设置视图类型。例如 返回视图名称为abc,则对应的物理地址为“前缀”+逻辑地址名+"后缀"构成.ViewClass允许用户定义各种视图类型,例如返回pdf、Excel等 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/content/" p:suffix=".jsp" p:viewClass="org.springframework.web.servlet.view.JstlView" /> <context:component-scan base-package="org.wpf.action" /> </beans>
4.定义控制器
扫描二维码关注公众号,回复: 2833321 查看本文章package org.wpf.action; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; // SpringMVC2.5+不要求实现任何接口,不用继承任何类,只需要添加对应的注解即可 @Controller @RequestMapping("/") public class HelloController { @RequestMapping("hello") public ModelAndView hello(String name) throws Exception { ModelAndView mv = new ModelAndView(); System.out.println("name:" + name); mv.setViewName("show"); mv.addObject("msg", "hello " + name + "!"); return mv; } }
5.显示页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>index.jsp</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <a href="hello.do?name=zhangsan">问候</a> </body> </html>
6.运行结果
B.SpringMVC
1.概述
spring Web MVC是一种基于Java的
实现了Web MVC设计模式的请求驱动类型的轻量级Web框架
即使用了MVC架构模式的思想,将web层进行职责解耦
基于请求驱动指的就是使用请求-响应模型
框架的目的就是帮助我们简化开发
Spring Web MVC也是要简化我们日常Web开发的
2.回顾struts2
是非常优秀的MVC构架
优点:非常多比如良好的结构,拦截器的思想,丰富的功能
缺点:Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降,应避免使用这些功能
而Struts2的多层拦截器、多实例action性能都很好
3.SpringMVC的优点
Spring3 MVC使用简单,学习成本低
学习难度小于Struts2,Struts2用不上的多余功能太多
Spring3 MVC很容易就可以写出性能优秀的程序
Struts2要处处小心才可以写出性能优秀的程序
Spring3 MVC的灵活是无法想像的,Spring框架的扩展性有口皆碑
Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制
4.一般开发步骤
配置web.xml,指定业务层对应的Spring配置文件,定义DispatcherServlet
编写处理请求的控制器。处理器
编写视图对象
配置Spring mvc的配置文件,使控制器,视图解析器等生效
5.框架原理
a.整个过程始于客户端发出一个HTTP请求,Web应用服务器接收到这个请求,如果匹配DispatcherServlet的请求映射路径(web.xml下指定),Web容器将该请求转交给DispatcherServlet处理
b.DispatcherServlet接收到请求后,将根据请求信息(包括URL,HTTP方法等)及HandlerMapping的配置找到处理请求的处理器(Handler)。可将HandlerMapping看成是路由器,将Handler看成是目标主机。值得注意的是:Spring mvc中并没有定义一个Handler接口,实际上任何一个Object都可以成为请求的处理器
c.当DispatcherServlet根据HandlerMapping得到对应当前请求的Handler后,通过HandlerAdapter的Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter是Spring mvc的框架级接口,顾名思义HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用
d.处理器完成业务逻辑的处理后将返回一个ModelAndView给DsipatcherServlet,ModelAndView包含了试图逻辑名和模型数据信息
e.ModelAndView中包含的是“逻辑试图名”而非真正的视图对象,DispatcherServlet借由ViewResolver完成逻辑试图名到真是试图对象的解析工作
f.当得到真实的视图对象view后DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行试图渲染
g.最终客户端得到的相应消息,可能是一个普通的HTML页面,也可能是一个XML或JSON串,甚至是一张图片或一个PDF文档等不同的媒体形式
6.MVC框架
Spring web MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活、松散耦合的 web 应用程序的组件。MVC 模式导致了应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑)的分离,同时提供了在这些元素之间的松散耦合
模型封装了应用程序数据,并且通常它们由 POJO 组成
视图主要用于呈现模型数据,并且通常它生成客户端的浏览器可以解释的 HTML 输出
控制器主要用于处理用户请求,并且构建合适的模型并将其传递到视图呈现
7.DispatcherServlet
Spring Web 模型-视图-控制MVC框架是围绕 DispatcherServlet 设计的,DispatcherServlet 用来处理所有的 HTTP 请求和响应
Spring Web MVC DispatcherServlet 的请求处理的工作流程如下图所示
下面是对应于 DispatcherServlet 传入 HTTP 请求的事件序列
a.收到一个 HTTP 请求后,DispatcherServlet 根据 HandlerMapping 来选择并且调用适当的控制器
b.控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法。Service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中
c.DispatcherServlet 会从 ViewResolver 获取帮助,为请求检取定义视图
d.一旦确定视图,DispatcherServlet 将把模型数据传递给视图,最后呈现在浏览器中
上面所提到的所有组件,即 HandlerMapping、Controller 和 ViewResolver 是 WebApplicationContext 的一部分,而 WebApplicationContext 是带有一些对 web 应用程序必要的额外特性的 ApplicationContext 的扩展
C.常用方法
1.form标签
使用Spring的form标签主要有两个作用
第一是它会自动的绑定来自Model中的一个属性值到当前form对应的实体对象
默认是command属性,这样我们就可以在form表单体里面方便的使用该对象的属性了
第二是它支持我们在提交表单的时候使用除GET和POST之外的其他方法进行提交
包括DELETE和PUT等
Spring给提供了一个modelAttribute属性
可以通过该属性来指定将使用Model中的哪个对象作为form需要绑定的对象
SpringMVC的input标签会被渲染为一个type为text的普通Html input标签<form:form modelAttribute="user">
使用SpringMVC的input标签的唯一作用就是它能绑定表单数据
SpringMVC表单标签最大的好处就是它支持数据绑定
<td><form:label path="username">用户名称:</form:label></td> <td><form:input path="username"/></td>
2.ModelAndView
简单理解它是将后台返回的数据传递给View层
同时包含一个要访问的View层的URL地址
当控制器处理完请求后,通常控制器会将包含视图名称以及一些模型属性的ModelAndView对象返回给DispatcherServlet
因此,在控制器中会构造一个ModelAndView对象
作用:
设置转向地址
将底层获取的数据进行存储(或者封装)
最后将数据传递给View
ModelAndView的用法:
先创建ModelAndView对象,再通过它的方法去设置数据与转发的视图名
ModelAndView modelAndView = new ModelAndView();构建对象
modelAndView.setViewName("m06"); 设置逻辑视图名
modelAndView.addObject("message", "Hello World, Hello Kitty");添加需要显示的数据
import javax.servlet.http.HttpServlet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import org.wpf.dao.IUserServ; import entity.UserBean; @Controller @RequestMapping("/") // 定义在类上则类似于Struts2中的名空间,给类中的所有方法添加了一个名空间 public class UserController extends HttpServlet { @Autowired private IUserServ userv; // 映射login()方法到get请求的login.do上 @RequestMapping(value = "login", method = RequestMethod.GET) public ModelAndView login() throws Exception { ModelAndView mv = new ModelAndView(); UserBean user = new UserBean(); user.setUsername("zhangsan"); mv.addObject("user", user); mv.setViewName("user/login"); return mv; } // 在控制器中接收请求参数,最简单的做法是同名的方法参数 @RequestMapping(value = "login", method = RequestMethod.POST) public ModelAndView login(String username, String password) throws Exception { UserBean user = new UserBean(); user.setUsername(username); user.setPassword(password); boolean bb = userv.login(user); ModelAndView mv = new ModelAndView(); if (bb) mv.setViewName("success"); else mv.setViewName("failure"); return mv; } }