SpringMVC主要有三个核心部分组成,DispatcherServlet、Controller、ViewResolver。
    
     DispatcherServlet:
     请求输入时:类似于一个带分配功能的Filter,其直接与前端交互,并截所有符合 url-pattern 的请求,并根据Mapping路径分发给处理对应请求的Controller。
     请求处理完毕时:将ViewResolver渲染好的视图回传给前端。
    
     Controller:
     处理Http传来的请求,通常调用Service,再在Service中调用Dao持久层进行完整的数据处理,并将处理完毕的数据返回,返回以ModelAndView的形式,Model,通俗来讲,就是承载数据的一个HashMap,而View则是数据要发送的逻辑视图名,如果View缺省,默认是转发到HTTP发起的页面。
    
     ViewResolver:
     根据Controller处理好的数据,对指定目录下的文件进行渲染解析,完毕后将视图(不一定为页面、可能是Joson、Map各种数据类型,这根据Controller回传的数据决定)返回给DispatcherServlet。


DispatcherServlet配置

  在web/web-inf/web.xml中配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"> <!--配置contextLoaderListener以及文件地址,默认为web/web-inf/applicationContext.xml -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!--配置DispatcherServlet servlet-name可自取 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置文件地址,默认为web/web-inf/ {servlet-name}-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher-servlet.xml</param-value>
</init-param>
<!--自启动-->
<load-on-startup>1</load-on-startup>
</servlet> <!--配置拦截路径,此处为"/",可以改为其他 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

dispatcher-servlet.xml

配置开启注释、Json处理、视图解析器。

<?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"
xmlns:beans="http://www.springframework.org/schema/beans"
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.xsd"> <!--配合@ReponseBody使用,开启Jackson的转换-->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<!--json处理-->
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven> <!--开启注解,base-package指向扫描的包地址,此处为Controller-->
<context:component-scan base-package="Controller" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan> <!--Spring3.1开始的注解 HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--Spring3.1开始的注解 HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!--配置视图解析器-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>

Controller

  通过@Controller来定义一个Class为Controller。

  通过@RequestMapping的Value值来定义访问路径,method来定义访问方式。

@Controller
@RequestMapping(value="/login")
public class LoginController { @RequestMapping(value = "/getDatas")
public ModelAndView login( String username){
try {
……
}catch (Exception e){ }
}
}

  例如如上定义,想要访问login方法,如果在本地则为:localhost:8888/login/getDatas

  Controller 返回值的类型多种多样,可以为map、List、String等,当然最通用的例子还是ModelAndView。


  ModelAndView,其实际用途可以看成是Model 和 View两部分数据的返回,Model是数据部分,View是视图部分。数据最终传递到对应的视图上。

  其更多是作为  处理一个校验,并完成转发的  用途,例如访问主页时需要检查用户权限,则可先访问Controller,在Controller校验完毕后,再重定向(当然也可以含参)到不同的逻辑页面(View)。

  下面我们举一个含参的例子,跳转到succ.jsp或者error.jsp

@RequestMapping(value = "/getDatas")
public ModelAndView login(){
ModelAndView modelAndView=new ModelAndView(); try {
/*为modelAndView添加数据*/
modelAndView.addObject("TestData","1");
modelAndView.addObject("TestData1","2");
/*设置view的逻辑名称,SpringMVC会在视图解析器配置的目录下寻找该逻辑名称*/
modelAndView.setViewName("succ");
}catch (Exception e){
modelAndView.addObject("mesg","error");
modelAndView.setViewName("error");
}
return modelAndView;
}

  我们可以通过再succ.jsp使用el表达式直接获取传递过来的值。

  


  但其实很多时候我们接收到的都是AJAX传递过来的Json对象,完整解析后再给前端传出Json串,供前端使用JS进行渲染,这个时候我们的返回值就可以为Map、List、String类型的值。但是为了我们传出的值为Json,我们必须使用另一个标签@ResponseBody。

  该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

  我们将上面的方法加上@ResposeBody的标签,并使返回值为一个map

    @ResponseBody
@RequestMapping(value = "/getDatas")
public Map login(){
Map<String,Object> map=new HashMap<>();
try {
map.put("mesg","接口调用成功");
map.put("name","接口名称为login()");
}catch (Exception e){
map.put("mesg","error");
}
return map;
}

我们调用该接口可以看到其返回的使一个map的json串,并且也证明了在视图缺省的情况下,默认转发到请求的HTTP。

  

 如果返回值为String,并添加了注释@ResponseBody,其返回的类型则为一个String,这一点需要注意(例:我们return "succ")

  


 对于String返回类型还有一点特殊,即如果没有注释@ResponseBody,则SpringMVC默认其为一个逻辑视图名,以上面的 return "succ" 为例,我们将会跳转到SUCC页面

  @RequestMapping(value = "/getDatas")
public String login(){
String path="";
try {
path="succ";
}catch (Exception e){
path="error";
}
return path;
}

我在视图解析器路径下建立了一个succ.jsp,并写了一个标题“SUCC PAGE”,可以已经完成了跳转。

这里的String就已经被SpringMVC默认为为View进行了命名的工作,类似于Struts2的Action。当然这样的跳转也可以像ModelAndView一样带参传递。

将Model置入Controller进行装载数据即可,见下:

 @RequestMapping(value = "/getDatas")
public String login(Model model){
String path="";
try {
model.addAttribute("TestData","1");
model.addAttribute("TestData1","2");
path="succ";
}catch (Exception e){
path="error";
}
return path;
}

这样我们再次访问,就会发现两个EL表达式也取到了值。

String类型的返回值还有一个用于重定向的前缀"redirect:",当控制器方法返回的String值以“redirect:”开头的话,那么这个String不是用来查找视图的,而是用来知道浏览器进行重定向的路径。

例: return "redirect:succ.jsp"


前面我们讲述了一些Controller返回值类型的内容,现在我们来尝试为Controller传入一些参数。

Controller支持从表单直接拿值并自动匹配装配数据,这一点和Struts相同,例如表单两个输入一个username,一个password,直接post到Controller。

可见实体类以及字符串都可以拿到值。

更多的情况我们需要拿AJAX发送给我们的Json串,这个时候我们需要用到另一个注释@RequestBody来格式化取值,如下:

@RequestMapping(value = "/getDatas")
public String login(@RequestBody user user,Model model){
//后方代码无用,打断点看值
String path="";
try {
model.addAttribute("TestData","1");
model.addAttribute("TestData1","2");
path="login/edit";
}catch (Exception e){
path="error";
}
return path;
}

我们使用Soup UI直接进行端口测试,传送Json串

{
"username":"adim",
"password":"12345"
}

这样便可以拿到传进来的Json值了

注:@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,后来发现用JSON.stringify(data)的方式就能将对象变成字符串。同时ajax请求的时候也要指定dataType:
"json",contentType:"application/json"
这样就可以轻易的将一个对象传到Java端,使用@RequestBody即可绑定对象


另:

此处本人在开发过程中遇到了如果只有单个参数

如 public String login( String loginname) {}时,如果我传入

{“loginname”:"adim"}

Controller并取不到值,所以导致了单个参数也要封装的尴尬现象,还希望大佬们多多指点。


层面的注释

@Service

  用于标注业务层组件

@Repository

  用于标注数据访问组件,即DAO组件

@Controller

  用于标注控制层组件(如struts中的action)

  在Controller中调用ServiceImpl时,可直接使用@Autowire以及@Qualifier("xxx")在申明时进行注入。


其他常用的注释,来源:http://www.cnblogs.com/leskang/p/5445698.html

@ModelAttribute和 @SessionAttributes

代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。

@SessionAttributes即将值放到session作用域中,写在class上面。

具体示例参见下面:使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据

@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:

@Controller
public class TestController {
@RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)
public String getLogin(@PathVariable("userId") String userId,
@PathVariable("roleId") String roleId){
System.out.println("User Id : " + userId);
System.out.println("Role Id : " + roleId);
return "hello";
}
@RequestMapping(value="/product/{productId}",method = RequestMethod.GET)
public String getProduct(@PathVariable("productId") String productId){
System.out.println("Product Id : " + productId);
return "hello";
}
@RequestMapping(value="/javabeat/{regexp1:[a-z-]+}",
method = RequestMethod.GET)
public String getRegExp(@PathVariable("regexp1") String regexp1){
System.out.println("URI Part 1 : " + regexp1);
return "hello";
}
}

@requestParam

@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。

  

  

抛开深层次底层,快速入门SpringMVC的更多相关文章

  1. SpringMVC 快速入门

    SpringMVC 快速入门 SpringMVC 简介 SpringMVC是 Spring为展示层提供的基于Web MVC设计模式的请求驱动类型的轻量级Web框架,它的功能和Struts2一样.但比S ...

  2. JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC

    接上篇<JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP.IOC)>,了解了Spring的核心(AOP.IOC)后,我们再来学习与实践Maven.Sp ...

  3. SpringMVC:学习笔记(1)——理解MVC及快速入门

    SprigMVC-理解MVC及快速入门 说明: 传统MVC-->JSPModel2-->Front Controller + Application Controller + Page C ...

  4. [jbdj]SpringMVC框架(1)快速入门

    1)springmvc快速入门(传统版) 步一:创建springmvc_demo一个web应用 步二:导入springioc,springweb , springmvc相关的jar包 步三:在/WEB ...

  5. springMVC学习总结(一)快速入门

    springMVC学习总结(一)快速入门 一.初步认识 springMVC执行流程 主要组件 DispatcherServlet(中央控制器) 配置在web.xml中的前端控制器,客户端请求的入口,调 ...

  6. JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识

    JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...

  7. (4)Maven快速入门_4在Spring+SpringMVC+MyBatis+Oracle+Maven框架整合运行在Tomcat8中

    利用Maven 创建Spring+SpringMVC+MyBatis+Oracle 项目 分了三个项目  Dao   (jar)   Service (jar)   Controller (web) ...

  8. SpringMVC总结一:快速入门

    MVC: MVC是一种架构模型,本身没有什么功能,只是让我们的项目结构更加合理,流程控制更加清晰,一般包含三个组件: ​ **Model(模型)**:数据模型,用于提供要展示的数据.一般包含数据和行为 ...

  9. SpringMVC快速入门

    导入开发包 前6个是Spring的核心功能包[IOC],第7个是关于web的包,第8个是SpringMVC包 org.springframework.context-3.0.5.RELEASE.jar ...

随机推荐

  1. C实现dos图文菜单程序实例

      前言 公司一台服务器是novell环境,文件管理是基于dos6.22的,客户端启动需要一个图文菜单.   实现    编程环境:汉化版TC2.0 菜单基本功能:显示提示项.显示dbf中的行情信息. ...

  2. asp.net修行入门讨论

    突然想起来大学的一个专业课老师,教C,C#,他的教学特点就是只教简单知识,现在想想真有道理,假如上来就教我们枯燥难以理解的高深知识,我们会恐惧编程的,极大地打击学习的兴趣,所以他C语言的指针从来没教过 ...

  3. request.setcharacterencoding()和request.setcontenttype

    1.request.setCharacterEncoding()是设置从request中取得的值或从数据库中取出的值 指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默 ...

  4. Android - Fragment (一)定义

    什么是Fragment,为什么要用Fragment? Fragment,直译为碎片.是Android UI的一种. Fragment加载灵活,替换方便.定制你的UI,在不同尺寸的屏幕上创建合适的UI, ...

  5. Serv-U FTP版本控制服务器 - 目录规范

    背景 公司要组建一个版本控制服务器,选定了serv-u,初始目的是应用于war级的一些标准组件的版本控制/测试交付/统一对外发布渠道. 项目过程图: 如果不使用版本控制会出现什么问题? War标准组件 ...

  6. php的laravel框架使用心得

    最近在做一项目,是基于laravel的后台api,用于与手机交互的,数据采用json格式.下面说下怎样在两周内把一个新框架或者语言用的得心应手. 项目采用laravel5.4+dingoapi+jwt ...

  7. 看望朋友(家达)--->>对事情的专注及时间效率学习

    本意是想去堕落街吃完饭就回寝室休息了,结果偶遇尹阳,便说是一同去走走.路上边走边聊,我便提议去十教楼顶,十教是全学校最高的教学楼,这也是刘智学长给我说的.在十教楼顶的那种感觉,特别想吹口琴,可惜没有带 ...

  8. Datatables快速入门开发--一款好用的JQuery表格插件

    博主是一个java后端程序员小白,前端技术会用但不精通,做后台的一些功能经常要涉及表格的展示,分页,搜索,排序等等一系列功能,在经历了一段时间的原始手段,开始接触并使用Datatables,一个jqu ...

  9. SSE再学习:灵活运用SIMD指令6倍提升Sobel边缘检测的速度(4000*3000的24位图像时间由180ms降低到30ms)。

    这半年多时间,基本都在折腾一些基本的优化,有很多都是十几年前的技术了,从随大流的角度来考虑,研究这些东西在很多人看来是浪费时间了,即不能赚钱,也对工作能力提升无啥帮助.可我觉得人类所谓的幸福,可以分为 ...

  10. 起床困难综合症[NOI2014]

    [题解] 并不算很困难的贪心题.位运算毕竟是针对每一位的,从前向后处理,如果某一位1比0更优且可取1就使它为1.比较0和1的结果要单取这一位来看,但是题目中所给的参数并没有必要全部二进制分解,直接用十 ...