【02】SpringMVC參數(shù)綁定及常用注解

一、參數(shù)綁定:

1)基本類型數(shù)據(jù)綁定:

包括8大基本類型和String金吗。
Controller類的方法參數(shù)名必須和請(qǐng)求體的參數(shù)名一致

param.jsp代碼:

<a href="/param/testParam?username=zhoulian&password=123456">測(cè)試param基本參數(shù)</a>

ParaController類:

@Controller
@RequestMapping("param")
public class ParamController {

    @RequestMapping("testParam")
    public String testParam(String username,String password){
        System.out.println("testParam迹冤。。杉辙。");
        System.out.println("用戶名:"+username);
        System.out.println("密碼:"+password);
        return "success";
    }
}

下面模捂,控制類我都只寫方法了,一級(jí)目錄都是param

2)POJO參數(shù)類型:

包括實(shí)體類蜘矢,及關(guān)聯(lián)的實(shí)體類狂男。

Account實(shí)體類:

package com.zl.controller.domain;

import java.io.Serializable;

public class Account implements Serializable {

    private String accountName;
    private String accountPassword;
    private Double money;

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getAccountName() {
        return accountName;
    }

    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }

    public String getAccountPassword() {
        return accountPassword;
    }

    public void setAccountPassword(String accountPassword) {
        this.accountPassword = accountPassword;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "accountName='" + accountName + '\'' +
                ", accountPassword='" + accountPassword + '\'' +
                ", money=" + money +
                ", user=" + user +
                '}';
    }
}

User實(shí)體類:

package com.zl.controller.domain;

import java.io.Serializable;

public class User implements Serializable {

    private String uname;
    private Integer uage;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Integer getUage() {
        return uage;
    }

    public void setUage(Integer uage) {
        this.uage = uage;
    }

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", uage=" + uage +
                '}';
    }
}

jsp

 <form action="/param/testAccount" method="post">
        賬戶名:<input type="text" name="accountName"> <br />
        密碼:<input type="text" name="accountPassword"> <br />
        金額:<input type="text" name="money"><br /> 
        用戶名:<input type="text" name="user.uname"><br />
        用戶年齡:<input type="text" name="user.uage"><br />
        <input type="submit" value="提交"/><br>
        
 </form>

Controller類:

 @RequestMapping("/testAccount")
    public String testAccount(Account account){
        System.out.println("testAccount...");
        System.out.println(account);
        return "success";
    }
3)數(shù)組和集合類型參數(shù):

如果Account實(shí)體類中包含List和Map:
如:

package com.zl.controller.domain;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class Account2 implements Serializable {

    private String accountName;
    private String accountPassword;
    private Double money;

    private List<User> list;
    private Map<String,User> map;

    public List<User> getList() {
        return list;
    }

    public void setList(List<User> list) {
        this.list = list;
    }

    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    public String getAccountName() {
        return accountName;
    }

    public void setAccountName(String accountName) {
        this.accountName = accountName;
    }

    public String getAccountPassword() {
        return accountPassword;
    }

    public void setAccountPassword(String accountPassword) {
        this.accountPassword = accountPassword;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account2{" +
                "accountName='" + accountName + '\'' +
                ", accountPassword='" + accountPassword + '\'' +
                ", money=" + money +
                ", list=" + list +
                ", map=" + map +
                '}';
    }
}

jsp

<form action="/param/testAccount2" method="post">
        賬戶名:<input type="text" name="accountName"><br />
        密碼:<input type="text" name="accountPassword"><br />
        金額:<input type="text" name="money"><br />
        用戶名1:<input type="text" name="list[0].uname"><br />
        用戶年齡1:<input type="text" name="list[0].uage"><br />
        用戶名2:<input type="text" name="map['one'].uname"><br />
        用戶年齡2:<input type="text" name="map['one'].uage"><br />
        <input type="submit" value="提交"/><br />
    </form>

Controller類:

@RequestMapping("/testAccount2")
    public String testAccount2(Account2 account){
        System.out.println("testAccount...");
        System.out.println(account);
        return "success";
    }

需要注意的是琉历,當(dāng)參數(shù)中含有Date類型煮仇,且傳遞的參數(shù)值如2019-11-11,而不是2019/11/11時(shí)假丧,需要自定義類型轉(zhuǎn)換器:
第一步::定義一個(gè)類珍昨,實(shí)現(xiàn)Converter接口

package com.zl.util;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ConvertUtil implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        try {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            return  df.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

第二步: 在spring配置文件中配置類型轉(zhuǎn)換器县耽。

<!--配置自定義類型轉(zhuǎn)換器-->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.zl.util.ConvertUtil"></bean>
            </set>
        </property>
    </bean>

第三步: 在annotation-driven標(biāo)簽中引用配置的類型轉(zhuǎn)換服務(wù)

<!--開啟SpringMVC框架注解的支持-->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"></mvc:annotation-driven>
4)使用ServletAPI對(duì)象作為方法參數(shù):

Controller類

@RequestMapping("testServlet")
    public String testServlet(HttpServletRequest request,HttpServletResponse response){
        System.out.println("testServlet句喷。。兔毙。");

        HttpSession session = request.getSession();
        ServletContext servletContext = session.getServletContext();
        System.out.println(request);
        System.out.println(session);
        System.out.println(servletContext);
        return "success";
    }

二唾琼、常用注解:

1)RequestParam

作用: 把請(qǐng)求中指定名稱的參數(shù)給控制器中的形參賦值。
屬性:
value:請(qǐng)求參數(shù)中的名稱澎剥。
required:請(qǐng)求參數(shù)中是否必須提供此參數(shù)锡溯。默認(rèn)值:true。表示必須提供哑姚,如果不提供將報(bào)錯(cuò)祭饭。

jsp:

<a href="/anno/testRequestParam?username=張三">測(cè)試requestParam注解</a>

Controller:

@RequestMapping("testRequestParam")
    public String testRequestParam(@RequestParam("username") String name){
        System.out.println("testRequestParam...");
        System.out.println(name);
        return "success";
    }
2)RequestBody

作用: 用于獲取請(qǐng)求體內(nèi)容。
直接使用得到是key=value&key=value...結(jié)構(gòu)的數(shù)據(jù)叙量。 get請(qǐng)求方式不適用倡蝙。
屬性:
required:是否必須有請(qǐng)求體。默認(rèn)值是:true绞佩。當(dāng)取值為true時(shí),get請(qǐng)求方式會(huì)報(bào)錯(cuò)寺鸥。如果取值為false,get請(qǐng)求得到是null品山。

jsp

<form action="/anno/testRequestBody" method="post">
        用戶名:<input type="text" name="username" /><br />
        密碼:<input type="text" name="password" /><br />
        <input type="submit" value="提交" /><br />
    </form>

Controller類:

@RequestMapping("testRequestBody")
    public String testRequestBody(@RequestBody String body){
        System.out.println("testRequestBody...");
        System.out.println(body);
        return "success";
    }
3)PathVaribale

作用: 用于綁定url中的占位符胆建。
例如:請(qǐng)求url中 /delete/{id},這個(gè){id}就是url占位符肘交。 url支持占位符是spring3.0之后加入的笆载。是springmvc支持rest風(fēng)格URL的一個(gè)重要標(biāo)志。
屬性:
value:用于指定url中占位符名稱涯呻。
required:是否必須提供占位符凉驻。

jsp

<a href="/anno/testPathVariable/50">測(cè)試PathVariable注解</a>

Controller:

@RequestMapping("testPathVariable/{sid}")
    public String testPathVariable(@PathVariable("sid") String id){
        System.out.println("testPathVariable...");
        System.out.println(id);
        return "success";
    }
4)RequestHeader

作用: 用于獲取請(qǐng)求消息頭。
屬性
value:提供消息頭名稱
required:是否必須有此消息頭
: 在實(shí)際開發(fā)中一般不怎么用魄懂。

jsp:

<a href="/anno/testRequestHeader">測(cè)試RequestHeader注解</a>

Controller:

@RequestMapping("testRequestHeader")
    public String testRequestHeader(@RequestHeader("Accept") String header){
        System.out.println("testRequestHeader...");
        System.out.println(header);
        return "success";
    }
5)CookieValue

作用: 用于把指定cookie名稱的值傳入控制器方法參數(shù)。
屬性
value:指定cookie的名稱闯第。
required:是否必須有此cookie市栗。

jsp:

<a href="/anno/testCookieValue">測(cè)試CookieValue注解</a>

Controller:

 @RequestMapping("testCookieValue")
    public String testCookieValue(@CookieValue("JSESSIONID") String cookieValue){
        System.out.println("testCookieValue...");
        System.out.println(cookieValue);
        return "success";
    }
6)ModelAttribute

作用: 該注解是SpringMVC4.3版本以后新加入的。它可以用于修飾方法和參數(shù)咳短。
出現(xiàn)在方法上填帽,表示當(dāng)前方法會(huì)在控制器的方法執(zhí)行之前,先執(zhí)行.它可以修飾沒有返回值的方法咙好,也可以修飾有具體返回值的方法篡腌。
出現(xiàn)在參數(shù)上,獲取指定的數(shù)據(jù)給參數(shù)賦值勾效。
屬性
value:用于獲取數(shù)據(jù)的key嘹悼。key可以是POJO的屬性名稱叛甫,也可以是map結(jié)構(gòu)的key。
應(yīng)用場(chǎng)景
當(dāng)表單提交數(shù)據(jù)不是完整的實(shí)體類數(shù)據(jù)時(shí)杨伙,保證沒有提交數(shù)據(jù)的字段使用數(shù)據(jù)庫對(duì)象原來的數(shù)據(jù)其监。 例如: 我們?cè)诰庉嬕粋€(gè)用戶時(shí),用戶有一個(gè)創(chuàng)建信息字段限匣,該字段的值是不允許被修改的抖苦。在提交表單數(shù)據(jù)是肯定沒有此字段的內(nèi)容,一旦更新會(huì)把該字段內(nèi)容置為null米死,此時(shí)就可以使用此注解解決問題锌历。

jsp:

<form action="/anno/testModelAttribute" method="post">
        用戶名:<input type="text" name="uname" /><br />
        年齡:<input type="text" name="uage" /><br />
        <input type="submit" value="提交" /><br />
    </form>

Controller:

@RequestMapping("testModelAttribute")
    public String testCookieValue(@ModelAttribute("uuu") User user){
        System.out.println("testModelAttribute...");
        System.out.println(user);
        return "success";
    }
    @ModelAttribute
    public void saveUser(String uname, Map<String,User> map){
        User user = new User();
        user.setUname(uname);
        user.setUage(44);
        user.setDate(new Date());
        map.put("uuu",user);
    }

或者:

@RequestMapping("testModelAttribute")
    public String testCookieValue(User user){
        System.out.println("testModelAttribute...");
        System.out.println(user);
        return "success";
    }
    @ModelAttribute
    public User saveUser(String uname,String uage){
       User user = new User();
       user.setUname(uname);
       user.setUage(Integer.parseInt(uage));
       user.setDate(new Date());
       return user;
    }
7)SessionAttribute

作用: 用于多次執(zhí)行控制器方法間的參數(shù)共享,寫在類上。
屬性
value:用于指定存入的屬性名稱
type:用于指定存入的數(shù)據(jù)類型峦筒。

jsp:

<a href="/anno/testSessionAttributes">測(cè)試SessionAttributes注解</a>
<a href="/anno/testGetSessionAttributes">獲取Session中的msg</a>
<a href="/anno/testRemoveSessionAttributes">刪除Session中的msg</a>

Controller:

 @Controller
@RequestMapping("anno")
@SessionAttributes("msg")
public class AnnoController {
 
 @RequestMapping("testSessionAttributes")
    public String testSessionAttributes(Model model){
        System.out.println("testSessionAttributes...");
        model.addAttribute("msg","多啦A夢(mèng)");
        return "success";
    }

    @RequestMapping("testGetSessionAttributes")
    public String testGetSessionAttributes(ModelMap modelMap){
        System.out.println("testGetSessionAttributes...");
        String msg = (String) modelMap.get("msg");
        System.out.println(msg);
        return "success";
    }
    @RequestMapping("testRemoveSessionAttributes")
    public String testRemoveSessionAttributes(SessionStatus status){
        System.out.println("testRemoveSessionAttributes...");
        status.setComplete();
        return "success";
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末究西,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勘天,更是在濱河造成了極大的恐慌怔揩,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脯丝,死亡現(xiàn)場(chǎng)離奇詭異商膊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宠进,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門晕拆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人材蹬,你說我怎么就攤上這事实幕。” “怎么了堤器?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵昆庇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我闸溃,道長(zhǎng)整吆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任辉川,我火速辦了婚禮表蝙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乓旗。我一直安慰自己府蛇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布屿愚。 她就那樣靜靜地躺著汇跨,像睡著了一般务荆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扰法,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天蛹含,我揣著相機(jī)與錄音,去河邊找鬼塞颁。 笑死浦箱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祠锣。 我是一名探鬼主播酷窥,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伴网!你這毒婦竟也來了蓬推?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤澡腾,失蹤者是張志新(化名)和其女友劉穎沸伏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體动分,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毅糟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澜公。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姆另。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坟乾,靈堂內(nèi)的尸體忽然破棺而出迹辐,到底是詐尸還是另有隱情,我是刑警寧澤甚侣,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布明吩,位于F島的核電站,受9級(jí)特大地震影響殷费,放射性物質(zhì)發(fā)生泄漏印荔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一宗兼、第九天 我趴在偏房一處隱蔽的房頂上張望躏鱼。 院中可真熱鬧氮采,春花似錦殷绍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茶行。三九已至,卻和暖如春登钥,著一層夾襖步出監(jiān)牢的瞬間畔师,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工牧牢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留看锉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓塔鳍,卻偏偏與公主長(zhǎng)得像伯铣,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轮纫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容