说明:本例根据笔记(8)中的例子加入注解,代码主体部分大致相同,仅会在HelloWorldController.java(加入注解映射控制器或者控制器方法)与myapp-config.xml(加入启动注解以及注解扫描,省去控制器配置)文件中存在不同。

(一)@Controller注解

  1. 作用:其加在一个控制类前,用于指派spring web mvc控制器。
  2. value特性:其可以加入value特性指定控制器类注册到spring容器的名称。可以类比于前例中 bean 元素的id特性。

(二)@RequestMapping注解

  1. 作用:将传入的请求映射到指定的类或者方法
  2. 特性:
    注意:
    如下对于value特性,value=可以省略,一下二者含义相同:
    @RequestMapping(value="/firstController")
    @RequestMapping("/firstController")

spring controller 参数乱码 spring中@controller作用_mvc

(三)举例说明

HelloWorldController.java说明:

package com.unknown.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

//1.这里用@Controller指定了类HelloWorldController为控制器类
//  并且使用了value特性为其指定了名称 /sayHelloController与之前xml文件中bean的id配置为helloWorldController一样
@Controller(value="/sayHelloController")
//2.这里使用了类型级的@RequestMapping,表示对/saySome路径请求的都交给该控制类的方法
@RequestMapping("/saySome")
public class HelloWorldController{
    //这里使用了方法级的@RequestMapping,表示对/saySome/sayhello路径请求的交给该方法处理
    //注意:这里该方法与之前不同的是它不在接受任何参数
    @RequestMapping("/sayhello")
    public ModelAndView hello() {
        Map<String,String> modelData = new HashMap<String, String>();
        modelData.put("msg","Hello, my first springMVC program");
        //方法将会返回一个包含modelData信息的ModelAndView对象
        return new ModelAndView("helloWorld",modelData);
    }
}

myapp-config.xml说明:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       <!--注意这里mvc= 后边的源变了-->
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://www.springframework.org/schema/cache
       http://www.springframework.org/schema/mvc/spring-cache.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">
    
    <!--这一行用于启动springMVC注释-->
    <mvc:annotation-driven/>
    <!--这一行用于指定注解扫描的路径-->
    <context:component-scan base-package="com.unknown.controller"/>

    <!-- 使用InternalResourceViewResolver
        将ModelAndView对象中的包含视图名的内容(本例中是helloWorld) 定位到具体的视图(/WEB-INF/jsp/helloWorld.jsp)
        其实就是将对应的请求的url路径映射到指定的视图(即某jsp文件)
     -->
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--这里指定要给名称加上的对应的前缀与后缀
                prefix 前缀    suffix 后缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

运行结果:访问http://localhost:8080/helloworld/saySome/sayhello

spring controller 参数乱码 spring中@controller作用_xml_02

小坑:报错Servlet.init() for servlet [***] threw exception
原因:配置文件中加入了mvc注解启动项 mvc:annotation-driven,xml文件不能对其解析
解决办法:对myapp-config.xml的命名空间进行修改
1.修改:

xmlns:mvc="http://www.springframework.org/schema/mvc"

2.xsi:schemaLocation=处增加:

http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"

(四)@RequestMapping注解的组合注解

以GET方法为例:
如下表述(同时说明了value特性与method特性):

@RequestMapping(value="xxx",method=RequestMethod.GET)

可以改写为:

@GetMapping(value="xxx")

Spring的4.3版本中的组合注解及其描述如下所示:
@GetMapping:匹配GET方式的请求;
@PostMapping:匹配POST方式的请求;
@PutMapping:匹配PUT方式的请求;
@DeleteMapping:匹配DELETE方式的请求;
@PatchMapping:匹配PATCH方式的请求。

以上基本上是注解使用的基本情况,当然对于@RequestMapping注解的其他特性的使用方法较为冗杂,涉及到参数和返回对象,不宜一起举例(菜鸡我以后遇到再慢慢整理),以上内容如果有错误,欢迎指出,不胜感激。