使用注解配置spring mvc
(1)spring mvc的配置文件
<?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,很麻煩。可以使用注解驅動:
<mvc:annotation-driven />
會自動注冊HandlerMapping、HandlerAdapter,無需我們手動配置。
(2)controller
//在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; } }
- controller不必實現接口,只需要在controller上標注@Controller,無需在xml中配置controller的<bean>
(使用xml配置需要在xml中配置此controller的<bean>,麻煩且xml文件冗雜)
- controller中可以有多個業務方法
(使用xml配置時controller中只能有1個業務方法,這很不方便,比如UserController,要有saveUser、updateUser、queryUser等多個方法)
- 業務方法的參數類型、返回值類型可以是任意的
(使用xml配置時參數類型、返回值都是固定的,ajax查詢數據、訪問靜態頁面,都需要返回ModelAndView,沒有必要)
一般都是使用注來配置。
@RequestMapping 配置業務方法
(1)value指定此業務方法對應(映射)的url
@RequestMapping(value = "/userController") //只有value一個屬性時可簡寫 @RequestMapping("/userController") //可以不要開頭的斜杠 @RequestMapping(value = "userController") @RequestMapping("userController")
以上4種寫法等價,紅色標示的寫法最常用。
訪問路徑都是:
http://localhost:8080/springmvc_war_exploded/userController //也可以在末尾加上.do http://localhost:8080/springmvc_war_exploded/userController.do
(3)method 指定請求方式
@RequestMapping(value = "/userController",method = RequestMethod.GET) @RequestMapping(value = "/userController",method = RequestMethod.POST)
只有請求地址符合,且請求方式是GET|POST時,才使用此方法處理業務。
以上2個注解分別等價於:
@GetMapping(value = "/userController") @PostMapping(value = "/userController")
(4)url映射的拼接
有時候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方法賦值。