Spring MVC 常用注解@Controller,@RequestMapping,Model和ModelAndView


1.@Controller

用於指示Spring類的實例是一個控制器。Controller接口的實現類只能處理一個單一請求動作,而@Controller注解的控制器可以支持同時處理多個請求動作,更加靈活。Spring使用掃描機制查找應用程序中所有基於注解的控制器類。分發處理器會掃描使用了該注解的類的方法,並檢測該方法是否使用了@RequestMapping注解,而使用@RequestMapping注解的方法才是真正處理請求的處理器。為了保證能找到控制器,需要完成兩件事情:

在Spring MVC的配置文件中以你如spring-context

使用<context:component-scan/>元素,該元素的功能為:啟動包掃描功能,以便注冊帶有@Controller,@Service,@repository,@Component等注解的類成為SPring的Bean

<context:component-scan base-package="包路徑">

應該 將所有控制器類都在基本包下,並且指定掃描該包

http://localhost:8080/AnnotationTest/haha

package com.game.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    
    @RequestMapping(value="/haha")
    public String hello(Model model)
    {
        model.addAttribute("message", "騰飛新星");
        return "haha";
    }
    
}

發送haha請求,將model的message賦值"騰飛新星",再返回給haha.jsp

 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix">
                <value>/WEB-INF/content/</value>
            </property>
            <property name="suffix">
                <value>.jsp</value>
            </property>
        </bean>

prefix視圖前綴,suffix視圖后綴

 

2.@RequestMapping

用於指示Spring用哪一個類或者哪一個方法來處理請求動作。

package com.game.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value="/user")
public class UserController {
    
    @RequestMapping(value="/register")
    public String register()
    {
        return "register";
    }
    
    @RequestMapping(value="/login")
    public String login()
    {
        return "login";
    }
    
}

由於UserController前面加上@RequestMapping(value="/user"),所以相關的請求都要加上/user

創建register.jsp和login.jsp

http://localhost:8080/AnnotationTest/user/register

http://localhost:8080/AnnotationTest/user/login

即可訪問成功

 

package com.game.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HelloController {
    
    @RequestMapping(value="/haha",method=RequestMethod.GET,params="myParam=nidaye")
    public String hello(Model model)
    {
        model.addAttribute("message", "騰飛新星");
        return "haha";
    }
    
}

http://localhost:8080/AnnotationTest/haha?myParam=nidaye

僅處理請求中包含了名為“myParam”,值為“nidaye”的請求;

 

3.Model和ModelAndView

在請求處理方法可出現和返回的參數類型中,最重要就是Model和ModelAndView了,對於MVC框架,控制器Controller執行業務邏輯,用於產生模型數據Model,而視圖View用於渲染模型數據。

SpringMVC在內部使用了一個Model接口存儲數據模型,它的功能類似java.util.Map,但是比Map容易使用。ModelMap接口實現了Map

package com.game.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.game.model.User;

@Controller
public class User1Controller {

    /**ModelAttribute會優先於login調用,把請求的參數賦值給對應的變量,可以向方法中的model添加對象*/
    @ModelAttribute
    public void userModel(String loginName,String password,Model model)
    {
        User user = new User();
        user.setLoginName(loginName);
        user.setPassword(password);
        model.addAttribute("user", user);
    }
    
    @RequestMapping("/userlogin")
    public String login(Model model)
    {
        User user = (User)model.asMap().get("user");
        model.addAttribute("name", user.getLoginName());
        model.addAttribute("password", user.getPassword());
        return "result1";
    }
    
    @RequestMapping("/userlogin2")
    public String login(ModelMap model)
    {
        User user = (User)model.get("user");
        model.addAttribute("name", user.getLoginName());
        model.addAttribute("password", user.getPassword());
        return "result1";
    }
    
}
ModelAttribute會優先於login調用,把請求的參數賦值給對應的變量,可以向方法中的model添加對象
http://localhost:8080/AnnotationTest/userlogin1?loginName=haha&password=123
  User user = (User)model.asMap().get("user");Model
  User user = (User)model.get("user");ModelMap

下邊看看ModelAndView
package com.game.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.game.model.User;

@Controller
public class User2Controller {

    /**ModelAttribute會優先於login調用,把請求的參數賦值給對應的變量,可以向方法中的model添加對象*/
    @ModelAttribute
    public void userModel(String loginName,String password,ModelAndView model)
    {
        User user = new User();
        user.setLoginName(loginName);
        user.setPassword(password);
        model.addObject("user", user);
    }
    
    @RequestMapping("/userlogin3")
    public ModelAndView login(ModelAndView mv)
    {
        User user = (User)mv.getModel().get("user");
        mv.addObject("name", user.getLoginName());
        mv.addObject("password", user.getPassword());
        mv.setViewName("result1");
        return mv;
    }
    
}

添加模型數據用addObject

設置視圖setViewName

http://localhost:8080/AnnotationTest/userlogin3?loginName=hehe&password=123

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM