Skip to content

@Controller注解的用法 #17

@bitfishxyz

Description

@bitfishxyz

@controller@RestController 有什么区别?

SpringMVC会将Controller路由的返回值当做ModelAndView来处理,而尝试将@RestController的返回值转化为JSON格式的字符串并返回给客户端。

@RestController == @Controller + @ResopnseBody

如何通过配置文件定义一个Controller?

  1. 编写一个实现org.springframework.web.servlet.mvc.Controller接口的类
  2. 在配置文件中建立映射关系
package controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RootHandler implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("name", "Tom");
        modelAndView.setViewName("root");
        return modelAndView;
    }
}
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/">rootHandler</prop>
            </props>
        </property>
    </bean>
    <bean id="rootHandler" class="controller.RootHandler"/>

如何通过注解定义一个Controller?

  1. 在配置文件中开启注解扫描

        <context:component-scan base-package="controller"/>
        <mvc:annotation-driven/>
  2. 通过注解定义Controller以及路由映射关系

    @Controller
    public class AppHandler {
        @RequestMapping("/app")
        public ModelAndView app(){
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("name", "GitHub");
            modelAndView.setViewName("app");
            return modelAndView;
        }
    }
  3. 将视图名称和视图的实际位置的关系告知SpringMVC

        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/views/"/>
            <property name="suffix" value=".jsp"/>
        </bean>

    这样,SpringMVC就会将视图app对应到WEB-INF/views/app.jsp,同时将 name: GitHub这个数据填充到app这个视图中。

注解驱动的Controller有几种写法?

根据返回值类型的不同,分为三种:

@Controller
public class AppHandler {
    @RequestMapping("/app")
    public ModelAndView app(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("name", "GitHub");
        modelAndView.setViewName("app");
        return modelAndView;
    }

    @RequestMapping("/app/model")
    public String user(Model model){
        model.addAttribute("name", "Twitter");
        return "root";
    }
    
    @RequestMapping("/app/map")
    public String map(Map<String, String> model){
        model.put("name", "StackOverflow");
        return "root";
    }
}

第一种返回值是一个ModelAndView对象。

第二种返回值是String类型,SpringMVC会将这个String看作是view的名称。而Model对象则是通过参数传递进来的。

第三种返回值也是String类型,SpringMVC会将这个String看作是view的名称。而数据对象则是以Map的形式存在。

后面两者可以看做是第一种写法的语法糖。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions