真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringMVC的工作流程和使用

這篇文章主要介紹“Spring MVC的工作流程和使用”,在日常操作中,相信很多人在Spring MVC的工作流程和使用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Spring MVC的工作流程和使用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括烏海海南網(wǎng)站建設(shè)、烏海海南網(wǎng)站制作、烏海海南網(wǎng)頁(yè)制作以及烏海海南網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,烏海海南網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到烏海海南省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

流程:

(1)首先用戶發(fā)送請(qǐng)求——>DispatcherServlet,前端控制器收到請(qǐng)求后自己不進(jìn)行處理,而是委托給其他的解析器進(jìn)行處理,作為統(tǒng)一訪問(wèn)點(diǎn),進(jìn)行全局的流程控制;

(2)DispatcherServlet——>HandlerMapping,映射處理器將會(huì)把請(qǐng)求映射為HandlerExecutionChain對(duì)象(包含一個(gè)Handler處理器(頁(yè)面控制器)對(duì)象、多個(gè)HandlerInterceptor攔截器)對(duì)象;

(3)DispatcherServlet——>HandlerAdapter,處理器適配器將會(huì)把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設(shè)計(jì)模式的應(yīng)用,從而很容易支持很多類型的處理器;

(4)HandlerAdapter——>調(diào)用處理器相應(yīng)功能處理方法,并返回一個(gè)ModelAndView對(duì)象(包含模型數(shù)據(jù)、邏輯視圖名);

(5)ModelAndView對(duì)象(Model部分是業(yè)務(wù)對(duì)象返回的模型數(shù)據(jù),View部分為邏輯視圖名)——> ViewResolver, 視圖解析器將把邏輯視圖名解析為具體的View;

(6)View——>渲染,View會(huì)根據(jù)傳進(jìn)來(lái)的Model模型數(shù)據(jù)進(jìn)行渲染,此處的Model實(shí)際是一個(gè)Map數(shù)據(jù)結(jié)構(gòu);

(7)返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶,到此一個(gè)流程結(jié)束。

配置DispatcherServlet

DispatcherServlet是一個(gè)Servlet,所以可以配置多個(gè)DispatcherServlet。

DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請(qǐng)求,Servlet攔截匹配規(guī)則要自已定義,把攔截下來(lái)的請(qǐng)求,依據(jù)某某規(guī)則分發(fā)到目標(biāo)Controller(我們寫的Action)來(lái)處理。

web.xml:


   DispatcherServlet
       org.springframework.web.servlet.DispatcherServlet
       
            contextConfigLocation
            classpath:springmvc-servlet.xml
       


      DispatcherServlet
      /

這里主要有點(diǎn)需要注意:

(1)classpath:springmvc-servlet.xml 用于加載類路徑下的springmvc配置文件,文件名可以自定義。如果不定義標(biāo)簽則默認(rèn)加載配置文件的路徑是WEB-INF下。

(2)/表示所有請(qǐng)求都會(huì)被過(guò)濾。

springmvc-servlet.xml:




      
    
    
    
    
    
    
    
    
    
    
        
        
    
    
    
    
        
            
                error
            
            
    

 掃描指定的包中的類上的注解,常用的注解有:

@Controller 聲明Action組件
@Service    聲明Service組件    @Service("myMovieLister") 
@Repository 聲明Dao組件
@Component   泛指組件, 當(dāng)不好歸類時(shí). 
@RequestMapping("/menu")  請(qǐng)求映射
@Resource  用于注入,( j2ee提供的 ) 默認(rèn)按名稱裝配,@Resource(name="beanName") 
@Autowired 用于注入,(srping提供的) 默認(rèn)按類型裝配 
@Transactional( rollbackFor={Exception.class}) 事務(wù)管理
@ResponseBody
@Scope("prototype")   設(shè)定bean的作用域

是一種簡(jiǎn)寫形式,完全可以手動(dòng)配置替代這種簡(jiǎn)寫形式,簡(jiǎn)寫形式可以讓初學(xué)都快速應(yīng)用默認(rèn)配置方案。 會(huì)自動(dòng)注冊(cè)DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter 兩個(gè)bean,是spring MVC為@Controllers分發(fā)請(qǐng)求所必須的。
并提供了:數(shù)據(jù)綁定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,讀寫XML的支持(JAXB),讀寫JSON的支持(Jackson)。

Spring 統(tǒng)一異常處理有 3 種方式,分別為:

  1. 使用 @ ExceptionHandler 注解

  2. 實(shí)現(xiàn) HandlerExceptionResolver 接口

  3. 使用 @controlleradvice 注解

使用 @ ExceptionHandler 注解

使用該注解有一個(gè)不好的地方就是:進(jìn)行異常處理的方法必須與出錯(cuò)的方法在同一個(gè)Controller里面。使用如下:

@Controller      
public class GlobalController {               

   /**    
     * 用于處理異常的    
     * @return    
     */      
    @ExceptionHandler({MyException.class})       
    public String exception(MyException e) {       
        System.out.println(e.getMessage());       
        e.printStackTrace();       
        return "exception";       
    }       

    @RequestMapping("test")       
    public void test() {       
        throw new MyException("出錯(cuò)了!");       
    }                    
}

可以看到,這種方式最大的缺陷就是不能全局控制異常。每個(gè)類都要寫一遍。

實(shí)現(xiàn) HandlerExceptionResolver 接口

這種方式可以進(jìn)行全局的異??刂啤@纾?/p>

@Component  
public class ExceptionTest implements HandlerExceptionResolver{  

    /**  
     * TODO 簡(jiǎn)單描述該方法的實(shí)現(xiàn)功能(可選).  
     * @see org.springframework.web.servlet.HandlerExceptionResolver#resolveException(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)  
     */   
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  
            Exception ex) {  
        System.out.println("This is exception handler method!");  
        return null;  
    }  
}

使用 @ControllerAdvice+ @ ExceptionHandler 注解

上文說(shuō)到 @ ExceptionHandler 需要進(jìn)行異常處理的方法必須與出錯(cuò)的方法在同一個(gè)Controller里面。那么當(dāng)代碼加入了 @ControllerAdvice,則不需要必須在同一個(gè) controller 中了。這也是 Spring 3.2 帶來(lái)的新特性。從名字上可以看出大體意思是控制器增強(qiáng)。 也就是說(shuō),@controlleradvice + @ ExceptionHandler 也可以實(shí)現(xiàn)全局的異常捕捉。

請(qǐng)確保此WebExceptionHandle 類能被掃描到并裝載進(jìn) Spring 容器中。

@ControllerAdvice
@ResponseBody
public class WebExceptionHandle {
    private static Logger logger = LoggerFactory.getLogger(WebExceptionHandle.class);
    /**
     * 400 - Bad Request
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public ServiceResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
        logger.error("參數(shù)解析失敗", e);
        return ServiceResponseHandle.failed("could_not_read_json");
    }
    
    /**
     * 405 - Method Not Allowed
     */
    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public ServiceResponse handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
        logger.error("不支持當(dāng)前請(qǐng)求方法", e);
        return ServiceResponseHandle.failed("request_method_not_supported");
    }

    /**
     * 415 - Unsupported Media Type
     */
    @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
    public ServiceResponse handleHttpMediaTypeNotSupportedException(Exception e) {
        logger.error("不支持當(dāng)前媒體類型", e);
        return ServiceResponseHandle.failed("content_type_not_supported");
    }

    /**
     * 500 - Internal Server Error
     */
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(Exception.class)
    public ServiceResponse handleException(Exception e) {
        if (e instanceof BusinessException){
            return ServiceResponseHandle.failed("BUSINESS_ERROR", e.getMessage());
        }
        
        logger.error("服務(wù)運(yùn)行異常", e);
        e.printStackTrace();
        return ServiceResponseHandle.failed("server_error");
    }
}

如果 @ExceptionHandler 注解中未聲明要處理的異常類型,則默認(rèn)為參數(shù)列表中的異常類型。所以還可以寫成這樣:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler()
    @ResponseBody
    String handleException(Exception e){
        return "Exception Deal! " + e.getMessage();
    }
}

繼承 ResponseEntityExceptionHandler 類來(lái)實(shí)現(xiàn)針對(duì) Rest 接口 的全局異常捕獲,并且可以返回自定義格式:

@Slf4j
@ControllerAdvice
public class ExceptionHandlerBean  extends ResponseEntityExceptionHandler {

    /**
     * 數(shù)據(jù)找不到異常
     * @param ex
     * @param request
     * @return
     * @throws IOException
     */
    @ExceptionHandler({DataNotFoundException.class})
    public ResponseEntity handleDataNotFoundException(RuntimeException ex, WebRequest request) throws IOException {
        return getResponseEntity(ex,request,ReturnStatusCode.DataNotFoundException);
    }

    /**
     * 根據(jù)各種異常構(gòu)建 ResponseEntity 實(shí)體. 服務(wù)于以上各種異常
     * @param ex
     * @param request
     * @param specificException
     * @return
     */
    private ResponseEntity getResponseEntity(RuntimeException ex, WebRequest request, ReturnStatusCode specificException) {

        ReturnTemplate returnTemplate = new ReturnTemplate();
        returnTemplate.setStatusCode(specificException);
        returnTemplate.setErrorMsg(ex.getMessage());

        return handleExceptionInternal(ex, returnTemplate,
                new HttpHeaders(), HttpStatus.OK, request);
    }

}

spring mvc 常用注解

1、@Controller 只是定義了一個(gè)控制器類,而使用@RequestMapping 注解的方法才是真正處理請(qǐng)求的處理器

需要我們把這個(gè)控制器類交給Spring 來(lái)管理。有兩種方式:

(1)在SpringMVC 的配置文件中定義MyController 的bean 對(duì)象。

(2)在SpringMVC 的配置文件中告訴Spring 該到哪里去找標(biāo)記為@Controller 的Controller 控制器。




< context:component-scan base-package = "com.host.app.web" />//路徑寫到controller的上一層(掃描包詳解見下面淺析)

2、@RequestMapping

RequestMapping是一個(gè)用來(lái)處理請(qǐng)求地址映射的注解,可用于類或方法上。用于類上,表示類中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑。

RequestMapping注解有六個(gè)屬性,下面我們把她分成三類進(jìn)行說(shuō)明(下面有相應(yīng)示例)。

2.1、 value, method;

value:     指定請(qǐng)求的實(shí)際地址,指定的地址可以是URI Template 模式(后面將會(huì)說(shuō)明);

method:  指定請(qǐng)求的method類型, GET、POST、PUT、DELETE等;

2.2、consumes,produces

consumes: 指定處理請(qǐng)求的提交內(nèi)容類型(Content-Type),例如application/json, text/html;

produces:    指定返回的內(nèi)容類型,僅當(dāng)request請(qǐng)求頭中的(Accept)類型中包含該指定類型才返回;

2.3、params,headers

params: 指定request中必須包含某些參數(shù)值是,才讓該方法處理。

headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請(qǐng)求。

3、@Resource和@Autowired

@Resource和@Autowired都是做bean的注入時(shí)使用,其實(shí)@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要導(dǎo)入,但是Spring支持該注解的注入。

3.1、共同點(diǎn)

兩者都可以寫在字段和setter方法上。兩者如果都寫在字段上,那么就不需要再寫setter方法。

3.2、不同點(diǎn)

(1)@Autowired

@Autowired為Spring提供的注解,需要導(dǎo)入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

public class TestServiceImpl {
    // 下面兩種@Autowired只要使用一種即可
    @Autowired
    private UserDao userDao; // 用于字段上
    
    @Autowired
    public void setUserDao(UserDao userDao) { // 用于屬性的方法上
        this.userDao = userDao;
    }
}

@Autowired注解是按照類型(byType)裝配依賴對(duì)象,默認(rèn)情況下它要求依賴對(duì)象必須存在,如果允許null值,可以設(shè)置它的required屬性為false。如果我們想使用按照名稱(byName)來(lái)裝配,可以結(jié)合@Qualifier注解一起使用。如下:

public class TestServiceImpl {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao; 
}

(2)@Resource

@Resource默認(rèn)按照ByName自動(dòng)注入,由J2EE提供,需要導(dǎo)入包javax.annotation.Resource。@Resource有兩個(gè)重要的屬性:name和type,而Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以,如果使用name屬性,則使用byName的自動(dòng)注入策略,而使用type屬性時(shí)則使用byType自動(dòng)注入策略。如果既不制定name也不制定type屬性,這時(shí)將通過(guò)反射機(jī)制使用byName自動(dòng)注入策略。

public class TestServiceImpl {
    // 下面兩種@Resource只要使用一種即可
    @Resource(name="userDao")
    private UserDao userDao; // 用于字段上
    
    @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用于屬性的setter方法上
        this.userDao = userDao;
    }
}

注:最好是將@Resource放在setter方法上,因?yàn)檫@樣更符合面向?qū)ο蟮乃枷?,通過(guò)set、get去操作屬性,而不是直接去操作屬性。

@Resource裝配順序:

①如果同時(shí)指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異常。

②如果指定了name,則從上下文中查找名稱(id)匹配的bean進(jìn)行裝配,找不到則拋出異常。

③如果指定了type,則從上下文中找到類似匹配的唯一bean進(jìn)行裝配,找不到或是找到多個(gè),都會(huì)拋出異常。

④如果既沒(méi)有指定name,又沒(méi)有指定type,則自動(dòng)按照byName方式進(jìn)行裝配;如果沒(méi)有匹配,則回退為一個(gè)原始類型進(jìn)行匹配,如果匹配則自動(dòng)裝配。

@Resource的作用相當(dāng)于@Autowired,只不過(guò)@Autowired按照byType自動(dòng)注入。

4、@ModelAttribute和 @SessionAttributes

代表的是:該Controller的所有方法在調(diào)用前,先執(zhí)行此@ModelAttribute方法,可用于注解和方法參數(shù)中,可以把這個(gè)@ModelAttribute特性,應(yīng)用在BaseController當(dāng)中,所有的Controller繼承BaseController,即可實(shí)現(xiàn)在調(diào)用Controller時(shí),先執(zhí)行@ModelAttribute方法。最主要的作用是將數(shù)據(jù)添加到模型對(duì)象中,用于視圖頁(yè)面展示時(shí)使用。

 @SessionAttributes即將值放到session作用域中,寫在class上面。

5、@PathVariable

用于將請(qǐng)求URL中的模板變量映射到功能處理方法的參數(shù)上,即取出uri模板中的變量作為參數(shù)。如:

6、@requestParam

@requestParam主要用于在SpringMVC后臺(tái)控制層獲取參數(shù),類似一種是request.getParameter("name"),它有三個(gè)常用參數(shù):defaultValue = "0", required = false, value = "isApp";defaultValue 表示設(shè)置默認(rèn)值,required 銅過(guò)boolean設(shè)置是否是必須要傳入的參數(shù),value 值表示接受的傳入的參數(shù)名稱。

7、@ResponseBody

作用: 該注解用于將Controller的方法返回的對(duì)象,通過(guò)適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式后,寫入到Response對(duì)象的body數(shù)據(jù)區(qū)。

使用時(shí)機(jī):返回的數(shù)據(jù)不是html標(biāo)簽的頁(yè)面,而是其他某種格式的數(shù)據(jù)時(shí)(如json、xml等)使用;

8、@Component

相當(dāng)于通用的注解,當(dāng)不知道一些類歸到哪個(gè)層時(shí)使用,但是不建議。

9、@Repository

用于注解dao層,在daoImpl類上面注解。

注:

1、使用 @RequestMapping 來(lái)映射 Request 請(qǐng)求與處理器

方式一、通過(guò)常見的類路徑和方法路徑結(jié)合訪問(wèn)controller方法

方式二、使用uri模板

@Controller
@RequestMapping ( "/test/{variable1}" )
public class MyController {

    @RequestMapping ( "/showView/{variable2}" )
    public ModelAndView showView( @PathVariable String variable1, @PathVariable ( "variable2" ) int variable2) {
       ModelAndView modelAndView = new ModelAndView();
       modelAndView.setViewName( "viewName" );
       modelAndView.addObject( " 需要放到 model 中的屬性名稱 " , " 對(duì)應(yīng)的屬性值,它是一個(gè)對(duì)象 " );
       return modelAndView;
    }
}

除了在請(qǐng)求路徑中使用URI 模板,定義變量之外,@RequestMapping 中還支持通配符“* ”。如下面的代碼我就可以使用/myTest/whatever/wildcard.do 訪問(wèn)到Controller 的testWildcard 方法。如:

@Controller
@RequestMapping ( "/myTest" )
public class MyController {
    @RequestMapping ( "*/wildcard" )
    public String testWildcard() {
       System. out .println( "wildcard------------" );
       return "wildcard" ;
    }  
}

當(dāng)@RequestParam中沒(méi)有指定參數(shù)名稱時(shí),Spring 在代碼是debug 編譯的情況下會(huì)默認(rèn)取更方法參數(shù)同名的參數(shù),如果不是debug 編譯的就會(huì)報(bào)錯(cuò)。

2、使用 @RequestMapping 的一些高級(jí)用法

(1)params屬性

@RequestMapping (value= "testParams" , params={ "param1=value1" , "param2" , "!param3" })
    public String testParams() {
       System. out .println( "test Params..........." );
       return "testParams" ;
    }

用@RequestMapping 的params 屬性指定了三個(gè)參數(shù),這些參數(shù)都是針對(duì)請(qǐng)求參數(shù)而言的,它們分別表示參數(shù)param1 的值必須等于value1 ,參數(shù)param2 必須存在,值無(wú)所謂,參數(shù)param3 必須不存在,只有當(dāng)請(qǐng)求/testParams.do 并且滿足指定的三個(gè)參數(shù)條件的時(shí)候才能訪問(wèn)到該方法。所以當(dāng)請(qǐng)求/testParams.do?param1=value1¶m2=value2 的時(shí)候能夠正確訪問(wèn)到該testParams 方法,當(dāng)請(qǐng)求/testParams.do?param1=value1¶m2=value2¶m3=value3 的時(shí)候就不能夠正常的訪問(wèn)到該方法,因?yàn)樵贎RequestMapping 的params 參數(shù)里面指定了參數(shù)param3 是不能存在的。

(2)method屬性

@RequestMapping (value= "testMethod" , method={RequestMethod. GET , RequestMethod. DELETE })
    public String testMethod() {
       return "method" ;
    }

在上面的代碼中就使用method 參數(shù)限制了以GET 或DELETE 方法請(qǐng)求/testMethod 的時(shí)候才能訪問(wèn)到該Controller 的testMethod 方法。

(3)headers屬性

@RequestMapping (value= "testHeaders" , headers={ "host=localhost" , "Accept" })
    public String testHeaders() {
       return "headers" ;
    }

headers 屬性的用法和功能與params 屬性相似。在上面的代碼中當(dāng)請(qǐng)求/testHeaders.do 的時(shí)候只有當(dāng)請(qǐng)求頭包含Accept 信息,且請(qǐng)求的host 為localhost 的時(shí)候才能正確的訪問(wèn)到testHeaders 方法

3、 @RequestMapping 標(biāo)記的處理器方法支持的方法參數(shù)和返回類型

3.1. 支持的方法參數(shù)類型

         (1 )HttpServlet 對(duì)象,主要包括HttpServletRequest 、HttpServletResponse 和HttpSession 對(duì)象。 這些參數(shù)Spring 在調(diào)用處理器方法的時(shí)候會(huì)自動(dòng)給它們賦值,所以當(dāng)在處理器方法中需要使用到這些對(duì)象的時(shí)候,可以直接在方法上給定一個(gè)方法參數(shù)的申明,然后在方法體里面直接用就可以了。但是有一點(diǎn)需要注意的是在使用HttpSession 對(duì)象的時(shí)候,如果此時(shí)HttpSession 對(duì)象還沒(méi)有建立起來(lái)的話就會(huì)有問(wèn)題。

   (2 )Spring 自己的WebRequest 對(duì)象。 使用該對(duì)象可以訪問(wèn)到存放在HttpServletRequest 和HttpSession 中的屬性值。

   (3 )InputStream 、OutputStream 、Reader 和Writer 。 InputStream 和Reader 是針對(duì)HttpServletRequest 而言的,可以從里面取數(shù)據(jù);OutputStream 和Writer 是針對(duì)HttpServletResponse 而言的,可以往里面寫數(shù)據(jù)。

   (4 )使用@PathVariable 、@RequestParam 、@CookieValue 和@RequestHeader 標(biāo)記的參數(shù)。

   (5 )使用@ModelAttribute 標(biāo)記的參數(shù)。

   (6 )java.util.Map 、Spring 封裝的Model 和ModelMap 。 這些都可以用來(lái)封裝模型數(shù)據(jù),用來(lái)給視圖做展示。

   (7 )實(shí)體類。 可以用來(lái)接收上傳的參數(shù)。

   (8 )Spring 封裝的MultipartFile 。 用來(lái)接收上傳文件的。

   (9 )Spring 封裝的Errors 和BindingResult 對(duì)象。 這兩個(gè)對(duì)象參數(shù)必須緊接在需要驗(yàn)證的實(shí)體對(duì)象參數(shù)之后,它里面包含了實(shí)體對(duì)象的驗(yàn)證結(jié)果。

3.2. 支持的返回類型

   (1 )一個(gè)包含模型和視圖的ModelAndView 對(duì)象。

   (2 )一個(gè)模型對(duì)象,這主要包括Spring 封裝好的Model 和ModelMap ,以及java.util.Map ,當(dāng)沒(méi)有視圖返回的時(shí)候視圖名稱將由RequestToViewNameTranslator 來(lái)決定。

   (3 )一個(gè)View 對(duì)象。這個(gè)時(shí)候如果在渲染視圖的過(guò)程中模型的話就可以給處理器方法定義一個(gè)模型參數(shù),然后在方法體里面往模型中添加值。

   (4 )一個(gè)String 字符串。這往往代表的是一個(gè)視圖名稱。這個(gè)時(shí)候如果需要在渲染視圖的過(guò)程中需要模型的話就可以給處理器方法一個(gè)模型參數(shù),然后在方法體里面往模型中添加值就可以了。

   (5 )返回值是void 。這種情況一般是我們直接把返回結(jié)果寫到HttpServletResponse 中了,如果沒(méi)有寫的話,那么Spring 將會(huì)利用RequestToViewNameTranslator 來(lái)返回一個(gè)對(duì)應(yīng)的視圖名稱。如果視圖中需要模型的話,處理方法與返回字符串的情況相同。

   (6 )如果處理器方法被注解@ResponseBody 標(biāo)記的話,那么處理器方法的任何返回類型都會(huì)通過(guò)HttpMessageConverters 轉(zhuǎn)換之后寫到HttpServletResponse 中,而不會(huì)像上面的那些情況一樣當(dāng)做視圖或者模型來(lái)處理。

   (7 )除以上幾種情況之外的其他任何返回類型都會(huì)被當(dāng)做模型中的一個(gè)屬性來(lái)處理,而返回的視圖還是由RequestToViewNameTranslator 來(lái)決定,添加到模型中的屬性名稱可以在該方法上用@ModelAttribute(“attributeName”) 來(lái)定義,否則將使用返回類型的類名稱的首字母小寫形式來(lái)表示。使用@ModelAttribute 標(biāo)記的方法會(huì)在@RequestMapping 標(biāo)記的方法執(zhí)行之前執(zhí)行。

5、@PathVariable和@RequestParam的區(qū)別 

請(qǐng)求路徑上有個(gè)id的變量值,可以通過(guò)@PathVariable來(lái)獲取  @RequestMapping(value = "/page/{id}", method = RequestMethod.GET)  
@RequestParam用來(lái)獲得靜態(tài)的URL請(qǐng)求入?yún)?nbsp;    spring注解時(shí)action里用到。

簡(jiǎn)介:

handler method 參數(shù)綁定常用的注解,我們根據(jù)他們處理的Request的不同內(nèi)容部分分為四類:(主要講解常用類型)

A、處理requet uri 部分(這里指uri template中variable,不含queryString部分)的注解:   @PathVariable;

B、處理request header部分的注解:   @RequestHeader, @CookieValue;

C、處理request body部分的注解:@RequestParam,  @RequestBody;

D、處理attribute類型是注解: @SessionAttributes, @ModelAttribute;

(1)、@PathVariable

當(dāng)使用@RequestMapping URI template 樣式映射時(shí), 即 someUrl/{paramId}, 這時(shí)的paramId可通過(guò) @Pathvariable注解綁定它傳過(guò)來(lái)的值到方法的參數(shù)上。

示例代碼:

@Controller  
@RequestMapping("/owners/{ownerId}")  
public class RelativePathUriTemplateController {  
  
  @RequestMapping("/pets/{petId}")  
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {      
    // implementation omitted   
  }  
}

到此,關(guān)于“Spring MVC的工作流程和使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


本文標(biāo)題:SpringMVC的工作流程和使用
網(wǎng)址分享:http://weahome.cn/article/gjjgjc.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部