Springmvc返回值

返回ModelAndView

  • 以forword轉(zhuǎn)發(fā)的方式,有數(shù)據(jù)和視圖

返回String

  • 處理器方法返回字符串可以指定邏輯視圖,通過視圖解析器解析可以將其轉(zhuǎn)換成物理視圖地址
  • 必須要視圖解析器在springmvc.xml下配置
  • 以forword的轉(zhuǎn)發(fā)方式
  @RequestMapping("string.do")
    public String stringTest(HttpServletRequest request){
        request.setAttribute("msg", "haha");
        request.setAttribute("fun", "haha");
        return "show";
    }

  • 如果使用完整路徑,就不能使用視圖解析器了
 @RequestMapping("string.do")
    public String stringTest(HttpServletRequest request){
        request.setAttribute("msg", "haha");
        request.setAttribute("fun", "haha");
        return "/WEB-INF/view/show.jsp";
    }

void:不能顯示數(shù)據(jù)鹃两,也不能表示視圖

  • 在處理ajax的時候瘫辩,可以使用void返回值。通過HttpServletResponse輸出數(shù)據(jù)遍膜。響應(yīng)ajax請求捷雕。
  • ajax請求服務(wù)器返回的就是數(shù)據(jù)叁鉴,和視圖無關(guān)途样。
  • jackson 依賴
 <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
  • jquery請求ajax并傳入數(shù)據(jù)
     $(function () {
            $("#btn").click(function () {
                    $.ajax({
                        url: "void.do",
                        data: {
                            name : "zhangsan",
                            age : 20
                        },
                        type: "post",
                        dataType: "json",
                        success : function (res) {
                            alert("name:" + res.name + "\n"+ "age:" + res.age);
                        }
                    })
                }
            )
        })
  • java響應(yīng)ajax返回json數(shù)據(jù)

通過手工實(shí)現(xiàn)轉(zhuǎn)json有很多重復(fù)江醇,所以json可以交給框架做

  @RequestMapping("void.do")
    public void voidTest(HttpServletResponse resp, String name, Integer age) {
        Student student = new Student();
        student.setAge(age);
        student.setName(name);
        String json = "";
        // 把結(jié)果轉(zhuǎn)換為json格式數(shù)據(jù)
        if(student != null){
            ObjectMapper mapper = new ObjectMapper();
            try{
                json =  mapper.writeValueAsString(student);
                // 響應(yīng)ajax請求, 返回json數(shù)據(jù)
                resp.setContentType("application/json;charset=utf-8");
                PrintWriter writer = resp.getWriter();
                writer.println(json);
                writer.flush();
                writer.close();
            }catch (Exception e){
                e.printStackTrace();
            }

        }
    }

返回值Object (返回值是一個對象)

  • 對象有屬性,所以O(shè)bject只返回數(shù)據(jù)何暇,和視圖無關(guān)陶夜。
  • 現(xiàn)在做ajax,主要使用json的數(shù)據(jù)格式裆站。實(shí)現(xiàn)步驟:
  1. 加入json庫的依賴条辟, springmvc默認(rèn)使用的jackson
  2. 在springmvc配置文件中加入<mvc:annotation-driven>注解驅(qū)動
  3. 在方法上面加ResponseBody():其實(shí)是將java對象轉(zhuǎn)為json格式的數(shù)據(jù)黔夭。
  • mvc:annotation-driven的作用
    Spring 3.0.x中使用了mvc:annotation-driven后,默認(rèn)會幫我們注冊默認(rèn)處理請求捂贿,參數(shù)和返回值的類纠修,其中最主要的兩個類:DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter ,分別為HandlerMapping的實(shí)現(xiàn)類和HandlerAdapter的實(shí)現(xiàn)類厂僧,從3.1.x版本開始對應(yīng)實(shí)現(xiàn)類改為了RequestMappingHandlerMapping和RequestMappingHandlerAdapter。

  • HandlerMapping的實(shí)現(xiàn)類的作用
    實(shí)現(xiàn)類RequestMappingHandlerMapping了牛,它會處理@RequestMapping 注解颜屠,并將其注冊到請求映射表中。

  • HandlerAdapter的實(shí)現(xiàn)類的作用
    實(shí)現(xiàn)類RequestMappingHandlerAdapter鹰祸,則是處理請求的適配器甫窟,確定調(diào)用哪個類的哪個方法,并且構(gòu)造方法參數(shù)蛙婴,返回值粗井。
    當(dāng)配置了mvc:annotation-driven/后,Spring就知道了我們啟用注解驅(qū)動街图。然后Spring通過context:component-scan/標(biāo)簽的配置浇衬,會自動為我們將掃描到的@Component,@Controller餐济,@Service耘擂,@Repository等注解標(biāo)記的組件注冊到工廠中,來處理我們的請求絮姆。

springmvc處理器方法返回Object醉冤,可以轉(zhuǎn)為json輸出瀏覽器,響應(yīng)ajax的內(nèi)部原理

  1. <mvc:annotation-driven> 注解驅(qū)動實(shí)現(xiàn)的功能是 完成java對象到j(luò)son篙悯,xml蚁阳,text,二進(jìn)制等數(shù)據(jù)格式的轉(zhuǎn)換鸽照。
    HttpMessageConveter接口:消息轉(zhuǎn)換器螺捐。
    功能:定義了java轉(zhuǎn)為json.xml等數(shù)據(jù)格式的方法。這個接口有很多的實(shí)現(xiàn)類移宅。
    這些類完成了java對象到j(luò)son归粉,xml,二進(jìn)制的轉(zhuǎn)換漏峰。會創(chuàng)建7個類糠悼,其中包括:MappingJackson2HttpMessageConverter(使用jackson工具庫中的ObjectMapper轉(zhuǎn)為json字符串)


下面兩個方法是控制器類把結(jié)果輸出給瀏覽器使用的。
boolean canRead(Class<?> var1, @Nullable MediaType var2); boolean canWrite(Class<?> var1, @Nullable MediaType var2);
1.canWrite:作用檢查處理器方法的返回值浅乔,能不能轉(zhuǎn)為var2表示的數(shù)據(jù)格式倔喂。如果能轉(zhuǎn)為json就返回true铝条。
2.write:把處理器方法的返回值對象調(diào)用jackson中的ObjectMapper轉(zhuǎn)為json字符串。

  • @ResponseBody注解
    放在處理器方法上面席噩,通過HttpServletResponse輸出數(shù)據(jù)班缰,響應(yīng)ajax請求的。
  • java實(shí)現(xiàn)

返回對象Student類型悼枢,
1.調(diào)用框架中的ArrayList<HttpMessageConverter>中每個類的canWrite()方法埠忘,檢查那個HttpMessageConverter接口實(shí)現(xiàn)類型處理Student類型的數(shù)據(jù)---- MappingJackson2HttpMessage
2.框架會調(diào)用實(shí)現(xiàn)類的MappingJackson2HttpMessageConverter的write方法
把李四同學(xué)的student對象轉(zhuǎn)為json,調(diào)用Jackson的OjectMapper實(shí)現(xiàn)轉(zhuǎn)為json馒索。
3.框架會調(diào)@ResponseBody把2的結(jié)果數(shù)據(jù)輸出到瀏覽器莹妒,ajax請求處理完成。

    @RequestMapping(value = "/void.do")
    @ResponseBody
    public Object voidTest(String name, int age){
//        調(diào)用service绰上,獲取請求結(jié)果旨怠,Student為結(jié)果對象
        Student student = new Student();
        student.setName(name);
        student.setAge(age);
// 返回json對象
        return student;
    }

返回JsonList

很多情況我們返回是很多個對象,所以我們要返回個

  • 也可以返回Map<key, value>對象

    @RequestMapping("/void.do")
    @ResponseBody
    public Object objectTest(String name, int age){
        Student student = new Student();
        student.setName(name);
        student.setAge(age);
        List<Object> list = new ArrayList<>();
        list.add(student);
        return list;
    }
  
  • js
    @RequestMapping("/void.do")
    @ResponseBody
    public List<Object> objectTest(String name, int age){
        Student student = new Student();
        student.setName(name);
        student.setAge(age);
        List<Object> list = new ArrayList<>();
        list.add(student);
        return list;
    }
 
  • 返回字符串

加上@ResponseBody時 返回字符串蜈块。

    @RequestMapping(value = "/void.do",produces = "text/plain;charset=utf-8")
    @ResponseBody
    public String stringTest2(String name, int age){
        return "haha 1231";
    }

靜態(tài)資源相關(guān)

  • url-pattern

用/的弊端 <url-pattern>/</url-pattern>不能訪問靜態(tài)資源鉴腻。
*.do可以訪問靜態(tài)資源
tomcat本身可以處理靜態(tài)資源,因?yàn)閠omcat的web.xml文件中有一個servlet名稱是default百揭, 在服務(wù)器啟動時創(chuàng)建的爽哎。而使用/會替代defaultServlet,導(dǎo)致所有資源都給了DispatcherServlet處理信峻,默認(rèn)情況下DispatcherServlet沒有處理靜態(tài)資源的能力倦青。
1.處理靜態(tài)資源
2.處理未映射到其他servlet的請求

  • 解決使用/ 無法處理靜態(tài)資源問題

在springmvc中加入<mvc:default-servlet-handler/>
框架會創(chuàng)建控制器對象 defaultServletHandler,最后交給tomcat處理
它和 @RequestMapping有沖突 盹舞,需要加入<mvc:annotation-driven/>解決問題

  • 第二種訪問靜態(tài)資源處理方式

加入<mvc:resources> 框架創(chuàng)建ResourceHttpRequestHandler产镐,框架自己處理不交給tomcat。
mapping屬性:訪問靜態(tài)資源的uri地址踢步,可以使用通配符/*
例如:<mvc:resources mapping="images/" location="/images/"/> image/ 可以標(biāo)識多級目錄或單級
可以寫多個

  • 解決和RequestMapping還是有沖突 加注解驅(qū)動解決
    <mvc:resources mapping="/images/**" location="/images/"/>
    <mvc:resources mapping="/js/**" location="/js/"/>
    <mvc:resources mapping="/html/**" location="/html/"/>
  • 一條配置處理所有資源

把所有靜態(tài)資源都放到static目錄下

  <mvc:resources mapping="/static/**" location="/static/"/>

路徑

在jsp癣亚,html中使用的地址,都是在前端頁面中的地址获印,都是相對地址
地址分類:

  1. 絕對地址述雾, 帶有協(xié)議名稱的是絕對地址, http://www.baidu.com , ftp://202.122.23.1
  2. 相對地址兼丰, 沒有協(xié)議開頭的玻孟,例如 user/some.do , /user/some.do
    參考地址+ 相對地址才能指定資源。
  3. 參考地址鳍征,在頁面中訪問地址不加"/"訪問的是http://localhost:8080/ch06-path(項(xiàng)目地址) 黍翎, 加/訪問的參考地址是http://localhost:8080
  • 解決方案 在jsp中加入${pageContext.request.contextPath}url 就可以解決。

沒/都是使用base中的地址

<head>
<base  />
<base target="_blank" />
</head>

<body>
<img src="eg_smile.gif" />
<a >W3School</a>
</body>


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艳丛,一起剝皮案震驚了整個濱河市匣掸,隨后出現(xiàn)的幾起案子趟紊,更是在濱河造成了極大的恐慌,老刑警劉巖碰酝,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霎匈,死亡現(xiàn)場離奇詭異,居然都是意外死亡送爸,警方通過查閱死者的電腦和手機(jī)铛嘱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碱璃,“玉大人弄痹,你說我怎么就攤上這事∏镀鳎” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵谐丢,是天一觀的道長爽航。 經(jīng)常有香客問我,道長乾忱,這世上最難降的妖魔是什么讥珍? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮窄瘟,結(jié)果婚禮上衷佃,老公的妹妹穿的比我還像新娘。我一直安慰自己蹄葱,他們只是感情好氏义,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著图云,像睡著了一般惯悠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竣况,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天克婶,我揣著相機(jī)與錄音,去河邊找鬼丹泉。 笑死情萤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摹恨。 我是一名探鬼主播筋岛,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼睬塌!你這毒婦竟也來了泉蝌?” 一聲冷哼從身側(cè)響起歇万,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勋陪,沒想到半個月后贪磺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诅愚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年寒锚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片违孝。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡刹前,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雌桑,到底是詐尸還是另有隱情喇喉,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布校坑,位于F島的核電站拣技,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耍目。R本人自食惡果不足惜膏斤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望邪驮。 院中可真熱鬧莫辨,春花似錦、人聲如沸毅访。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俺抽。三九已至敞映,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磷斧,已是汗流浹背振愿。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弛饭,地道東北人冕末。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像侣颂,于是被迫代替她去往敵國和親档桃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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