- Spring MVC指的是Spring本身针对于MVC设计开发所提出的一种框架
- Spring MVC设计中有效解决的MVC设计问题:
- 更加轻松的多业务支持,避免了用户自己进行反射的操作处理
- 可以更加简单的实现VO与提交参数的自动转换
- 依据AOP的设计思想提供了拦截器的概念,用它来进行服务器端接收参数的验证操作处理
- 更加方便的文件上传控制
- 提供有安全访问处理机制,所有的JSP保存在WEB-INF后可以轻松的取得
配置Spring MVC开发环境
1、使用Maven配置Spring开发工具包
<properties>
<spring.version>5.1.3.RELEASE</spring.version>
</properties>
<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>
2、配置web.xml文件
- Spring MVC是运行在Spring容器基础之上的
需要在WEB容器里面配置一个监听器去启动Spring容器
<!-- 在WEB容器里面进行Spring容器的加载 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
Spring容器启动需要applicationContext.xml文件配置的支持
<!-- 此配置描述的是在项目开发过程之中,Spring容器所需要使用到的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
Spring容器需要配置Spring MVC所需要的WEB程序
- 在Spring MVC里面所有的用户请求都是交给DispatcherServlet程序类处理的
- DispatcherServlet程序类主要是进行参数的接收以及调用后续程序类与方法处理用户请求
<!-- 此为Spring MVC配置所需要的程序文件,所有的请求都提交给Spring的Servlet程序 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<!-- 此为Spring MVC自己提供的servlet程序,一定要写上,因为其可以处理用户请求 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 配置Spring MVC所需要的配置文件,可以与Spring容器写在一起 -->
<param-value>classpath:applicationContext-mvc.xml</param-value>
</init-param>
</servlet>
<!-- SpringMVC中所有路径的请求映射,使用的是“*.action” -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
Spring中专门提供过滤器进行编码过滤
<!-- Spring中提供的编码过滤器,使用的编码都是UTF-8 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、配置applicationContext-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: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/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-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:annotation-config/>
<context:component-scan base-package="cn.liang.action"/>
<mvc:annotation-driven /> <!-- 启动Spring MVC的注解配置 -->
<mvc:default-servlet-handler/> <!-- 启用处理请求的servlet -->
</beans>
4、配置applicationContext.xml文件,打开注解配置
- Spring MVC中的控制器是基于注解的配置操作
<context:annotation-config/>
<context:component-scan base-package="cn.liang"/>
编写Spring MVC程序
- 在Spring MVC之中把每一个控制层的代码称为一个Action
- Action不需要去继承任何一个类,可利用Annotation定义
- Spring MVC中负责整体跳转和参数传递的类:org.springframework.web.servlet.ModelAndView
- ModelAndView类相当于request.getRequestDispatcher()、forward()、request.setAttribute()
- public ModelAndView() :无参构造,不跳转(Ajax请求)
- public ModelAndView(String viewName):设置跳转路径,需要写完整路径
- public ModelAndView addObjectString attributeName,Object attributeValue) :设置传递的属性内容,相当于request.setAttribute()
- public void setViewName(String viewName):设置跳转路径
- public ModelAndView addAllObjects(Map<String,?> modelMap):自动处理Map集合的数据
1、编写测试程序:
package cn.liang.action;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
//如果要定义该Action映射路径,则可以在类上定义统一名称与方法中的路径组合
//或者直接在某一个方法上进行具体的映射路径不在类上进行映射路径的配置
//该名称绝对不能够重复(完全重复)
@Controller // 当前的这个程序属于Spring MVC中的一个控制器
@RequestMapping("/pages/emp/*")
public class EmpAction {
@RequestMapping("echo") // 最终路径:/pages/emp/echo.action
// 进行消息的接收,msg就表示参数
public ModelAndView echo(String msg) {
Map<String,Object> map = new HashMap<String,Object>() ;
map.put("allEmps", new ArrayList<String>()) ;
map.put("empCount", 1000) ;
ModelAndView mav = new ModelAndView("/pages/emp/show.jsp") ;
// 将Map集合交由ModelAndView处理,设置request属性范围
mav.addAllObjects(map) ;
mav.addObject("info", "ECHO : " + msg) ;
Logger.getLogger(EmpAction.class).info("ECHO : " + msg);
Logger.getLogger(EmpAction.class).info(map);
// 表示现在不进行跳转,一般如果使用Ajax连接,才需要使用这样的返回方式
return mav ;
}
}
2、编写测试页面:/pages/emp/show.jsp
<h1>${info}</h1>
<h1>${allEmps}</h1>
<h1>${empCount}</h1>
3、测试url:
http://localhost:8080/springdemo/pages/emp/echo.action?msg=liang
输出结果:
2018-12-07 11:24:10,265 INFO [cn.liang.action.EmpAction] - ECHO : liang
2018-12-07 11:24:10,266 INFO [cn.liang.action.EmpAction] - {allEmps=[], empCount=1000}
4、通过Action定义可以发现:
- Spring MVC里面对于参数的接收直接在方法上定义即可
- 里面所使用的方法可以由用户自己来定义是否需要返回数据
- 整体的路径配置以及多业务的配置都非常的简化
Spring MVC的安全访问
- 在整个WEB目录之中,WEB-INF是具有最高的安全级别
- 如果一个标准的Spring结构的开发,那么所有的JSP页面都要保存在/WEB-INF目录中
1、将相关jsp页面保存在/WEB-INF目录下:
/WEB-INF/pages/emp/show.jsp
2、配置applicationContext-mvc.xml文件
<!-- 表示要进行安全访问的路径资源匹配处理 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 匹配前缀 -->
<property name="prefix" value="/WEB-INF/pages/emp/"/>
<!-- 匹配处理的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
3、使用ModelAndView设置跳转页面
@Controller
@RequestMapping("/pages/emp/*")
public class EmpAction {
@RequestMapping("echo")
public ModelAndView echo(String msg) {
Map<String,Object> map = new HashMap<String,Object>() ;
map.put("allEmps", new ArrayList<String>()) ;
map.put("empCount", 1000) ;
ModelAndView mav = new ModelAndView("/pages/emp/show.jsp") ;
mav.addAllObjects(map) ;
mav.addObject("info", "ECHO : " + msg) ;
Logger.getLogger(EmpAction.class).info("ECHO : " + msg);
Logger.getLogger(EmpAction.class).info(map);
return mav ;
}
}
4、编写测试页面:/WEB-INF/pages/emp/show.jsp
<h1>${info}</h1>
<h1>${allEmps}</h1>
<h1>${empCount}</h1>
5、测试url:
http://localhost:8080/springdemo/pages/emp/echo.action?msg=liang
输出结果:
2018-12-07 15:03:29,692 INFO [cn.liang.action.EmpAction] - ECHO : liang
2018-12-07 15:03:29,692 INFO [cn.liang.action.EmpAction] - {allEmps=[], empCount=1000}