-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
Description
@controller 和 @RestController 有什么区别?
SpringMVC会将Controller路由的返回值当做ModelAndView来处理,而尝试将@RestController的返回值转化为JSON格式的字符串并返回给客户端。
@RestController == @Controller + @ResopnseBody
如何通过配置文件定义一个Controller?
- 编写一个实现
org.springframework.web.servlet.mvc.Controller接口的类 - 在配置文件中建立映射关系
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?
-
在配置文件中开启注解扫描
<context:component-scan base-package="controller"/> <mvc:annotation-driven/>
-
通过注解定义Controller以及路由映射关系
@Controller public class AppHandler { @RequestMapping("/app") public ModelAndView app(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("name", "GitHub"); modelAndView.setViewName("app"); return modelAndView; } }
-
将视图名称和视图的实际位置的关系告知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的形式存在。
后面两者可以看做是第一种写法的语法糖。