整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Spring MVC 框架學習-返回頁面+加載靜態資

          Spring MVC 框架學習-返回頁面+加載靜態資源

          章目錄

          • Spring 框架學習(六)---- 返回頁面+加載靜態資源
          • 2、返回 application/json
          • 1、請求轉發forword 和 重定向的區別2、請求轉發的訪問資源問題演示

          Spring 框架學習(六)---- 返回頁面+加載靜態資源

          一、返回頁面

          不加 @ResponseBody ,默認是返回一個網頁

          @RequestMapping("/getPage")
              public String getPage(){
           
                  return "index.html";
              }

          二、返回非頁面的數據

          ??返回非頁面的數據,必須在方法或者類上加 @ResponseBody,同時 我們返回的類型 springmvc會自動解析成對應的格式,不需要我們進行手動指定

          1、返回 text/html

          @RequestMapping("/getText")
              @ResponseBody
              public String getHTML(String name){
           
                  return "<h1>你好,歡迎用戶:"+name+"<h1>";
              }

          訪問接口,自動解析成 html格式

          通過 Fiddler 進行抓包,查看返回響應的格式為 text/html。

          2、返回 application/json

          使用map存儲數據,返回map

          @RequestMapping("/getmap")
              @ResponseBody
              public Object getJson(){
           
                  HashMap<Object,Object> map=new HashMap<>();
                  map.put("msg","登陸成功");
                  map.put("status",200);
          
                  return map;
              }

          自動解析稱為 json 格式的數據

          三、加載靜態資源

          咱們就直接定死了寫的格式

          在webapp目錄下創建static文件夾保存 css、js、html 資源

          同時在spring-mvc.xml 文件中加入 過濾靜態資源、加載靜態資源的配置

          <!--    過濾靜態資源,  /.jsp  /.html 不會經過-->
              <mvc:default-servlet-handler/>
          
          
           <!--加載靜態資源location表示訪問的路徑return"/static/login.html",mapping表示映射的靜態資源位置-->
              <mvc:resources location="/static/css/" mapping="/static/css/**"/>
              <mvc:resources location="/static/js/" mapping="/static/js/**"/>
              <mvc:resources location="/static/" mapping="/static/**"/>

          我們來試一下訪問靜態資源

          在wbeapp目錄下創建static文件,將css/js/html等文件添加進去

          web.xml 配置文件

          <?xml version="1.0" encoding="UTF-8" ?>
          <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                                       http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
                   version="4.0">
          
            <servlet>
              <servlet-name>springmvc</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
              </init-param>
              <load-on-startup>1</load-on-startup>
              <multipart-config>
                <max-file-size>20848820</max-file-size>
                <max-request-size>418018841</max-request-size>
                <file-size-threshold>1048576</file-size-threshold>
              </multipart-config>
            </servlet>
          
            <servlet-mapping>
              <servlet-name>springmvc</servlet-name>
              <url-pattern>/</url-pattern>
            </servlet-mapping>
          
          </web-app>

          spring-mvc.xml 配置文件

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:context="http://www.springframework.org/schema/context"
                 xmlns:mvc="http://www.springframework.org/schema/mvc"
                 xsi:schemaLocation="http://www.springframework.org/schema/beans
                  http://www.springframework.org/schema/beans/spring-beans.xsd
                  http://www.springframework.org/schema/context
                  https://www.springframework.org/schema/context/spring-context.xsd
                  http://www.springframework.org/schema/mvc
                  http://www.springframework.org/schema/mvc/spring-mvc.xsd">
              
          
              <!--    開啟注解掃描,將使用注解的類托管到spring 容器中-->
              <context:component-scan base-package="com.*"/>
          
              <!--    過濾靜態資源,  /.jsp  /.html 不會經過-->
              <mvc:default-servlet-handler/>
          
          <!--    加載靜態資源文件-->
              <mvc:resources location="/static/css/" mapping="/static/css/**"/>
              <mvc:resources location="/static/js/" mapping="/static/js/**"/>
              <mvc:resources location="/static/" mapping="/static/**"/>
          
              <!--    開啟mvc注解驅動-->
              <mvc:annotation-driven>
                  <mvc:message-converters register-defaults="true">
                      <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                          <property name="supportedMediaTypes">
                              <list>
                                  <value>text/html;charset=UTF-8</value>
                                  <value>application/json;charset=UTF-8</value>
                              </list>
                          </property>
                      </bean>
                  </mvc:message-converters>
          
          
          
              </mvc:annotation-driven>
          
          </beans>

          在controller層進行訪問靜態html文件(經過css、js渲染)

          @RequestMapping("/login")
              public String getLog(){
           
                  return "redirect:/static/login.html";
              }

          四、轉發和重定向

          1、請求轉發forword 和 重定向的區別

          (1) 重定向 將請求重新定位到資源的位置,請求轉發是服務器端進行轉發的

          (2)請求重定向url地址發生改變,請求轉發地址不發生變化

          (3)請求重定向于直接訪問新地址的效果一樣,不存在原來的外部資源不能訪問,請求轉發服務器端的轉發可能會造成外部資源不能訪問(js、css)

          如果外部資源與轉發訪問的頁面不在同一級目錄下,會造成外部資源不可訪問。

          2、請求轉發的訪問資源問題演示

          通過轉發的請求資源都直接通過 8080:/a/login 這個接口的同一級目錄下直接訪問,當然找不到資源

          請求重定向相當于 輸入的url變了,直接訪問到 /static/login/html,同時附帶的資源在在這一目錄下能夠訪問到。

          3、頁面跳轉

          1、請求轉發: 服務器放客戶進行請求轉發并將結果響應給客戶端,URL是不會變的

          2、請求重定向:服務器端請求重新定義到要訪問的地址。URL會放生改變。

          總結:

          • 請求轉發的URL地址不變,因為是服務器端進行轉發和響應的,所以重定向URL地址會發生改變,因為服務器端直接將請求重定向到具體的地址上
          • 使用請求轉發那么有可能會發生資源丟失,訪問不到外部資源。請求重定向是直接重定向到URL地址,所以請求重定向和直接訪問目標地址的效果是一樣的,所以不會存在外部資源丟失的情況。

          五、組合注解

          @RestController

          相當于 @Controller + @ResponseBody

          只能加到類上

          紹一下SpringMVC視圖解析器。當我們對SpringMVC控制的資源發起請求時,這些請求都會被SpringMVC的DispatcherServlet處理,接著spring會分析看哪一個HandlerMapping定義的所有請求映射中存在對該請求的最合理的映射。然后通過該HandlerMapping取得其對應的Handler,接著再通過相應的HandlerAdapter處理該Handler。HandlerAdapter在對Handler進行處理之后會返回一個ModelAndView對象。在獲得了ModelAndView對象之后,Spring就需要把該View渲染給用戶,即返回給瀏覽器。在這個渲染的過程中,發揮作用的就是ViewResolver和View。當Handler返回的ModelAndView中不包含真正的視圖,只返回一個邏輯視圖名稱的時候,ViewResolver就會把該邏輯視圖名稱解析為真正的視圖View對象。View是真正進行視圖渲染,把結果返回給瀏覽器的。

          ViewResolver和View介紹

          SpringMVC用于處理視圖最重要的兩個接口是ViewResolver和View。ViewResolver的主要作用是把一個邏輯上的視圖名稱解析為一個真正的視圖,SpringMVC中用于把View對象呈現給客戶端的是View對象本身,而ViewResolver只是把邏輯視圖名稱解析為對象的View對象。View接口的主要作用是用于處理視圖,然后返回給客戶端。

          Spring為我們提供了非常多的視圖解析器,下面將列舉一些視圖解析器。

          AbstractCachingViewResolver:這是一個抽象類,這種視圖解析器會把它曾經解析過的視圖保存起來,然后每次要解析視圖的時候先從緩存里面找,如果找到了對應的視圖就直接返回,如果沒有就創建一個新的視圖對象,然后把它放到一個用于緩存的map中,接著再把新建的視圖返回。使用這種視圖緩存的方式可以把解析視圖的性能問題降到最低。

          UrlBasedViewResolver:它是對ViewResolver的一種簡單實現,而且繼承了AbstractCachingViewResolver,主要就是提供的一種拼接URL的方式來解析視圖,它可以讓我們通過prefix屬性指定一個指定的前綴,通過suffix屬性指定一個指定的后綴,然后把返回的邏輯視圖名稱加上指定的前綴和后綴就是指定的視圖URL了。如prefix=/WEB-INF/jsps/,suffix=.jsp,返回的視圖名稱viewName=test/indx,則UrlBasedViewResolver解析出來的視圖URL就是/WEB-INF/jsps/test/index.jsp。默認的prefix和suffix都是空串。URLBasedViewResolver支持返回的視圖名稱中包含redirect:前綴,這樣就可以支持URL在客戶端的跳轉,如當返回的視圖名稱是”redirect:test.do”的時候,URLBasedViewResolver發現返回的視圖名稱包含”redirect:”前綴,于是把返回的視圖名稱前綴”redirect:”去掉,取后面的test.do組成一個RedirectView,RedirectView中將把請求返回的模型屬性組合成查詢參數的形式組合到redirect的URL后面,然后調用HttpServletResponse對象的sendRedirect方法進行重定向。同樣URLBasedViewResolver還支持forword:前綴,對于視圖名稱中包含forword:前綴的視圖名稱將會被封裝成一個InternalResourceView對象,然后在服務器端利用RequestDispatcher的forword方式跳轉到指定的地址。使用UrlBasedViewResolver的時候必須指定屬性viewClass,表示解析成哪種視圖,一般使用較多的就是InternalResourceView,利用它來展現jsp,但是當我們使用JSTL的時候我們必須使用JstlView。下面是一段UrlBasedViewResolver的定義,根據該定義,當返回的邏輯視圖名稱是test的時候,UrlBasedViewResolver將把邏輯視圖名稱加上定義好的前綴和后綴,即“/WEB-INF/test.jsp”,然后新建一個viewClass屬性指定的視圖類型予以返回,即返回一個url為“/WEB-INF/test.jsp”的InternalResourceView對象。

          Xml代碼


          1. <bean
          2. class="org.springframework.web.servlet.view.UrlBasedViewResolver">
          3. <property name="prefix" value="/WEB-INF/" />
          4. <property name="suffix" value=".jsp" />
          5. <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/>
          6. </bean>

          跳轉關鍵字 forward: redirect:

          注意:返回值不寫關鍵字時 默認是轉發跳轉

          返回值寫了關鍵字時,視圖解析器不在為你拼接前后綴,寫完整的跳轉路徑

          1、C--->V

          由C(控制器)跳轉到頁面V(視圖)

          @RequestMapping("/test1")
          public String test1(){
              System.out.println("c--->v");
              //重定向跳轉   index.jsp
              return "redirect:/index.jsp";
              //轉發跳轉    /view/hello.jsp
              //return "forward:/view/hello.jsp";
          }

          2、C--->C

          由由C(控制器)跳轉到C(控制器)

          @RequestMapping("/test2")
          public String test2(){
              System.out.println("c--->c");
              //轉發跳轉   /jump/test1           
              //return "forward:/jump/test1";    絕對路徑,適用于跨類的跳轉
              //跳轉到當前類下的路徑為test1的方法中 
              //return "forward:/test1";         相對路徑
              //重定向到  /jump/test1            
              //return "redirect:/jump/test1";   絕對路徑
              return "redirect:/test1";         
          }

          3、跳轉細節

          在增刪改之后,為了防止請求重復提交,進行重定向跳轉

          在查詢之后,可以做轉發跳轉

          C---->C :增刪改后銜接一個查詢

          C---->V:查詢后銜接一個視圖

          4、JSP細節

          不應該直接訪問jsp,應該先過C,查到數據后,在轉發jsp

          可以將所有jsp都放入WEB-INF目錄下,即可強制不接受外界直接訪問,只能由C轉發

          傳值

          C得到數據后,轉發V,并向V傳遞數據,進而V中可以渲染數據,讓用戶看到含有數據的頁面

          轉發跳轉(在一個請求中):Request作用域

          重定向跳轉(在一個會話中):Session作用域

          1、獲得Request和Session

          <!--導入依賴-->
          <!--=====================Servlet======================-->
              <!--jstl支持-->
              <dependency>
                <groupId>javax.servlet.jsp.jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
              </dependency>
          
              <!--servlet編譯環境-->
              <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
              </dependency>
          
              <!--jsp編譯環境-->
              <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.0</version>
                <scope>provided</scope>
              </dependency>
              <!--=====================Servlet======================-->
          @RequestMapping("test1")
          public String test1(HttpServletRequest request, HttpSession session){
              request.setAttribute("name","張三");
              session.setAttribute("age",19);
              return "data";
          }

          2、JSP中取值

          <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
          <html>
          <body>
          <h2>Hello World!</h2>
          ${requestScope.name}--${sessionScope.age}
          </body>
          </html>
          
          注意:1、requestScope和sessionScope可以忽略,這樣的寫法更加精確的取哪個作用域的值
               2、EL表達式取作用域的值時頁面顯示的時${requestScope.name}--${sessionScope.age}
                 解決方法1:頁面上加上 isELIgnored(是否忽略EL表達式)="false"
                 解決方法2:web.xml在<jsp-property-group>里設置一組jsp文件是否忽略EL

          了解:Model, ModelAndView

          ModelAndView:springmvc底層使用的一個類,封裝了視圖跳轉的名稱和傳遞的值

          Model:視圖技術有很多(jsp、velocity、freeMarker等等),有些視圖可能取不到常用的作用域的值

          Model中存值則避免了視圖取不到作用域中值得問題,實現了視圖和作用域之間得解耦。

          @RequestMapping("test2")
          public String test2(Model model,HttpSession session){
              model.addAttribute("name","張三");
              session.setAttribute("age",29);
              return "data";
          }
          
          @RequestMapping("test3")
          public ModelAndView test3(){
              ModelAndView modelAndView=new ModelAndView();
              modelAndView.setViewName("data");
              modelAndView.addObject("name","張三");
              modelAndView.addObject("age",19);
              return modelAndView;
          }

          靜態資源

          <!--tomcat中的web.xml全局配置文件-->
          <!-- The default servlet for all web applications, that serves static resources-->
          <servlet>
              <servlet-name>default</servlet-name>
              <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
          </servlet>
          <servlet-mapping>
              <servlet-name>default</servlet-name>
              <url-pattern>/</url-pattern>
          </servlet-mapping>

          靜態資源:html、js文件、css文件、圖片文件

          tomcat中有個全局的servlet:org.apache.catalina.servlets.DefaultServlet,專門用于處理靜態資源問題。

          但在springmvc的配置文件中DispatcherServlet也采用了"/"作為url-pattern,則項目中不會在使用全局的servlet,則靜態資源不能完成訪問

          1、解決方案1

          DispatcherServlet中的url-pattern使用其他的,例如 *.action

          出現的問題:所有請求的結尾都要加上.action,比較麻煩

          <servlet>
              <servlet-name>mvc</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          </servlet>
          <servlet-mapping>
              <servlet-name>mvc</servlet-name>
              <url-pattern>*.action</url-pattern>
          </servlet-mapping>

          2、解決方案2

          <!--在項目中  自動添加一個映射("/**":DefaultServletHttpRequestHandler)
              請求進入前端后,會先匹配自定義的handler,如果沒有匹配則進入DefaultServletHttpRequestHandler
              DefaultServletHttpRequestHandler會將請求轉發給tomcat中名為"default"的servlet
              這個servlet就是tomcat中全局配置web.xml中處理靜態資源的servlet
              -->
          <mvc:default-servlet-handler/>

          JSON處理

          springMVC默認的json解決方案選擇是Jackson,所以只需要導入jackson的jar包,即可使用。

          Json是一種輕量級的數據交換格式,采用一種“鍵:值”對的文本格式來存儲和表示數據,在系統交換數據過程中常常被使用,是一種理想的數據交換語言。

          遠古時代采用xml格式進行數據交換(重量級)

          1、導入依賴

          <!--jackson-->
          <dependency>
              <groupId>com.fasterxml.jackson.core</groupId>
              <artifactId>jackson-databind</artifactId>
              <version>2.12.5</version>
          </dependency>

          2、@ResponseBody

          @RequestMapping("test1")
          //將handler的返回值,轉換成json,并將json響應給客戶端
          @ResponseBody
          public User test1(){
              System.out.println("test1");
              return new User(1,"張三",true,new Date());
          }

          3、日期格式化

          public class User {
              private Integer id;
              private String name;
              private Boolean gender;
              @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
              private Date registerTime;
          }
          
          //@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
          //在日期上添加如上格式,就是一個拆裝箱的過程。將數據交換時日期格式轉換成自己想要的格式

          4、FastJson

          <!--導入fastjson依賴-->
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>fastjson</artifactId>
              <version>1.2.78</version>
          </dependency>

          4.1、安裝FastJson

          由于springmvc默認支持的是Jackson,所以要想使用第三方json處理方案,讓springmvc識別FastJsonHttpMessageConverter,必須加上如下配置:

          <mvc:annotation-driven>
              <mvc:message-converters>
                  <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                      <!--聲明轉換類型:json-->
                      <property name="supportedMediaTypes">
                          <list>
                              <!--順序不能反,不然使用ie時會出現下載提示-->
                              <value>text/html;charset=utf-8</value>
                              <value>application/json;charset=utf-8</value>
                          </list>
                      </property>
                  </bean>
              </mvc:message-converters>
          </mvc:annotation-driven>

          4.2、日期格式化

          public class User {
              private Integer id;
              private String name;
              private Boolean gender;
              @JSONField(format="yyyy-MM-dd HH:mm:ss")
              private Date registerTime;
          }
          
          //@JSONField(format="yyyy-MM-dd HH:mm:ss")
          //在日期上添加如上格式,就是一個拆裝箱的過程。將數據交換時日期格式轉換成自己想要的格式

          5、@RestController

          這是一個復合注解

          相當于@Controller + @ResponseBody

          @RestController
          @RequestMapping("json")
          public class JsonController {
              @RequestMapping("test1")
              //@ResponseBody
              public User test1(){
                  System.out.println("test1");
                  return new User(1,"張三",true,new Date());
              }
          
              @RequestMapping("test2")
              //@ResponseBody
              public List<User> test2(){
                  System.out.println("test2");
                  List<User> users=Arrays.asList(new User(1, "張三", true, new Date()), new User(2, "李四", true, new Date()));
                  return users;
              }
          }

          6、@RequestBody

          @RequestBody,接收json參數 (post請求)


          主站蜘蛛池模板: 无码国产精品一区二区免费式直播| 亚州AV综合色区无码一区 | 最新中文字幕一区二区乱码| 精品国产亚洲一区二区三区| 国产成人无码AV一区二区在线观看| 老鸭窝毛片一区二区三区| 国产一区二区三区播放| 亚洲日本一区二区三区在线不卡| 成人精品视频一区二区三区| 免费视频精品一区二区三区| 国产精品自在拍一区二区不卡| 视频一区二区三区免费观看| 日韩在线视频一区二区三区| 精品乱子伦一区二区三区高清免费播放| 国产Av一区二区精品久久| 无码人妻一区二区三区免费| 国产午夜精品一区二区三区极品| 亚洲性无码一区二区三区| 奇米精品一区二区三区在| 久久久精品日本一区二区三区| 久久精品国产一区二区三区不卡 | 一区一区三区产品乱码| 99在线精品一区二区三区| 一本久久精品一区二区| 人妻互换精品一区二区| 精品国产AV无码一区二区三区 | 国产综合无码一区二区色蜜蜜| 91福利国产在线观看一区二区| 久久亚洲色一区二区三区| 精品无码综合一区| 文中字幕一区二区三区视频播放| 国产成人一区二区三中文| 亚洲熟女综合色一区二区三区| 国产成人无码精品一区不卡| 一区二区三区高清在线| 日本无码一区二区三区白峰美| 国产乱码精品一区二区三区四川人| 老鸭窝毛片一区二区三区| 国产亚洲3p无码一区二区| 无码av不卡一区二区三区| 国产一区视频在线|