Spring MVC的注解
1.DispatcherServlet
DispatcherServlet的全名:
org.Springframework.web.servlet.DispatcherServlet
它在程序中充當(dāng)著前端控制器的角色。
【示例】在使用DispatcherServlet時(shí),只需將其配置在項(xiàng)目的web.xml文件中,其配置代碼如下。
<servlet>
<!--配置前端過濾器-->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化時(shí)加載配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!--表示容器在啟動(dòng)時(shí)立即加載Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
在上述代碼中,<load-on-startup>
元素和<init-param>
元素都是可選的。如果<load-on-startup>
元素的值為1,在應(yīng)用程序啟動(dòng)時(shí)就會(huì)立即加載該Servlet;如果<load-on-startup>
元素不存在,應(yīng)用程序會(huì)就在第一個(gè)Servlet請(qǐng)求時(shí)加載該Servlet。如果<init-param>
元素存在并且通過其子元素配置了Spring MVC配置文件的路徑,應(yīng)用程序在啟動(dòng)時(shí)就會(huì)加載配置路徑下的配置文件;如果沒有通過<init-param>
元素配置,應(yīng)用程序就會(huì)默認(rèn)到WEB-INF目錄下尋找如下方式命名的配置文件。
servletName-servlet.xml
servletName指的是部署在web.xml中的DispatcherServlet的名稱,在上面web.xml中的配置代碼中即為springmvc,而-servlet.xml是配置文件名的固定寫法,所以應(yīng)用程序會(huì)在WEB-INF下尋找springmvc-servlet.xml。
2.Controller注解類型
org.springframework.stereotype.Controller注解類型用于指示Spring類的實(shí)例是一個(gè)控制器,其注解形式為@Controller
。該注解在使用時(shí)不需要再實(shí)現(xiàn)Controller接口,只需要將@Controller注解加入控制器類上,然后通過Spring的掃描機(jī)制找到標(biāo)注了該注解的控制器即可。
【示例】@Controller注解在控制器類中的使用示例如下。
package com.ssm.controller;
import org.springframework.stereotype.Controller;
......
//Controller注解
@Controller
public class ControllerTest{
......
}
為了保證Spring能夠找到控制器類,還需要在Spring MVC的配置文件中添加相應(yīng)的掃描配置信息,具體如下。
(1)在配置文件的聲明中引入spring-context
。
(2)使用<context: component-scan>
元素指定需要掃描的類包。
完整的配置文件如下。
<?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-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 指定需要掃描的包 -->
<context:component-scan base-package="com.ssm.controller"/>
</beans>
<context: component-scan>
元素的屬性base-package指定了需要掃描的類包為com.ssm.controller。在運(yùn)行時(shí),該類包及其子包下所有標(biāo)注了注解的類都會(huì)被Spring所處理。與實(shí)現(xiàn)了Controller接口的方式相比,使用注解的方式顯然更加簡單。同時(shí),Controller接口的實(shí)現(xiàn)類只能處理一個(gè)單一的請(qǐng)求動(dòng)作,而基于注解的控制器可以同時(shí)處理多個(gè)請(qǐng)求動(dòng)作,在使用上更加靈活。因此,在實(shí)際開發(fā)中通常都會(huì)使用基于注解的形式。
注意
使用注解方式時(shí),程序的運(yùn)行需要依賴Spring的AOP包,因此需要向lib目錄中添加spring.aop-4.3.6 RELEASE.jar,否則程序運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。
3.RequestMapping注解類型
(1)@RequestMapping注解的使用
Spring通過@Controller注解找到相應(yīng)的控制器類后,還需要知道控制器內(nèi)部對(duì)每一個(gè)請(qǐng)求是如何處理的,這就需要使用org.springframework.web.bind.annotation.RequestMapping
注解類型。RequestMapping用于映射一個(gè)請(qǐng)求或一個(gè)方法,其注解形式為@RequestMapping,可以使用該注解標(biāo)注在一個(gè)方法或一個(gè)類上。
(1)標(biāo)注在方法上
當(dāng)標(biāo)注在一個(gè)方法上時(shí),該方法將成為一個(gè)請(qǐng)求處理方法,它會(huì)在程序接收到對(duì)應(yīng)的URL請(qǐng)求時(shí)被調(diào)用。
【示例】使用@RequestMapping注解標(biāo)注在方法上的示例如下。
package com.ssm.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
......
//Controller注解
@org.springframework.stereotype.Controller
public class AnnotationControllerTest {
//@RequestMapping注解標(biāo)注再方法上
@RequestMapping(value="/annotationController")
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1)throws Exception{
......
return m;
}
}
使用@RequestMapping注解后,上述代碼中的handleRequest()方法就可以通過地址http://localhost:8080/chapter11/annotationController
進(jìn)行訪問。
(2)標(biāo)注在類上
當(dāng)標(biāo)注在一個(gè)類上時(shí),該類中的所有方法都將映射為相對(duì)于類級(jí)別的請(qǐng)求,表示該控制器所處理的所有請(qǐng)求都被映射到value屬性值所指定的路徑下。
//Controller注解
@Controller
//@RequestMapping注解標(biāo)注再方法上
@RequestMapping(value = "/controll")
public class AnnotationControllerTest {
@RequestMapping(value="/annotationController")
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1)throws Exception{
......
return m;
}
}
由于在類上添加了@RequestMapping注解,并且其value屬性值為“/controll”,因此上述代碼方法的請(qǐng)求路徑將變?yōu)閔ttp://localhost:8080/chapter11/controll/annotationController。如果該類中還包含其他方法,那么在其他方法的請(qǐng)求路徑中也需要加入“/ control”。
(2)@RequestMapping注解的屬性
@RequestMapping注解除了可以指定value屬性外,還可以指定一些其他屬性,如表所示。
所有屬性都是可選的,但其默認(rèn)屬性是value。當(dāng)value是其唯一屬性時(shí),可以省略屬性名,例如下面兩種標(biāo)注的含義相同。
@RequestMapping(value="/annotationController")
@RequestMapping("/annotationController")
(3) 組合注解
前面已經(jīng)對(duì)@RequestMapping注解及其屬性進(jìn)行了詳細(xì)講解,而在Spring 4.3版本中引入了組合注解來幫助簡化常用的HTTP方法的映射,并更好地表達(dá)被注解方法的語義。其組合注解如下所示。
- @GetMapping:匹配GET方式的請(qǐng)求。
- @PostMapping:匹配POST方式的請(qǐng)求。
- @PutMapping:匹配PUT方式的請(qǐng)求。
- @DeleteMapping:匹配DELETE方式的請(qǐng)求。
- @PatchMapping:匹配PATCH方式的請(qǐng)求。
以@GetMapping為例,該組合注解是@RequestMapping(method=RequestMethod.GET)
的縮寫,它會(huì)將Http Get映射到特定的處理方法上。在實(shí)際開發(fā)中,傳統(tǒng)的@RequestMapping注解使用方式如下。
@RequestMapping(value="/user/{id}",method = RequestMethod.GET)
public String selectUserById(string id){
......
}
而使用新注解@GetMapping后,可以省略method屬性,從而簡化代碼,使用方式如下。
@GetMapping(value="/user/{fid}")
public String selectUserById(string id){
......
}
(4)請(qǐng)求處理方法的參數(shù)類型和返回類型
在控制器類中,每一個(gè)請(qǐng)求處理方法都可以有多個(gè)不同類型的參數(shù),以及一個(gè)多種類型的返回結(jié)果。之前handleRequest()方法的參數(shù)就是對(duì)應(yīng)請(qǐng)求的HttpServletRequest和HttpServletResponse兩種參數(shù)類型。除此之外,還可以使用其他的參數(shù)類型,例如在請(qǐng)求處理方法中需要訪問HttpSession對(duì)象,就可以添加HttpSession作為參數(shù),Spring會(huì)將對(duì)象正確地傳遞給方法,其使用示例如下。
@RequestMapping(value="/annotationController")
public ModelAndView (httpSession session)
{
......
return m;
}
在請(qǐng)求處理方法中,可以出現(xiàn)的參數(shù)類型如下。
javax.servlet.ServletRequest/javax.servlet.http.HttpServletRequest
javax.servlet.ServletResponse/javax.servlet.http.HttpServletResponse
javax.servlet.http.HttpSession
org.springframework.web.context.request.WebRequest或
org.springframework.web.context.request.NativeWebRequest
java.util.Locale
java.util.TimeZone (Java 6+)/java.time.Zoneld(on Java 8)
java.io.InputStream/java.io.Reader
Java.io.OutputStream/java.io.Writer
org.springframework.http.HttpMethod
java.security.Principal
@PathVariable、@MatrixVariable、@RequestParam、@RequestHeader、@RequestBody、
@RequestPart、@SessionAttribute、@RequestAttribute注解
HttpEntity<?>
java.util.Map/org.springframework.ui.Model/lorg.springframework.ui.ModelMap
org.springframework.web.servlet.mvc.support.RedirectAttributes
org.springframework.validation.Errors/org.springframework.validation.BindingResult
org.springframework.web.bind.support.SessionStatus
org.springframework.web.util.UriComponentsBuilder
注意
org.springframework.ui.Model類型不是一個(gè)Servlet API類型,而是一個(gè)包含Map對(duì)象的Spring MVC類型。如果方法中添加了Model參數(shù),那么每次調(diào)用該請(qǐng)求處理方法時(shí),Spring MVC都會(huì)創(chuàng)建Model對(duì)象,并將其作為參數(shù)傳遞給方法。
入門案例中,請(qǐng)求處理方法返回的是一個(gè)ModelAndView類型的數(shù)據(jù)。除了這種類型外,請(qǐng)求處理方法還可以返回其他類型的數(shù)據(jù)。Spring MVC所支持的常見方法返回類型如下。
ModelAndView
Model
Map
View
String
void
HttpEntity<?>或ResponseEntity<?>
Callable<?>
DeferredResult<?>
在上述列舉的返回類型中,常見的返回類型有ModelAndView、String和void。其中,ModelAndView類型中可以添加Model數(shù)據(jù),并指定視圖;String類型的返回值可以跳轉(zhuǎn)視圖,但不能攜帶數(shù)據(jù);而void類型主要在異步請(qǐng)求時(shí)使用,它只返回?cái)?shù)據(jù),而不會(huì)跳轉(zhuǎn)視圖。
由于ModelAndView類型未能實(shí)現(xiàn)數(shù)據(jù)與視圖之間的解耦,因此在開發(fā)時(shí),方法的返回類型通常都會(huì)使用String。既然String類型的返回值不能攜帶數(shù)據(jù),那么在方法中是如何將數(shù)據(jù)帶入視圖頁面呢?這就用到了上面所講解的Model參數(shù)類型,通過該參數(shù)類型即可添加需要在視圖中顯示的屬性。
返回String類型方法的示例代碼如下。
@RequestMapping(value="/annotationController")
public String handleRequest(HttpServletRequest arg0, HttpServletResponse arg1,
Model model)throws Exception{
model.addAttribute("msg","第一個(gè)Spring MVC程序");
return "/WEB-INF/jsp/welcome.jsp";
}
在上述方法代碼中增加了一個(gè)Model類型的參數(shù),通過該參數(shù)實(shí)例的addAttribute()方法即可添加所需數(shù)據(jù)。String類型除了可以返回上述代碼中的視圖頁面外,還可以進(jìn)行復(fù)位向與請(qǐng)求轉(zhuǎn)發(fā),具體方式如下。
(1)redirect復(fù)位向
例如,在修改用戶信息操作后,將請(qǐng)求復(fù)位向到用戶查詢方法的實(shí)現(xiàn)代碼如下。
@RequestMapping(value="/update")
public String update(HttpServletRequest request, HttpServletResponse response,
Model model){
//復(fù)位向請(qǐng)求路徑
return "redirect: queryUser";
}
(2)forward請(qǐng)求轉(zhuǎn)發(fā)
例如,用戶執(zhí)行修改操作時(shí),轉(zhuǎn)發(fā)到用戶修改頁面的實(shí)現(xiàn)代碼如下。
@RequestMapping(value="/toEdit")
public String toEdit(HttpServletRequest request, HttpServletResponse response,
Model model){
//復(fù)位向請(qǐng)求路徑
return "forward: editUser";
}
4.ViewResolver(視圖解析器)
Spring MVC中的視圖解析器負(fù)責(zé)解析視圖,可以在配置文件中定義一個(gè)ViewResolver來配置視圖解析器,其配置示例如下。文章來源:http://www.zghlxwxcb.cn/news/detail-499394.html
<!--定義視圖解析器-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--設(shè)置前綴-->
<property name="prefix" value="/WEB-INF/jsp/" />
<!--設(shè)置后綴-->
<property name="suffix" value=".isp" />
</bean>
在上述代碼中定義了一個(gè)id為viewResolver的視圖解析器,并設(shè)置了視圖的前綴和后綴屬性。這樣設(shè)置后,方法中所定義的view路徑將可以簡化。例如,入門案例中的邏輯視圖名只需設(shè)置為“welcome”,而不再需要設(shè)置為“/WEB-INF/jsp/welcome.jsp”,在訪問時(shí)視圖解析器會(huì)自動(dòng)地增加前綴和后綴。文章來源地址http://www.zghlxwxcb.cn/news/detail-499394.html
到了這里,關(guān)于【Spring】— Spring MVC的注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!