Spring MVC學習路(三) 編寫第一個demo

新建包com.test裏面新建Test.java文件
html

package com.test;

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

@Controller
public class Test {
	@RequestMapping("test") //表示訪問地址
	public String test1(){
		System.out.println("load");
		return "demo" ; 
	}
}

在上述視圖解析器中,若是Controller返回的是blog/index,那麼經過視圖解析器解析以後的視圖就是/demo.jsp。java

@Controller:用於標識是處理器類;web

@RequestMapping:請求處處理器功能方法的映射規則;spring

@RequestParam:請求參數處處理器功能處理方法的方法參數上的綁定;session

@ModelAttribute:請求參數到命令對象的綁定;app

@SessionAttributes:用於聲明session級別存儲的屬性,放置在處理器類上,一般列出jsp

模型屬性(如@ModelAttribute)對應的名稱,則這些屬性會透明的保存到session中;ui

@InitBinder:自定義數據綁定註冊支持,用於將請求參數轉換到命令對象屬性的對應類型;url

更詳細的說明來源於:http://www.cnblogs.com/superjt/p/3309255.htmlspa

package controller;

import javax.servlet.http.HttpServletRequest;

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

import entity.User;

@Controller  //相似Struts的Action
public class TestController {

    @RequestMapping("test/login.do")  // 請求url地址映射,相似Struts的action-mapping
    public String testLogin(@RequestParam(value="username")String username, String password, HttpServletRequest request) {
        // @RequestParam是指請求url地址映射中必須含有的參數(除非屬性required=false)
        // @RequestParam可簡寫爲:@RequestParam("username")

        if (!"admin".equals(username) || !"admin".equals(password)) {
            return "loginError"; // 跳轉頁面路徑(默認爲轉發),該路徑不須要包含spring-servlet配置文件中配置的前綴和後綴
        }
        return "loginSuccess";
    }

    @RequestMapping("/test/login2.do")
    public ModelAndView testLogin2(String username, String password, int age){
        // request和response沒必要非要出如今方法中,若是用不上的話能夠去掉
        // 參數的名稱是與頁面控件的name相匹配,參數類型會自動被轉換
        
        if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
            return new ModelAndView("loginError"); // 手動實例化ModelAndView完成跳轉頁面(轉發),效果等同於上面的方法返回字符串
        }
        return new ModelAndView(new RedirectView("../index.jsp"));  // 採用重定向方式跳轉頁面
        // 重定向還有一種簡單寫法
        // return new ModelAndView("redirect:../index.jsp");
    }

    @RequestMapping("/test/login3.do")
    public ModelAndView testLogin3(User user) {
        // 一樣支持參數爲表單對象,相似於Struts的ActionForm,User不須要任何配置,直接寫便可
        String username = user.getUsername();
        String password = user.getPassword();
        int age = user.getAge();
        
        if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
            return new ModelAndView("loginError");
        }
        return new ModelAndView("loginSuccess");
    }

    @Resource(name = "loginService")  // 獲取applicationContext.xml中bean的id爲loginService的,並注入
    private LoginService loginService;  //等價於spring傳統注入方式寫get和set方法,這樣的好處是簡潔工整,省去了沒必要要得代碼

    @RequestMapping("/test/login4.do")
    public String testLogin4(User user) {
        if (loginService.login(user) == false) {
            return "loginError";
        }
        return "loginSuccess";
    }
}

以上4個方法示例,是一個Controller裏含有不一樣的請求url,也能夠採用一個url訪問,經過url參數來區分訪問不一樣的方法,代碼以下:

package controller;

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

@Controller
@RequestMapping("/test2/login.do")  // 指定惟一一個*.do請求關聯到該Controller
public class TestController2 {
    
    @RequestMapping
    public String testLogin(String username, String password, int age) {
        // 若是不加任何參數,則在請求/test2/login.do時,便默認執行該方法
        
        if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
            return "loginError";
        }
        return "loginSuccess";
    }

    @RequestMapping(params = "method=1", method=RequestMethod.POST)
    public String testLogin2(String username, String password) {
        // 依據params的參數method的值來區分不一樣的調用方法
        // 能夠指定頁面請求方式的類型,默認爲get請求
        
        if (!"admin".equals(username) || !"admin".equals(password)) {
            return "loginError";
        }
        return "loginSuccess";
    }
    
    @RequestMapping(params = "method=2")
    public String testLogin3(String username, String password, int age) {
        if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
            return "loginError";
        }
        return "loginSuccess";
    }
}

其實RequestMapping在Class上,可看作是父Request請求url,而RequestMapping在方法上的可看作是子Request請求url,父子請求url最終會拼起來與頁面請求url進行匹配,所以RequestMapping也能夠這麼寫:

package controller;

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

@Controller
@RequestMapping("/test3/*")  // 父request請求url
public class TestController3 {

    @RequestMapping("login.do")  // 子request請求url,拼接後等價於/test3/login.do
    public String testLogin(String username, String password, int age) {
        if (!"admin".equals(username) || !"admin".equals(password) || age < 5) {
            return "loginError";
        }
        return "loginSuccess";
    }
}
相關文章
相關標籤/搜索