亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

SpringMVC 的 Controller 返回各種視圖的處理方式

2019-11-15 00:43:36
字體:
來源:轉載
供稿:網友
SPRingMVC 的 Controller 返回各種視圖的處理方式

SpringMVC 的 Controller 可以返回各種各樣的視圖。比如 jsp, JSON, Velocity, FreeMarker, xml, PDF, Excel, 還有Html字符流 等等。那它們該如何的進行處理的呢?這里就涉及到 各種視圖(View)對應的各種視圖解析器(ViewResolver). 基本上上面說的每一種視圖就對應用一種視圖解析器來處理?;旧细鞣N視圖解析器大致上可以分為兩類:一是基于URL的視圖解析器;一種是其它解析器;所謂的UrlBasedViewResolver,就是將返回值作為最終視圖的url的一部分,然后和相關配置組合起來,就是最終的視圖地址url. 我們看下UrlBasedViewResolver的解析器有哪些:

1. 返回JSP

返回JSP是最簡單的,JSP視圖的視圖解析器為 InternalResourceViewResolver,也是一個UrlBasedViewResolver解析器。其對應的解析器的配置一般如下:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>    <property name="prefix" value="/WEB-INF/jsp/"/>    <property name="suffix" value=".jsp"/></bean>

使用該例子,我們好好理解下什么是 “基于URL” 的視圖解析器,比如我們的 Controller 中最后的返回的處理代碼為: return "index"; 那么“基于URL” 的視圖解析器就會將返回值 “index” 作為最后視圖的URL的一部分,然后結合上面的配置 <property name="prefix" value="/WEB-INF/jsp/"/> 和 <property name="suffix" value=".jsp"/>,最后得到最終的URL: "/WEB-INF/jsp/" + "index" + ".jsp" == "/WEB-INF/jsp/index.jsp"

這就是所謂的 “基于URL” 的視圖解析器的工作方式。

2. 返回 HTML 頁面

我們知道在Servlet中,我們是可以直接在其中打印輸出HTML字符流到最終頁面,比如下面的代碼來自阿里巴巴的支付寶的接入示例中的代碼:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        request.setCharacterEncoding("utf-8");        response.setCharacterEncoding("utf-8");                        // ... ...                //建立請求        String sHtmlText = Al
    /**     * 建立請求,以表單HTML形式構造(默認)     * @param sParaTemp 請求參數數組     * @param strMethod 提交方式。兩個值可選:post、get     * @param strButtonName 確認按鈕顯示文字     * @return 提交表單HTML文本     */    public static String buildRequest(Map<String, String> sParaTemp, String strMethod, String strButtonName) {        //待請求參數數組        Map<String, String> sPara = buildRequestPara(sParaTemp);        List<String> keys = new ArrayList<String>(sPara.keySet());        StringBuffer sbHtml = new StringBuffer();        sbHtml.append("<!doctype html><html><head><meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/">");        sbHtml.append("<title>支付寶即時到賬交易接口</title></head><body>");        sbHtml.append("<form id=/"alipaysubmit/" name=/"alipaysubmit/" action=/"" + ALIPAY_GATEWAY_NEW                      + "_input_charset=" + AlipayConfig.input_charset + "/" method=/"" + strMethod                      + "/">");        for (int i = 0; i < keys.size(); i++) {            String name = (String) keys.get(i);            String value = (String) sPara.get(name);            sbHtml.append("<input type=/"hidden/" name=/"" + name + "/" value=/"" + value + "/"/>");        }        //submit按鈕控件請不要含有name屬性        sbHtml.append("<input type=/"submit/" value=/"" + strButtonName + "/" style=/"display:none;/"></form>");        sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>");        sbHtml.append("</body></html>");        return sbHtml.toString();    }

很顯然,Servlet直接將HTML的字符流輸出到了瀏覽器端,那么在SpringMVC中該如何做呢?其實在SpringMVC中我們也是可以如下實現的:

    @RequestMapping(value="/getPage")    public void writeSubmitHtml(Reader reader, Writer writer, Httpsession session) throws IOException {        User user = (User) session.getAttribute(ConstantConfig.LONGIN_USER);        StringBuffer sbHtml = new StringBuffer();        sbHtml.append("<!doctype html><html><head><meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/">");        sbHtml.append("<title>支付寶即時到賬交易接口</title></head><body>"+ user.getNo() +"</body></html>");        writer.write(sbHtml.toString());      }

我們看到我們直接使用了參數 Writer writer,返回值為 void, 其實參數 Writer writer 也可以換成 PrintWriter writer; 直接寫出HTML的字符流。

我們也知道在Servlet中,我們是可以直接forward或者redirecit到html頁面,所以我們也可以如下在springmvc中返回到html頁面:

    @RequestMapping(value="/htmlView")    public void htmlView(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{        // ...        request.getRequestDispatcher("index.html").forward(request, response);     //response.sendRedirect("http://www.baidu.com");    }

這里,我們體會到了:springmvc他是建立在servlet之上的,所以在servlet中能夠做到的,同樣在springmvc一樣有效

3. 返回JSON格式

返回JSON格式在SpringMVC中有多種處理方式,一種是使用SpirngMVC自帶的 MappingJackson2JsonView 來處理,一種是自己寫代碼將返回值JSON格式化,然后直接用PrintWrite類型的對象寫出就行了。

1)直接用PrintWrite類型的對象寫出JSON格式

    @RequiresRoles(value={"student"})    @RequestMapping(value="/queryScoreForStudent")    public void queryScoreForStudent(ScoreQueryParam param, HttpSession sesion, PrintWriter printWriter){        Student student = (Student)sesion.getAttribute(ConstantConfig.LONGIN_STUDENT);        param.setStudentId(student.getId());        PageBean<StudentScore> scoreList = this.studentCourseService.queryScoreForStudent(param);        if(scoreList != null && scoreList.getSize() > 0){            Map<String, Object> map = new HashMap<>();            map.put("result", "ok");            map.put("data", scoreList);            printWriter.write(JSON.toJSONString(map));        }    }

如上代碼所示,我們在方法中加入了 PrintWriter printWriter 參數,最后的返回結果使用了fastjson庫來格式化最后的返回的對象map. 然后使用printWriter寫出,就行了。我們看到方法上的注解并沒有使用 @ResponseBody. 當然最好這里是在方法上加上 @ResponseBody,但是因為返回的map已經是JSON格式的,所以并不需要配置 MappingJackson2JsonView !

2)使用MappingJackson2JsonView 配合@ResponseBody來返回JSON格式

首先需要進行相關的視圖解析器的配置:

     <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">        <property name="mediaTypes">            <map>                <entry key="atom" value="application/atom+xml"/>                <entry key="html" value="text/html"/>                <entry key="json" value="application/json"/>            </map>        </property>        <property name="viewResolvers">            <list>                <!-- <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/> -->                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">                    <property name="prefix" value="/"/>                    <property name="suffix" value=".jsp"/>                </bean>            </list>        </property>        <property name="defaultViews">            <list>                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />            </list>        </property>    </bean>

這里用到了 ContentNegotiatingViewResolver ,“內容協商視圖解析器”,其實就是根據返回什么類型的視圖,就協商使用哪種視圖解析器。如果返回jsp就使用InternalResourceViewResolver視圖解析器,如果返回JSON格式就使用MappingJackson2JsonView來處理。如此而已。在 <property name="viewResolvers"> 下的<list> 標簽下,還可以加入其他的各種視圖解析器的配置。

配置了MappingJackson2JsonView 之后,就沒有必要在自己手動 JSON格式化了,上面的例子,可以改成:

    @RequiresRoles(value={"student"})    @RequestMapping(value="/queryScoreForStudent")    @ResponseBody    public Map<String, Object> queryScoreForStudent(ScoreQueryParam param, HttpSession sesion){        Student student = (Student)sesion.getAttribute(ConstantConfig.LONGIN_STUDENT);        param.setStudentId(student.getId());        PageBean<StudentScore> scoreList = this.studentCourseService.queryScoreForStudent(param);        System.out.println(JSON.toJSONString(scoreList));        if(scoreList != null && scoreList.getSize() > 0){            Map<String, Object> map = new HashMap<>();            map.put("result", "ok");            map.put("data", scoreList);            return map;        }    }

其他格式Velocity, FreeMarker, XML, PDF, Excel等視圖的處理,后面有時間在補上。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久成人人人人精品欧| 久久久欧美一区二区| 欧美亚洲另类激情另类| 国产亚洲精品久久久优势| 久久久国产精品视频| 韩国一区二区电影| 欧美日韩高清在线观看| 国产免费一区二区三区在线观看| 国内精品视频一区| 欧美天天综合色影久久精品| 久久激情视频免费观看| 国产精品日日做人人爱| 不用播放器成人网| 国产日韩亚洲欧美| 在线观看国产精品91| 欧美日韩福利在线观看| 欧美激情第6页| 欧美视频不卡中文| 庆余年2免费日韩剧观看大牛| 国产精品美女午夜av| 中文国产成人精品久久一| 国产精品电影久久久久电影网| 国产精品福利小视频| 精品少妇一区二区30p| 92看片淫黄大片看国产片| 欧美区在线播放| 欧美国产日韩一区| 亚洲精品国产suv| 国精产品一区一区三区有限在线| 欧美激情第三页| 国模精品一区二区三区色天香| www高清在线视频日韩欧美| 一区二区福利视频| 91久久精品久久国产性色也91| 国产精品中文字幕久久久| 91精品久久久久久久久久入口| 亚洲美女视频网站| 欧美亚洲成人xxx| 日韩在线视频播放| 午夜免费久久久久| 成人av.网址在线网站| 亚洲国产成人精品久久| 人人爽久久涩噜噜噜网站| 九九九久久国产免费| 精品福利免费观看| 国产精品成久久久久三级| 国产欧美精品一区二区三区-老狼| 另类专区欧美制服同性| 日韩av在线免费观看| 日韩亚洲欧美中文高清在线| xxav国产精品美女主播| 欧美黑人性生活视频| 亚洲在线观看视频网站| 2019av中文字幕| 成人性生交大片免费观看嘿嘿视频| 欧美日韩免费在线| 国产精品羞羞答答| 国色天香2019中文字幕在线观看| 这里只有精品丝袜| 91影视免费在线观看| 亚洲黄色片网站| 日韩精品亚洲元码| 好吊成人免视频| 久久久国产精彩视频美女艺术照福利| 国产精品美女在线观看| 92裸体在线视频网站| 亚洲最新在线视频| 国产热re99久久6国产精品| 庆余年2免费日韩剧观看大牛| 欧美日韩xxxxx| 国产精品久久久久久久久久99| 国模吧一区二区| 搡老女人一区二区三区视频tv| 深夜福利91大全| 亚洲精品小视频| 91精品国产电影| 国产精品久久久久国产a级| 欧美专区国产专区| 欧美精品日韩www.p站| 欧美高跟鞋交xxxxhd| 91av在线视频观看| 91亚洲精品久久久| 久久久最新网址| 欧美大片在线看免费观看| 久久久久久久电影一区| 成人伊人精品色xxxx视频| 中文字幕亚洲无线码a| 丝袜情趣国产精品| 一本色道久久88综合日韩精品| 亚洲免费精彩视频| 欧美中文在线观看| 成人av番号网| 亚洲国语精品自产拍在线观看| 欧美在线观看一区二区三区| 国产精自产拍久久久久久蜜| 欧美另类老肥妇| 欧美日本国产在线| 精品精品国产国产自在线| 日本亚洲精品在线观看| 国精产品一区一区三区有限在线| 欧美亚洲一级片| 久久91超碰青草是什么| 亚洲人成网站在线播| 午夜精品视频在线| 成人xxxx视频| 日韩风俗一区 二区| 国产日韩精品一区二区| 日韩电影视频免费| 亚洲精品视频免费| 尤物tv国产一区| 2019亚洲日韩新视频| 亚洲国产成人在线播放| 亚洲欧洲高清在线| 欧美另类在线观看| 成人免费观看a| 精品国偷自产在线视频99| 国产精品久久中文| 在线亚洲男人天堂| 久久精品成人欧美大片| 九九热这里只有精品免费看| 日本高清+成人网在线观看| 亚洲国产日韩一区| 亚洲情综合五月天| 中文日韩在线观看| 中文字幕一精品亚洲无线一区| 国产精品自拍偷拍视频| 亚洲高清福利视频| 亚洲午夜久久久久久久| 久热精品视频在线| 亚洲曰本av电影| 在线精品视频视频中文字幕| 欧美一级高清免费播放| 2019亚洲男人天堂| 国产在线播放不卡| 亚洲精品欧美日韩| 国产97人人超碰caoprom| 亚洲精品91美女久久久久久久| 成人免费看黄网站| 另类天堂视频在线观看| 成人激情视频在线观看| 另类少妇人与禽zozz0性伦| 国产成人精品久久亚洲高清不卡| 亚洲日本aⅴ片在线观看香蕉| 亚洲天堂av在线免费观看| 成人信息集中地欧美| 国产精品福利网| 精品久久久久久久久久ntr影视| 欧美激情亚洲国产| 亚洲精品福利在线| 粉嫩老牛aⅴ一区二区三区| 九九久久精品一区| 亚洲福利视频二区| 久久精品最新地址| 国产91在线视频| 成人性生交xxxxx网站| 伊人伊成久久人综合网站| 欧美激情一区二区三级高清视频| 日韩中文字幕在线视频播放| 欧美肥婆姓交大片| 精品动漫一区二区三区| 亚洲国产精品va在线看黑人| 亚洲国产成人在线播放| 精品激情国产视频| 在线观看亚洲视频|