No.1 Spring MVC 从hello开始
在以往的开发中,我们对MVC编程模式,也许并不陌生,M:model模型,V:view视图,C:control控制层。Model主要指Java bean,包括处理业务的业务bean,承载数据的实体bean。View主要指用户浏览网页的内容,诸如JSP,HTML等。而像我们之前所用到的servlet,既调用了java类,又实现了向jsp页面跳转,可以称之为控制层。
简单介绍了MVC编程模式,下面从最基础的谈一谈Spring MVC,仅是个人观点,如有意见,还请多多包涵。
Spring Web MVC使用了MVC架构模式的思想,将web层进行职责解耦,是一种基于Web MVC设计模式的请求驱动类型的轻量级Web框架,所谓的基于请求驱动指的是使用请求-响应模型,该框架的目的是帮助我们简化开发。
Spring Web MVC具有以下几个主要特点:
1.Web层干净轻薄,
通俗来讲就是代码少
2.提供强大的约定大于配置的契约式编程支持(讲真小编也不怎么懂,可能类似于以往编程中的2-8原则)
3.支持灵活的本地化,主题等解析
本地化亦为国际化(i18n),打个比方,类似于将手机显示字体设置为中或英文时,再去浏览某些国际化网页,页面显示可能会有所不同
4.简单的异常处理
5.支持Restful风格(一个接口操作多个功能)
个人理解是,类似于开发一个学校的网站,该网站可能包含多个功能模块:学生信息管理,校园卡管理,图书馆管理。而两两之间必然要进行信息的交互,将其放置在一个系统中,可方便事务的管理,倘若由多个系统承担,则不能实现数据的同步。
在这里,有点类似分布式吧,倘若一个网页的浏览量过大,将业务分配到不同的服务器,可减小每个服务器承载的压力。
除此之外,特点还包括支持灵活的URL到页面控制器的映射,灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API,因理解有限,就不一一解释了。
原理:
Spring MVC是通过用户向前端控制器发送请求,前端控制器将用户的请求分发给页面控制器,控制器针对于不同模型或数据将其封装成ModelAndView,前端控制器将返回的ModelAndView与视图结合,进行视图的渲染,渲染完成后再返回给用户。
细致的讲,前端处理器DispatcherServlet将请求发送给映射处理器HandlerMapping,HandlerMapping通过反射调用方法(下文中的sayHello等方法),再将url地址交个前端控制器,DispatcherServlet又将url交给HandlerAdapter处理适配器,HandlerAdapter要去执行处理器,处理器返回ModelAndView给HandlerAdapter,HandlerAdapter将其交给前端控制器,前端控制器又根据ModelAndView,查找视图解析器ViewResolver,解析成一个view对象返回给前端控制器,控制器再将视图交给用户渲染。
开发过程:
1.将依赖的jar包引入pom.xml
2.在工程web.xml里面配置前端控制器
所有的访问都必须先访问一个servlet,这个servlet就是前端控制器。
DispatcherServlet前端控制器,是一个servlet,需采用servlet标签将其配置到工程中,是在spring基础上开发的,也是一个java bean,需将其放到ioc容器中,加载配置文件。
可对前端控制器的拦截进行设置:
(1) / 拦截所有的请求 包括 .jsp , .css ,.js ,图片,不包含jsp,一般用于开发网站
(2) *.action *为通配符,匹配所有以.action作为结尾的链接 一般用于开发后台管理系统(用于约束)OA,ERP,CRM,类似于数据库模糊查询中的%
(3)/*表示拦截所有请求URL,包含静态资源文件,及jsp 但不推荐使用
配置好的web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
3.配置spring 上下文
<?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"
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 ">
<context:component-scan base-package="com.xt.mvc.helloworld.action"></context:component-scan>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
4.编写Controller文件
package com.xt.mvc.helloworld.action;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping("/sayHello.action") //对方法的注解,表明请求路径
public ModelAndView sayHello(){
//sayhello就是一个页面控制器
ModelAndView mav = new ModelAndView();
mav.addObject("data", "spring MVC");//添加渲染,类似数据结构map.put
mav.setViewName("hello");//设置视图
return mav;
}
//后台系统可以自动的将其封装成一个ModelAndView,自动将map封装成model
@RequestMapping("/simpleWay.action")
public String simpleWay(Model model){
model.addAttribute("data"," simple spring MVC");
return "hello";
}
@RequestMapping("/simpleWay.action")
public String simpleWay(Map<String,Object> map){
map.put("data"," simple spring MVC1");
return "hello";
}
}
倘若方法中有如下方法,若访问路径为hello.action,即使方法的注解为@RequestMapping("/hello"),也能访问到
@RequestMapping("/hello")
public String hello(){
System.out.println("-------hello----------");
return "success";
}
若还有一方法注解为@RequestMapping("/hello.action"),访问路径hello.action,则调用的是方法hello1()
@RequestMapping("/hello.action")
public String hello1(){
System.out.println("-------hello1----------");
return "success";
}
以上便是简单的介绍了spring MVC,谢谢阅读。