【JavaEE学习笔记】SpringMVC_01_快速搭建一个环境,简介,常用方法

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.定义控制器

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需要绑定的对象

<form:form modelAttribute="user">
SpringMVC的input标签会被渲染为一个type为text的普通Html input标签

使用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;
	}
}

猜你喜欢

转载自blog.csdn.net/wpf719971425/article/details/79242413