SpringMVC 3.x
全注解的(annotation)全新的MVC框架;
M -model
模型,包括DAO,Service等部分
V -view
视图,JSP等部分
C -controller
控制器
Spring的web框架围绕DispatcherServlet设计。
DispatcherServlet的作用是将请求分发到不同的处理器。
相当于Struts中的中央控制器,Struts中的控制器是过滤器,而SpringMVC是一个Servlet;
SpringMVC的简单请求流程:
前台控制器(Front Controller)接收到请求(Incoming Request)让下面的具体的控制器(Controller)去完成相应操作,给出响应(model)给前台控制器,前台控制器把model交给视图模板(View Template),应用模板后给用户做出显示!
SpringMVC的请求方式:
1,普通的请求
浏览器发出普通请求,经过SpringMVC的Dispatcher跳转到相应的Controller,Controller调用Service去请求持久层,结合Model Bean(pojo等)产生视图,给用户做出响应;
2,Ajax请求
用户发出Ajax请求,到达Dispatcher,跳转Controller,调用Service结合Model Bean产生请求的资源信息,以XML或者JSON的形式给浏览器做出响应;
使用Maven搭建SpringMVC开发环境:
1,在pom.xml添加基本的jar和配置web服务器环境jetty
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.4.RELEASE</version> </dependency> <!-- 提供对c标签的支持 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- servlet api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <!-- javax提供的annotation --> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> <build> <finalName>springmvc</finalName> <!-- maven的jetty服务器插件 --> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <scanIntervalSeconds>10</scanIntervalSeconds> <webApp> <contextPath>/</contextPath> </webApp> <!-- 修改jetty的默认端口 --> <connectors> <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> <port>80</port> <maxIdleTime>60000</maxIdleTime> </connector> </connectors> </configuration> </plugin> </plugins> </build>
2,在web.xml中配置基本的DispatcherServlet(注意修改默认的web.xml中的xsd约束)
<?xml version="1.0" encoding="UTF-8" ?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>Archetype Created Web Application</display-name> <!-- 配置springmvc servlet --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- / 表示所有的请求都要经过此serlvet --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
配置完成,启动服务器!jetty:run
启动不会报错,启动完成后,在浏览器中输入:localhost访问默认页面!
提示:500错误
原因:
不能找到/WEB-INF/下的一个文件,文件叫作:springmvc-servlet.xml
意思是说:我们还需要一个配置文件
SpringMVC推荐加载此配置文件,在容器启动的时候!在web.xml中修改如下:
<!-- 配置springmvc servlet --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- / 表示所有的请求都要经过此serlvet --> <url-pattern>/</url-pattern> </servlet-mapping>
再次启动服务器,将会报错!!!仍然是缺配置文件!
配置文件的名称:springmvc-servlet.xml中的springmvc跟你配置的servlet-name保持一致;
我们在WEB-INF下建立我们的:springmvc-servlet.xml
使用springmvc的schema约束,基本结构如下:
<?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.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> </beans>
添加这些约束的配置文件会变成一个树叶,表示这是springmvc的配置文件!
spring的配置文件:applicationContext.xml跟这个配置不冲突,这个配置文件跟spring的配置文件其实就是多了一个mvc项的配置
那么我们这个配置文件里面到底配置哪些东西呢?
<mvc:annotation-driven/>
表示我要使用基于注解的springmvc
<context:component-scan base-package="com.cn.controller"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
base-package表示自动扫描com.cn.controller包中的注解
include-filter表示只扫描expression="org.springframeword.stereotype.Controller"的注解,也就是只扫描类上有@Controller注解的类:
package com.cn.controller; import org.springframework.stereotype.Controller; @Controller public class HomeController { }
spring配置文件中也有自动扫描,你可以设置以下内容排除掉扫描Controller注解:
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
如何请求我们的Controller中的方法呢?
通过如下注解进行实现:
@RequestMapping("/home") public String home(){ return null; }
springmvc中的url推荐不加后缀!
并且,你还可以使用下面的地址完成特定的请求:
/user/1 查看ID=1的用户
/del/1 删除ID=1的用户
这种方式是如何实现的呢?
我们知道浏览器只能发出get,post请求,但是我们可以通过程序发送其他请求,我们常用的有:
get 获取
post 保存
delete 删除
put 可以用来修改
/user/1
对于上面的url,如果你发送的是get请求,服务器就给你做出get响应
如果你发送的delete请求,服务器就给出删除响应
那么在springmvc中是什么样子的呢?
@RequestMapping(value="/user/1",method=RequestMethod.GET) public String getUser(){ System.out.println("get...获取用户"); return null; } @RequestMapping(value="/user/1",method=RequestMethod.DELETE) public String delUser(){ System.out.println("delete...删除用户"); return null; }
简单说了一下springmvc中的地址,下面我们来说如何请求我们的url;
配置home方法如下:
@RequestMapping("/home") public String home(){ System.out.println("home..."); return "home"; }
启动容器,确定不再报错了,然后在浏览器中请求:localhost/home
又报错了。
错误信息:
意思是:
检查你的视图解析器是否建立,你输入的url我无法解析;
什么是视图解析器呢?
仍然是在springmvc-servlet.xml中需要配置的一项;
<!-- 视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>
视图解析器就是一个类:UrlBasedViewResolver,其中有三个属性:
viewClass,我们使用的是JstlView
prefix,前缀,就是我们请求的页面所在的地方
suffix,后缀,就是标识我们的视图是以什么后缀结尾,eg.home.jsp
这样定义完成之后,我们在/WEB-INF/下建立views文件夹,并新建一个home.jsp
再次启动容器,并请求:localhost/home就可以跳转到home.jsp页面了!
那么如何请求views/user/文件夹下的user.jsp呢?
很简单:
@RequestMapping(value="/user",method=RequestMethod.GET) public String getUser(){ System.out.println("get...获取用户"); return "user/user"; }
至此我们可以使用SpringMVC做网站了!最基本的配置就这些!