基於註解的 Spring MVC詳解
以下內容是自己經過研究和學習SpringMVC、經過自己整理資料、官方文件所得:
web.xml 配置:<servlet>
<servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <description>載入/WEB-INF/spring-mvc/目錄下的所有XML作為Spring MVC的配置檔案</description> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc/*.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping>
這樣,所有的.htm的請求,都會被DispatcherServlet處理;
初始化 DispatcherServlet 時,該框架在 web 應用程式WEB-INF 目錄中尋找一個名為[servlet-名稱]-servlet.xml的檔案,並在那裡定義相關的Beans,重寫在全域性中定義的任何Beans,像上面的web.xml中的程式碼,對應的是dispatcher-servlet.xml;當然也可以使用<init-param>元素,手動指定配置檔案的路徑;
dispatcher-servlet.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" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 使Spring支援自動檢測元件,如註解的Controller --> <context:component-scan base-package="com.minx.crm.web.controller"/> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> </beans>
第一個Controller:
package com.minx.crm.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class IndexController { @RequestMapping("/index") public String index() { return "index"; } }
@Controller註解標識一個控制器,@RequestMapping註解標記一個訪問的路徑(/index.htm),return "index"標記返回檢視(index.jsp);
注:如果@RequestMapping註解在類級別上,則表示一相對路徑,在方法級別上,則標記訪問的路徑;
從@RequestMapping註解標記的訪問路徑中獲取引數:
Spring MVC 支援RESTful風格的URL引數,如:
@Controller public class IndexController { @RequestMapping("/index/{username}") public String index(@PathVariable("username") String username) { System.out.print(username); return "index"; } }
在@RequestMapping中定義訪問頁面的URL模版,使用{}傳入頁面引數,使用@PathVariable 獲取傳入引數,即可通過地址:http://localhost:8080/crm/index/tanqimin.htm 訪問;
根據不同的Web請求方法,對映到不同的處理方法:
使用登陸頁面作示例,定義兩個方法分辨對使用GET請求和使用POST請求訪問login.htm時的響應。可以使用處理GET請求的方法顯示檢視,使用POST請求的方法處理業務邏輯;
@Controller public class LoginController { @RequestMapping(value = "/login", method = RequestMethod.GET) public String login() { return "login"; } @RequestMapping(value = "/login", method = RequestMethod.POST) public String login2(HttpServletRequest request) { String username = request.getParameter("username").trim(); System.out.println(username); return "login2"; } }
在檢視頁面,通過位址列訪問login.htm,是通過GET請求訪問頁面,因此,返回登陸表單檢視login.jsp;當在登陸表單中使用POST請求提交資料時,則訪問login2方法,處理登陸業務邏輯;
防止重複提交資料,可以使用重定向檢視:
return "redirect:/login2"
可以傳入方法的引數型別:
@RequestMapping(value = "login", method = RequestMethod.POST)
public String testParam(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
String username = request.getParameter("username");
System.out.println(username);
return null;
}
可以傳入HttpServletRequest、HttpServletResponse、HttpSession,值得注意的是,如果第一次訪問頁面,HttpSession沒被建立,可能會出錯;
其中,String username = request.getParameter("username");可以轉換為傳入的引數:
@RequestMapping(value = "login", method = RequestMethod.POST) public String testParam(HttpServletRequest request, HttpServletResponse response, HttpSession session,@RequestParam("username") String username) { String username = request.getParameter("username"); System.out.println(username); return null; }
使用@RequestParam 註解獲取GET請求或POST請求提交的引數;
獲取Cookie的值:使用@CookieValue :
獲取PrintWriter:
可以直接在Controller的方法中傳入PrintWriter物件,就可以在方法中使用:
@RequestMapping(value = "login", method = RequestMethod.POST) public String testParam(PrintWriter out, @RequestParam("username") String username) { out.println(username); return null; }
獲取表單中提交的值,並封裝到POJO中,傳入Controller的方法裡:
POJO如下(User.java):
public class User{ private long id; private String username; private String password; …此處省略getter,setter... }
通過表單提交,直接可以把表單值封裝到User物件中:
@RequestMapping(value = "login", method = RequestMethod.POST) public String testParam(PrintWriter out, User user) { out.println(user.getUsername()); return null; }
可以把物件,put 入獲取的Map物件中,傳到對應的檢視:
@RequestMapping(value = "login", method = RequestMethod.POST)
public String testParam(User user, Map model) {
model.put("user",user);
return "view";
}
在返回的view.jsp中,就可以根據key來獲取user的值(通過EL表示式,${user }即可);
Controller中方法的返回值:
void:多數用於使用PrintWriter輸出響應資料;
String 型別:返回該String對應的View Name;
任意型別物件:
返回ModelAndView:
自定義檢視(JstlView,ExcelView):
攔截器(Inteceptors):
public class MyInteceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o)
throws Exception {
return false;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView mav)
throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception excptn)
throws Exception {
}
}
攔截器需要實現HandleInterceptor介面,並實現其三個方法:
preHandle:攔截器的前端,執行控制器之前所要處理的方法,通常用於許可權控制、日誌,其中,Object o表示下一個攔截器;
postHandle:控制器的方法已經執行完畢,轉換成檢視之前的處理;
afterCompletion:檢視已處理完後執行的方法,通常用於釋放資源;
在MVC的配置檔案中,配置攔截器與需要攔截的URL:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/index.htm" /> <bean class="com.minx.crm.web.interceptor.MyInterceptor" /> </mvc:interceptor> </mvc:interceptors>
國際化:
在MVC配置檔案中,配置國際化屬性檔案:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="message"> </bean>
那麼,Spring就會在專案中搜尋相關的國際化屬性檔案,如:message.properties、message_zh_CN.properties
在VIEW中,引入Spring標籤:<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>,使用<spring:message code="key" />呼叫,即可;
如果一種語言,有多個語言檔案,可以更改MVC配置檔案為:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>message01</value> <value>message02</value> <value>message03</value> </list> </property> </bean>
相關文章
- Spring MVC 常用註解的使用2019-02-19SpringMVC
- Spring基於註解的aop配置2020-12-14Spring
- Spring基於註解的IoC配置2018-09-20Spring
- Spring Aop基於註解的實現2020-07-04Spring
- Spring中基於註解方式的AOP操作2019-04-10Spring
- Spring7——開發基於註解形式的spring2020-06-25Spring
- spring mvc 框架搭建及詳解2019-01-14SpringMVC框架
- Spring IoC 公共註解詳解2020-07-08Spring
- Spring MVC常用註解,你會幾個?2018-05-04SpringMVC
- Spring基於註解實現 AOP 切面功能2024-12-02Spring
- Spring零配置之@Configuration註解詳解2018-05-04Spring
- spring mvc(註解)上傳檔案的簡單例子2019-01-07SpringMVC單例
- Spring / Spring boot 基於註解非同步程式設計@Async2018-06-15Spring Boot非同步程式設計
- spring基於註解配置實現事務控制2020-10-28Spring
- 省掉bean自定義spring mvc註解注入json值2019-04-05BeanSpringMVCJSON
- Spring 常用的註解以及對應 XML 配置詳解2024-07-23SpringXML
- Spring @Conditional註解 詳細講解及示例2020-04-05Spring
- Spring Boot Hello World 基於 IDEA 案例詳解2023-02-21Spring BootIdea
- Spring Boot 基於 SCRAM 認證整合 Kafka 的詳解2024-08-05Spring BootKafka
- 基於註解的方式使用spring-integration-redis分散式鎖2019-04-08SpringRedis分散式
- Spring 框架基礎(06):Mvc架構模式簡介,執行流程詳解2019-12-06Spring框架MVC架構模式
- Spring MVC檔案請求處理詳解:MultipartResolver2022-11-28SpringMVC
- Spring註解2018-12-19Spring
- 【Spring註解】事務註解@Transactional2024-06-18Spring
- Lombok 註解詳解2020-02-11Lombok
- @FeignClient註解詳解2020-10-11client
- Java 註解詳解2020-11-26Java
- Java註解詳解2019-02-26Java
- spring上 -基於註解配置bean,動態代理,AOP筆記2024-10-16SpringBean筆記
- Spring Boot 基於註解驅動原始碼分析--自動配置2018-08-28Spring Boot原始碼
- spring事物配置,宣告式事務管理和基於@Transactional註解的使用2018-03-11Spring
- Spring事務的介紹,以及基於註解@Transactional的宣告式事務2021-11-02Spring
- Spring 註解學習 詳細程式碼示例2020-08-03Spring
- Spring新註解2020-11-12Spring
- Spring常用註解2021-02-05Spring
- Spring註解大全2019-02-12Spring
- Spring boot註解2018-09-18Spring Boot
- Spring : @SessionAttributes註解2018-08-20SpringSession
- Spring中重要的註解2019-06-13Spring