1. 程式人生 > >SpringMVC基礎配置(二)

SpringMVC基礎配置(二)

ads 註意 ram 客戶 處理 ping 聯合 erp 就是

上一張:SpringMVC環境搭建(一)

今天我們來說說SpringMVC的基礎配置。目前越來越多的主流框架都支持註解,同時我們無敵的Spring也支持基於註解的"零配置"。

註解相比XML的優勢:它可以充分利用Java的反射機制獲取類中的結構信息,這些信息可以有效減少配置的工作,註釋和Java代碼位於一個文件中,更加利於維護。

註意:必須要在Spring2.5版本之後才可以使用註解方式。

註解方式將Bean的定義信息和Bean的實現類結合在一起,Spring提供的註解有。

@Component:聲明一個普通的Bean類

@Repository:聲明一個持久層Dao類

@Service:聲明一個業務層類

@Controller:聲明一個控制器類

這4個註解相信小夥伴們已經非常的熟悉了,廢話就少說了。我們使用註解千萬不要忘了在類中掃描!!!

@RequestMapping(非常核心的一個註解),這個註解是用來指定控制器的請求URL。

在控制器的類定義:提供初步的映射信息,為該類下所有請求方法添加一個前綴。

在控制器類中的方法定義:提供進一步的映射信息,提供方法的請求路徑

DispacherServlet截獲請求後,就通過 控制器上的@RequestMapping提供的映射信息確認請求所對應的處理方法。

@Controller
@RequestMapping("user")
public class UserController { @RequestMapping("/hello") public String hello(){ return "hello"; } }

這個時候我們請求的路徑是http://localhost:8080/SpringMvcDemo2/user/hello

@RequestMapping除了映射請求URL請求,還可以使用請求方法,請求參數和請求頭的請求,註解中有幾個參數:

1)value:表示請求的URL

2)method:表示請求的方式(GET/POST)

3)params:表示請求的參數

4)heads:請求頭

他們之間的是與的關系,聯合使用多個請求可以讓請求更加的精確化。

@RequestMapping(value="hello2",method=RequestMethod.POST,params={"username","userpass"},headers="contentType=text/*")
    public String hello2(){
        return "hello";
    }

這段代碼表示,請求的地址是hello請求方式為Post必須帶username,userpass兩個參數,請求頭contentType必須是text/開頭。我們可以寫兩個URL一樣的方法,請求方式一個POST另一個GET當時會嚴格根據設置進行調用

@RequestMapping同時還支持Ant風格的URL,在Ant中支持3種通配符。

?:表示配置一個字符。

*:匹配任意字符

**:匹配多層路徑

在SpringMVC中對參數的處理:

@pathVariable:URL模板方式

  用來映射URL中的占位符,映射的變量名必須和占位符中的名稱一致,像這種我們的請求地址就會時http://localhost:8080/SpringMvcDemo2/user/testPathVariable/Miya,這個miya就是我們傳過去的參數,在傳統的URL中testPathVariable?username=miya但是這種不利於百度的收錄。

@RequestMapping("/testPathVariable/{username}")
    public String hello3(@PathVariable("username")String username){
        System.out.println("username :  " + username);
        return "hello";
    }

@RequestParam:獲取請求參數,如果請求參數名字和類型的名字一致我們可以省略吊這個註解,一樣可以接受到值。

@RequestMapping("/textParam")
    public String hello4(@RequestParam("username")String username,@RequestParam("userpass")String userpass){
        System.out.println("userpass :  " + userpass);
        return "hello";
    }

@RequestHeader:獲取請求頭的參數

  在這裏有三個參數,value:指定參數的名稱,required:指定參數是否為必填,defualtValue:指定參數的默認值。

@RequestMapping("/testRequestHeader")
    public String hello5(@RequestHeader("Accept-Language") String language){
        System.out.println("language=" + language);
        return "hello";
    }

@CookieValue:用來獲取客戶端Cookie的信息。

@RequestMapping("/testCookieValue")
    public String hello6(@CookieValue("JSESSIONID")String sessionid){
        System.out.println("sessionid=" + sessionid);
        return "hello";
    }

SpringMVC可以使用ServletAPI作為請求方法的參數

@RequestMapping("/testServletAPI")
    public String hello7(HttpServletRequest request,HttpServletResponse response,HttpSession session){
        //我們可以在這裏使用
        return "hello";
    }

SpringMVC提供了以下幾種處理模型數據的方式。

1)ModelAndView:將處理方法的返回類型設置為ModelAndView方法體可通過該模型對象添加模型數據。既包含視圖,也包含模型信息

@RequestMapping("/testModelAndView")
    public ModelAndView hello8(){
        ModelAndView modelAndView = new ModelAndView("hello");
        //添加單個值
        modelAndView.addObject("h","Hello Spring MVC");        
        return modelAndView;
    }

2)Map及形參:當形參為Map,Model,ModelMap時,處理方法返回時,Map中的數據會自動添加到模型中。 

  Spring MVC在內部使用了一個Model接口存儲數據的數據,在調用方法前會創建一個隱含的模型對象作為數據模型的存儲容器。如果傳入的參數為Map,Model,ModelMap時,SpringMVC會自動保存到容器中

@RequestMapping("/testMap")
    public String hello9(Map<String,Object> map){
        map.put("mapdata", "map data");
        return "hello";
    }

3)@SessionAttributes:將這個模型中的某個屬性存儲到Session中,以便多個請求之間共享這個屬性,只能用來修飾類。在裏面的方法如果參數容器中如map裏賣弄保存一個與定義的屬性名字相同會保存到容器中共享

4)@ModelAttribute:方法形參標記該註解後,形參對象就會放到模型中。

  SpringMVC在調用方法之前會逐個調用方法上標註了這個註解的方法。將@ModelAttribute中的屬性保存到map中,可在執行表單提交生成對象之前,替換執行方法名相同的參數。

@ModelAttribute
public User getUser(){
    User user = new User();
    System.out.println("調用 getUser 方法");
    //默認保存名字為類名首字母小寫的user對象到Request中
    return user;
}

@ModelAttribute
public void getUserById(Integer id,Map<String,Object> map){
    User myuser = new User();
    map.put("myuser", myuser);
    //手動指定user對象的名稱,到Request中
    System.out.println("調用 getUser 方法");
}

由@SessionAttributs會引發一個很容易輕視的錯誤當類使用@SessionAttributes修飾,而方法中使用了和SessionAttributes修飾同名的映射參數,確沒有添加@ModelAttribute修飾時,則會報錯。

SpringMVC基礎配置(二)