Spring MVC 經常使用註解@Controller,@RequestMapping,Model和ModelAndView

1.@Controllerjava

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

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

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

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

應該 將全部控制器類都在基本包下,而且指定掃描該包jsp

http://localhost:8080/AnnotationTest/hahaui

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.jspspa

 <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視圖後綴code

 

2.@RequestMappingcomponent

用於指示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

相關文章
相關標籤/搜索