SpringMVC
SpringMVC是什么
Spring web MVC 和 Struts2都属于表现层的框架,Spring MVC是 Spring框架的一部分,可以用来取代Struts2。与Struts不同点在于,Struts2是经过封装改造的拦截器,而SpringMVC没有经过封装,本质上是一个Servlet。
SpringMVC的主要处理流程
通过配置的中央前端控制器Servlet(DispathcherServlet)它负责发送每个请求到合适的处理程序,使用视图来最终返回响应结果的概念。
以下是对应于到DispatcherServlet的传入HTTP请求的事件顺序:
-
在接收到HTTP请求后,DispatcherServlet会查询HandlerMapping以调用相应的Controller。
-
Controller接受请求并根据使用的GET或POST方法调用相应的服务方法。 服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet。
-
DispatcherServlet将从ViewResolver获取请求的定义视图。
当视图完成,DispatcherServlet将模型数据传递到最终的视图,并在浏览器上呈现。
所有上述组件,即: HandlerMapping,Controller和ViewResolver是WebApplicationContext的一部分,它是普通ApplicationContext的扩展,带有Web应用程序所需的一些额外功能。
使用IDEA创建一个Spring MVC项目
使用idea创建一个SpringMVC项目,请参照以下连接的教程创建:
步骤可以分为:
- 导入Spring MVC JAR包(IDEA一般会自动导入,也可以自己导入)
- 配置web.xml文件,dispatcher-servlet.xml文件
- 配置controller控制器,将特定请求映射到相应处理方法。
- 配置Tomcat
- 配置helloworld页面
- 启动
SpringMVC文件的配置
SpringMVC中要对两个核心文件进行配置,applicationContext.xml文件和dispatcher-servlet.xml文件,也就是要为Spring框架加载这两个配置文件。
这两个配置文件的加载略有不同:
applicationContext.xml是全局的,应用于多个serverlet,配合listener一起使用,web.xml中配置如下:
applicationContext.xml 是全局的,所以使用 < context-param>进行加载。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置监听器 -->
<listener>
<!--ContextLoaderListener是Spring的监听器,它的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。-->
<!--因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。-->
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
dispatcher-servlet.xml 是spring mvc的配置 :
dispatcher-servlet.xml 是为spring mvc的这个控制器所使用的,所以需要在servlet标签中进行加载。
需要注意,如果没有为dispatcher指定装载配置文件的路径,则会默认到 /WEB-INF/[Servlet的名称]-servlet.xml 路径下装载配置文件。
如果dispatcher-servlet.xml没有存放在/WEB-INF 路径下,则需要在servlet标签中,设置 < init-param>初始化标签,手动指定路径,装载 dispatcher-servlet.xml 配置文件
web.xml中配置如下:
<!--配置springmvc DispatcherServlet-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--如果不为dispatcher Servlet指定配置文件,则会默认加载 /WEB-INF/[Servlet的名称]-servlet.xml 配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<!--
1 /* 拦截所有 jsp js png .css 全部拦截 不建议使用
2 *.action *.do 拦截以do action 结尾的请求
3. / 拦截所有(不包括)jsp(包含js .png .css)建议使用 /对静态资源放行
-->
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
然后在WEB-INF文件下下面创建一个jsp文件夹,创建一个hello.jsp页面:
<body>
hello world
</body>
dispatcher-servlet.xml中进行一部分的MVC的初始化工作
配置如下:
<?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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="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-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--Spring的注解开发:组件扫描,扫描需要使用注解的类包(类上注解:可以直接使用属性注入的注解)-->
<context:component-scan base-package="controller"/>
<!--<mvc:default-servlet-handler />对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,-->
<!--如果不是静态资源的请求,才由DispatcherServlet继续处理。-->
<!--一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。-->
<!--如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定-->
<!--<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />-->
<mvc:default-servlet-handler/>
<!--<mvc:annotation-driven>会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,-->
<!--这是Spring MVC为@Controller分发请求所必需的,并且提供了数据绑定支持-->
<mvc:annotation-driven/>
<!--与controller注解类中的返回值相结合,组成完整的返回值路径,比如返回的字符串hello-->
<!--prefix属性加在hello前面,suffix属性加在hello后面-->
<!--完整的路径就是/WEB-INF/jsp/比如返回的字符串hello.jsp-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
然后在src下创建一个controller包,创建一个controllerDemo的文件,作为控制器,用来返回页面。
通过@Controller注解来注明是一个控制器对象,通过@RequestMapping注解类来映射请求,也就是这个/mvc这个请求就会被映射到这个类中。
然后通过@RequestMapping方法上注解,再细分请求到处理方法,通过处理方法中的返回值跳转到到指定页面。
可以通过返回字符串或者ModelAndView类来跳转页面。
@Controller
@RequestMapping("/mvc")
public class controllerDemo {
@RequestMapping("/")
//返回字符串的方法跳转页面
public String hello(){
//和dispatcher-servlet.xml中的prefix,suffix属性结合形成完整的页面路径
//prefix属性加在hello前面,suffix属性加在hello后面
// 完整的路径就是/WEB-INF/jsp/比如返回的字符串hello.jsp
return "hello";
}
@RequestMapping("/list")
//返回ModelAndView对象的方式跳转页面
public ModelAndView list(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("itemList");
return modelAndView;
}
}
这时候就基础的配置就完成了,启动服务器,在网址栏中分别输入:
http://localhost:8080/mvc/ 或者 http://localhost:8080/mvc/list
就会跳转到hello.jsp页面和itemList.jsp页面了。