<?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 https://www.springframework.org/schema/context/spring-context.xsd"> <!--配置包扫描--> <context:component-scan base-package="com.chy.controller" /> <!-- 配置注解的HandlerMapping--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> <!--配置注解的HandlerAdapter--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" /> <!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/" /> <!--后缀--> <property name="suffix" value=".jsp" /> </bean> </beans>
上面咱们手动配置了HandlerMapping、HandlerAdpater,很麻烦。能够使用注解驱动:web
<mvc:annotation-driven />
会自动注册HandlerMapping、HandlerAdapter,无需咱们手动配置。ajax
//在controller上标注@Controller @org.springframework.stereotype.Controller public class UserController{ //在业务方法上标注@RequestMapping @RequestMapping("/userController") public ModelAndView handle(){ ModelAndView mav = new ModelAndView("user_info"); User user = new User(); user.setUsername("chy"); user.setPassword("abcd"); mav.addObject("user", user); return mav; } }
(使用xml配置须要在xml中配置此controller的<bean>,麻烦且xml文件冗杂)spring
(使用xml配置时controller中只能有1个业务方法,这很不方便,好比UserController,要有saveUser、updateUser、queryUser等多个方法)mvc
(使用xml配置时参数类型、返回值都是固定的,ajax查询数据、访问静态页面,都须要返回ModelAndView,没有必要)app
通常都是使用注来配置。jsp
@RequestMapping(value = "/userController") //只有value一个属性时可简写 @RequestMapping("/userController") //能够不要开头的斜杠 @RequestMapping(value = "userController") @RequestMapping("userController")
以上4种写法等价,红色标示的写法最经常使用。工具
访问路径都是:url
http://localhost:8080/springmvc_war_exploded/userController //也能够在末尾加上.do http://localhost:8080/springmvc_war_exploded/userController.do
@RequestMapping(value = "/userController",method = RequestMethod.GET) @RequestMapping(value = "/userController",method = RequestMethod.POST)
只有请求地址符合,且请求方式是GET|POST时,才使用此方法处理业务。spa
以上2个注解分别等价于:设计
@GetMapping(value = "/userController") @PostMapping(value = "/userController")
有时候controller中有多个业务方法:
@org.springframework.stereotype.Controllerpublic class UserController{ @RequestMapping("/userController/saveUser") public void saveUser(){ //...... } @RequestMapping("/userController/deleteUser") public void deleteUser(){ //...... } @RequestMapping("/userController/updateUser") public void updateUser(User user){ //...... } @RequestMapping("/userController/queryUser") public User queryUser(){ //...... } }
每次url都要写一长串,麻烦。
能够把共同的父路径提出来,写在controller上,业务方法上写子路径便可:
@org.springframework.stereotype.Controller @RequestMapping("/userController") public class UserController{ @RequestMapping("/saveUser") public void saveUser(){ //...... } @RequestMapping("/deleteUser") public void deleteUser(){ //...... } @RequestMapping("/updateUser") public void updateUser(User user){ //...... } @RequestMapping("/queryUser") public User queryUser(){ //...... } }
访问方式和原来同样。
我在业务方法中使用了new,实际上,使用spring时,尽可能不要使用new,能用依赖注入就用依赖注入。
若是是通用的bean,好比工具类,实例都同样,设计为单例,放到spring容器中,使用时写成成员变量的形式,用注解自动装配。
若是是实例不同,好比User类,每一个用户的信息是不一样的,设计为多例,放到spring容器中,使用时写成成员变量的形式,用注解自动装配,能够在方法中调用bean的setter方法赋值。