Spring MVC简介
SpringMvc是一种基于SpringWeb MVC设计模式的请求驱动类型的轻量级Web框架,使用了Mvc的架构模式思想,将Web层进行指责解耦。并管理了应用的生命周期,为简化日常开发,提供了很大的便利。
SpringMvc提供了总开关DispatcherServlet;请求处理映射器(Handler Mapping)和处理适配器(Handler Adapter),视图解析器(View Resolver)进行视图管理,动作处理器controller(包含ModerAndView,以及处理请求响应对象请求和响应),配置灵活,支持文件上传,数据简单转换等功能。
Spring MVC的常用的注解
- @Controller
用于标识一个类上,被标识的类就是Spring MVC Controller对象,分发处理器会去扫描使用了该类的方法,并检测方法是否使用了@RequestMapping注解。@Controller只是定义了一个控制器,只有使用了@RequestMapping注解的才是处理请求的处理器。单个使用@Controller还不能说它是Spring MVC的控制器,因为这个使用Spring还不认识它,那要怎样让Spring认识他呢,有两种方法:(1)配置自动扫描,扫描标识了@Controller类的包。(2)在SpringMVC的配置文件中定义要标识成控制台类的bean对象
<!-- 配置自动扫描报下的所有,注册bean 方式2-->
<context:component-scan base-package="com.web.controller"/>
<!-- 将HolleWorld注册为Spring容器的bean 由Spring来管理 方式1-->
<bean class="com.web.controller.HolleWorld"/>
- @RequestMapping
@RequestMapping是一个用来处理请求映射的注解,可以用于类和方法上。如果用在类上,那么该类方法的所有请求都视为改地址为父路径。 - @Resource和@AutoWired
@Resource和@AutoWired都是注入bean时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持这种注解。 - @ModelAttribute和@SessionAttributes
该控制器的所有方法在调用前,都会先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseControlle当中,所有控制器继承BaseController,即可实现在调用BaseController的时候,先执行@ModelAttribute方法,@SessionAttributes即将值放到session作用域中,写在类上面 - @PathVariable
用于将URL请求模板中的变量映射到功能处理的方法参数上,取出请求模板里的变量作为参数。
@RequestMapping("/holle/{id}")
public String holleworld(@PathVariable("id")int id){
System.out.println(id);
return "holle";
}
- @ReauestParam
主要用于SpringMvc后台控制层获取参数,类似于是request.getParameter(“name”),它有三个常用的参数,分别是defauitValue=“0”表示默认值,required=false设置是否必须要传入的参数,value=“int”表示接受传入的参数类型。 - @ResponseBody
该注解用于将控制器的方法返回的对象,通过适当的httpMessageConverter转换为指定的格式后,写入到响应对象的数据区里。一般不适用与http标签的参数,而适用于其他某种格式的数据(JSON,XML,等…). - @Component
相当于通用的注解,可以适用于如何层,一般不推荐使用 - @Repository
用于注解道层,在daoImpl类上面注解
Spring MVC的工作流程
(1).Http请求:客户端提交请求到DispatcherServlet。
(2).寻找处理器:有DispatcherServlet控制器查询一个或多个HandleMapping找到处理请求的Controller。
(3).调用处理器:DispatcherServlet控制器将请求提交到Controller。
(4)(5).调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。
(6)(7).处理视图映射并返回模型:DispatcherServlet控制器查询一或多个ViewResoler视图解析器,找到ModelAndView指定的视图。
(8).Http响应:视图将结果显示到客户端。
Spring MVC项目
第一步:创建项目
创建一个maven项目
第二步:配置maven依赖,导入springmvc所需的包
<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>tsp_web</groupId>
<artifactId>tsp_web</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>tsp_web Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<!-- adapter log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
<!-- adapter commons-logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.12</version>
<scope>compile</scope>
</dependency>
<!-- log end -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>tsp_web</finalName>
</build>
</project>
这里给大家讲一下spring-websocket,这个依赖下关联了几个spring常用的,所以我们一般只需要导入一个spring-websocket依赖就行了
第三步:配置web.xml,设置spring配置文件路径
<!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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
第四步:配置spring文件,设置自动扫描包,开启视图解析器
spring-mvc.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:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<!-- 配置自动扫描路径下的所有类,注册bean-->
<context:component-scan base-package="com.web.controller"/>
<!-- 将HolleWorld注册为Spring容器的bean 由Spring来管理 -->
<!-- <bean class="com.web.controller.HolleWorld"/> -->
<!-- 配置视图解析器 -->
<bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
上面的 /WEB-INF/jsp/ 是你放jsp页面的路径,.jsp是后缀
spring.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:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">
<import resource="classpath:config/spring-mvc.xml"/>
</beans>
第五步:配置完成后就可以开始写代码了
创建两个jsp
holle.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>Insert title here</title>
</head>
<body>
<a href="index">点....</a>
</body>
</html>
index.jsp
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
然后在创建一个Controller类
package com.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HolleWorld {
@RequestMapping("/holle")
public String holleworld(){
return "holle";
}
@RequestMapping("/index")
public String index(){
return "index";
}
}
然后启动用Tomcat启动
路径要加上你的项目名
然后点击点…
完成!
Srping MVC拦截器,文件上传,模型数据处理
模型数据处理 ModelAndView
控制器处理方法的返回值可以是ModelAndView,其中包含模型和数据信息,Springmvc会将model中的数据放到request中。
添加模型数据:
-
ModelAndView addObject(String attributeName,Object attributeValue)
-
ModelAndView addAllObject(Map<String,?> modelMap)
设置视图:
-
void setView(View view)
-
void setViewName(String ViewName)
@RequestMapping("/holle")
public ModelAndView holleworld(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("time",222222);
modelAndView.setViewName("holle");
return modelAndView;
}
传到目标页面可以接收参数
<a href="index">${time}</a>
结果:
文件上传
SpringMvc通过MutipartResolver实现文件上传
1.配置MutipartResolver
<!-- 配置 MultipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="1024000"></property>
</bean>
2.表单
<form action="testFileUpload" method="POST" enctype="multipart/form-data">
File: <input type="file" name="file"/>
Desc: <input type="text" name="desc"/>
<input type="submit" value="Submit"/>
</form>
3.目标方法
@RequestMapping("/testFileUpload")
public String testFileUpload(@RequestParam("desc") String desc,
@RequestParam("file") MultipartFile file) throws Exception {
System.out.println("InputStream:" + file.getInputStream());
return "success";
}
使用拦截器
SpringMvc也可以使用拦截器对请求进行拦截,可以自定义拦截器来实现特定的功能,自定义拦截器必须实现HandlerInterceptor接口
1.实现HandlerInterceptor接口的拦截器类
public class FirstInterceptor implements HandlerInterceptor {
/**
* 渲染视图之后被调用. 释放资源
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion");
}
/**
* 调用目标方法之后, 但渲染视图之前.
* 可以对请求域中的属性或视图做出修改.
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("postHandle");
}
/**
* 该方法在目标方法之前被调用.
* 若返回值为 true, 则继续调用后续的拦截器和目标方法.
* 若返回值为 false, 则不会再调用后续的拦截器和目标方法.
*
* 可以考虑做权限. 日志, 事务等.
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("preHandle");
return true;
}
}
2.配置拦截器
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 配置自动扫描路径下的所有类,注册bean-->
<context:component-scan base-package="com.web.controller"/>
<!-- 将HolleWorld注册为Spring容器的bean 由Spring来管理 -->
<!-- <bean class="com.web.controller.HolleWorld"/> -->
<!-- 配置视图解析器 -->
<bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.web.service.FirstInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>