Servlet启动加载,Servlet原本是第一次访问创建对象
load-on-startup: 服务器启动的时候创建对象,值越小优先级越高
SpringMVC概述
- Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的 MVC 框架之一。
- Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架。
- Spring MVC 通过一套 MVC 注解,让 POJO(Plain Old Java Object) 成为处理请求的控制器,而无须实现任何接口。
- 支持 REST 风格的 URL 请求。
- 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
SpringMVC是什么
- 一种轻量级的、基于MVC的Web层应用框架。偏前端而不是基于业务逻辑层。
- 是Spring框架的一个后续产品。
普通MVC
1
2
3
4
5
6
7
8
9
10MVC: 新的软件架构模式
M: Model模型,封装和映射数据(JavaBean)
V: View视图,界面显示工作(JSP)
C: Controller控制器: 控制整个网站的跳转逻辑(Servlet)
MVC提倡:每一层只编写自己的东西,不写其他任何代码
控制器{
调用业务逻辑处理
调整到某个页面
}
分层为了解耦,解耦为了维护方便和分工合作
SpringMVC
1
2
3
4SpringMVC多一个前端控制器,就相当于一个导诊台
DispatchServlet是一个前端控制器,它是一个Servlet,
应该在web.xml中配置这个Servlet来拦截所有请求
SpringMVC的主要控件
- DispatcherServlet:前端控制器
- Controller:处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理
- HandlerMapping :请求映射到处理器,找谁来处理,如果映射成功返回一个HandlerExecutiongChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器对象)
- ViewResolver : 视图解析器,找谁来处理返回的页面。把逻辑视图解析为具体的View,进行这种策略模式,很容易更换其他视图技术;
- 如InternalResourceViewResolver将逻辑视图名映射为JSP视图
- LocalResolver:本地化、国际化
- MultipartResolver:文件上传解析器
- HandlerExceptionResolver:异常处理器
SpringMVC可以干什么
- 天生与Spring框架集成,如:(IOC,AOP)
- 支持Restful风格
- 进行更简洁的Web层开发
- 支持灵活的URL到页面控制器的映射
- 非常容易与其他视图技术集成,如:Velocity、FreeMarker等等。
- 因为模型数据不存放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用)
- 非常灵活的数据验证、格式化和数据绑定机制、能使用任何对象进行数据绑定,不必实现特定框架的API
- 更加简单、强大的异常处理
- 对静态资源的支持
- 支持灵活的本地化、主题等解析
SpringMVC需要的jar包
1 | spring-webmvc-4.0.0.RELEASE.jar |
SpringMVC 实现HelloWorld
操作步骤
- eclipse console配置(可以不配置)
- 切换JavaEE视图
- 在Quick Access中找Package explore
- 调整custom perspective,使得鼠标邮件可以找到并创建
- 新建工作集
- 创建动态web工程
- 如果选择Dynamic web module version为3.0则需要自己创建web.xml或点击下一步勾选生成,2.5则不需要
- 创建Tomcat运行环境,并引入Tomcat环境
- 导包
- SpringMVC是Spring的Web模块,所有模块的运行都依赖于核心模块(IOC模块)
1
2
3
4
5
6
7
8spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.1.3.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
- SpringMVC是Spring的Web模块,所有模块的运行都依赖于核心模块(IOC模块)
- 在 web.xml 中配置 DispatcherServlet(ALT+/)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- SpringMVC 配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<!--
Servlet启动加载,Servlet原本是第一次访问创建对象
load-on-startup: 服务器启动的时候创建对象,值越小优先级越高
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> - 加入 Spring MVC 的配置文件:springmvc.xml
- 添加命名空间

- 增加配置
1
<context:component-scan base-package="xyz.lyhcc"></context:component-scan>
- 配置视图解析器
1
2
3
4<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
- 添加命名空间
- 需要创建一个入口页面,index.jsp(创建之前,修改JSP文件配置为UTF-8:菜单栏Windows->Preference->搜索JSP->修改编码)
1
<a href="${pageContext.request.contextPath }/helloworld">Hello World</a> - 编写处理请求的处理器,并标识为处理器
1
2
3
4
5
6
7
8
9
10@Controller
public class HelloWorldController {
@RequestMapping(value="/hello", method=RequestMethod.GET)
public String hello() {
System.out.println("processing the request...");
return "success";
}
} - 编写视图/WEB-INF/views/success.jsp
1
<h4>Sucess Page</h4> - 部署测试:
HelloWorld的运行流程
- 客户端点击链接发送http://localhost:8080/springmvc/hello
- 来到Tomcat服务器
- SpringMVC的前端控制器收到所有请求
- 来看请求地址和@RequestMapping标注匹配,来找到相应的方法
- 前端控制找到目标处理器类和目标方法,直接利用返回执行目标方法
- 方法执行完成会有返回值,SpringMVC认为这个返回值就是要去的地址
- 拿到方法返回值以后,用视图解析器进行拼串得到完整的页面地址
- 拿到页面地址,前端控制器帮我们转发到页面
如果前端控制器不指定配置文件位置
会去寻找默认的文件 前端控制器名-servlet.xml
url-pattern说明
- /: 拦截所有请求,不拦截jsp页面*.jsp
- /*:拦截所有请求,包括jsp
处理*.jsp是Tomcat做的事,所有项目的小web.xml都是集成大的web.xml
DefaultServlet是Tomcat周玲处理静态资源的,除了jsp,Servlet外都是静态资源1) 服务器的大的web.xml中有一个DefaultServlet的url-pattern=/
2) 自定义的配置中前端控制器url-pattern=/这样就会禁用父web.xml,静态资源就会来到DispatchServlet,看那个方法的RequestMapping是这个,所以此时的html会报错
3) jsp可以访问是因为没有覆盖父web.xml的jspServlet
4) /* 直接拦截所有请求,一般写/;也是为了迎合后来Rest风格的URL

