springMVC的請求和響應

1 SpringMVC數據響應

1.1 SpringMVC數據響應的方式

  1. 頁面跳轉
    直接返回字符串
    通過ModelAndView對象返回
  2. 回寫數據
    直接返回字符串
    返回對象或集合

1.2 SpringMVC的數據響應-頁面跳轉-返回字符串形式

在這裏插入圖片描述

1.3 SpringMVC的數據響應-頁面跳轉-返回ModelAndView形式1

Controller中的方法中返回ModelAndVIew對象,並且設置視圖名稱

@RequestMapping(value="/quick2")    
public ModelAndView save2(){        
	 /*            
	 Model:模型 作用封裝數據           
	 View:視圖 作用展示數據         
	 */        
 	ModelAndView modelAndView = new ModelAndView();    
    modelAndView.addObject("username","ldy");   //設置模型數據
    modelAndView.setViewName("success");//設置視圖名稱   
    return modelAndView;    
  }

1.4 SpringMVC的數據響應-頁面跳轉-返回ModelAndView形式2

Controller中的方法形參上直接聲明ModelAndView,無需在方法中創建,在方法中直接使用該對象設置視圖,同樣可以跳轉頁面。

   @RequestMapping(value="/quick3")
   public ModelAndView save3(ModelAndView modelAndView){
       modelAndView.addObject("username","ldy");
       modelAndView.setViewName("success");
       return modelAndView;
   }
   
   @RequestMapping(value="/quick4")
   public String save4(Model model){
       model.addAttribute("username","江西財經");
       return "success";
   }

1.5 SpringMVC的數據響應-頁面跳轉-返回ModelAndView3

Controller方法的形參上可以直接使用原生的HttpServletRequest對象,只需聲明即可

@RequestMapping(value="/quick5")
public String save5(HttpServletRequest request){
    request.setAttribute("username","酷丁魚");
    return "success";
}

1.6 SpringMVC的數據響應-回寫數據-直接回寫字符串

通過SpringMVC框架注入的response對象,使用response.getWriter().print("Hello World!")回寫數據,此時不需要視圖跳轉,業務方法返回void

將需要回寫的字符串直接返回,但此時需要通過@ResponseBody註解告知Spring框架,方法返回的字符串不是跳轉,而是直接在http響應體中返回。

@RequestMapping(value="/quick7")
@ResponseBody  //告知SpringMVC框架 不進行視圖跳轉 直接進行數據響應
public String save7() throws IOException {
    return "hello jxufe";
}

@RequestMapping(value="/quick6")
public void save6(HttpServletResponse response) throws IOException {
    response.getWriter().print("hello rjywlwxy");
}

1.7 SpringMVC的數據響應-回寫數據-直接回寫json格式字符串

@RequestMapping(value="/quick8")
@ResponseBody
 public String save8() throws IOException {
     return "{\"username\":\"zhangsan\",\"age\":18}";
 }

手動拼接json格式字符串的方式很麻煩,開發中往往需要將複雜的java對象轉換成json格式的字符串,我們可以使用json格式轉換工具jackson進行轉換,通過jackson轉換json格式字符串,回寫字符串。

@RequestMapping(value="/quick9")
@ResponseBody
public String save9() throws IOException {
    User user = new User();
    user.setUsername("lisi");
    user.setAge(30);
    //使用json的轉換工具將對象轉換成json格式字符串在返回
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(user);

    return json;
}

1.8 SpringMVC的數據響應-回寫數據-返回對象或集合

通過SpringMVC幫助我們對對象或集合進行json字符串的轉換並寫回,爲處理器適配器配置消息轉換參數,指定使用jackson進行對象或集合的轉換,因此需要在spring-mvc.xml中進行如下配置:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>
@RequestMapping(value="/quick10")
@ResponseBody
//期望SpringMVC自動將User轉換成json格式的字符串
public User save10() throws IOException {
    User user = new User();
    user.setUsername("lisi2");
    user.setAge(32);
    return user;
}

1.9 SpringMVC的數據響應-回寫數據-返回對象或集合2

在方法上添加@ResponseBody就可以返回json格式的字符串,但是這樣配置起來比較麻煩,配置的代碼比較多,因此,我們可以使用mvc註解驅動代替上述配置。

<mvc:annotation-driven/>

在SpringMVC各個組件中,處理器映射器、處理器適配器、視圖解析器被稱爲SpringMVC的三大組件。使用<mvc:annotation-driven/>自動加載RequestMappingHandlerMapping處理器映射器和RequestMappingHandlerAdapter處理器適配器,可以在spring-mvc.xml配置文件中使用<mvc:annotation-driven/>替代註解處理器和適配器的配置,同時使用<mvc:annotation-driven/>默認底層就會集成jackson進行對象或集合的json格式字符串轉換。

2 SpringMVC請求

2.1 SpringMVC的請求-獲得請求參數-請求參數類型

客戶端請求參數的格式是:name=value&name=value......,服務器端要獲得請求的參數,有事還需要進行數據的封裝,SpringMVC可以接受如下類型的參數:
基本類型參數
POJO類型參數
數組類型參數
集合類型參數

2.2 SpringMVC的請求-獲得請求參數-獲得基本類型參數

Controller中的業務方法的參數名稱要與請求參數的name一致,參數值會自動映射配置,並且能夠自動做類型轉換。
自動類型轉換是指從Spring向其他類型轉換

http://localhost:8080/ldy_springmvc/quick9?username=zhangsan&age=12

@RequestMapping(value="/quick11")
@ResponseBody
public void save11(String username,int age) throws IOException {
    System.out.println(username);
    System.out.println(age);
}

2.3 SpringMVC的請求-獲得請求參數-獲得POJO類型參數

Controller中的業務方法的POJO參數的屬性名與請求參數的name一致,參數值會自動映射匹配。

public class User {

    private String username;
    private int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
}
@RequestMapping(value="/quick12")
    @ResponseBody
    public void save12(User user) throws IOException {
        System.out.println(user);
    }

2.4 SpringMVC的請求-獲得請求參數-獲得數組類型參數

Controller中的業務方法數組名稱與請求參數的name一致,參數值會自動映射。

@RequestMapping(value="/quick13")
@ResponseBody
public void save13(String[] strs) throws IOException {
    System.out.println(Arrays.asList(strs));
}

2.5 SpringMVC的請求-獲得請求參數-獲得集合類型參數1

獲得集合參數時,要將集合參數包裝到一個POJO中纔可以。

<form action="${pageContext.request.contextPath}/user/quick14" method="post">
   <%--表明是第一個User對象的username age--%>
    <input type="text" name="userList[0].username"><br/>
    <input type="text" name="userList[0].age"><br/>
    <input type="text" name="userList[1].username"><br/>
    <input type="text" name="userList[1].age"><br/>
    <input type="submit" value="提交">
</form>
import java.util.List;

public class VO {

    private List<User> userList;

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    @Override
    public String toString() {
        return "VO{" +
                "userList=" + userList +
                '}';
    }
}
@RequestMapping(value="/quick14")
@ResponseBody
public void save14(VO vo) throws IOException {
    System.out.println(vo);
}

2.6 SpringMVC的請求-獲得請求參數-獲得集合類型參數2

當使用ajax提交時,可以指定contentType爲json形式,那麼在方法參數位置使用@RequestBody可以直接接收集合數據而無需使用POJO進行包裝

<script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
    <script>
        var userList = new Array();
        userList.push({username:"zhangsan",age:18});
        userList.push({username:"lisi",age:28});

        $.ajax({
            type:"POST",
            url:"${pageContext.request.contextPath}/user/quick15",
            data:JSON.stringify(userList),
            contentType:"application/json;charset=utf-8"
        });

    </script>
@RequestMapping(value="/quick15")
@ResponseBody
public void save15(@RequestBody List<User> userList) throws IOException {
    System.out.println(userList);
}

2.7 SpringMVC的請求-獲得請求參數-靜態資源訪問的開啓

當有靜態資源需要加載時,比如jquery文件,通過谷歌開發者工具抓包發現,沒有加載到jquery文件,原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表對所有的資源都進行過濾操作,我們可以通過以下兩種方式指定放行靜態資源:

  1. spring-mvc.xml配置文件中指定放行的資源

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

  2. 使用<mvc:default-servlet-handler/>標籤

<!--開發資源的訪問-->
<!--
	<mvc:resources mapping="/js/**" location="/js/"/>
	<mvc:resources mapping="/img/**" location="/img/"/>
-->

<mvc:default-servlet-handler/>

2.8 SpringMVC的請求-獲得請求參數-配置全局亂碼過濾器

當post請求時,數據會出現亂碼,我們可以設置一個過濾器來進行編碼的過濾。

<!--配置全局過濾的filter-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2.9 SpringMVC的請求-獲得請求參數-參數綁定註解@RequestParam

當請求的參數名稱與Controller的業務方法參數名稱不一致時,就需要通過@RequestParam註解顯示的綁定

<form action="${pageContext.request.contextPath}/quick16" method="post">
    <input type="text" name="name"><br>
    <input type="submit" value="提交"><br>
</form>
@RequestMapping(value="/quick16")
@ResponseBody
public void save16(@RequestParam(value="name",required = false,defaultValue = "jxufe") String username) throws IOException {
    System.out.println(username);
}

2.10 SpringMVC的請求-獲得請求參數-Restful風格的參數的獲取

Restful是一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件。主要用於客戶端和服務器交互類的軟件,基於這個風格設計的軟件可以更簡潔,更有層次,更易於實現緩存機制等。

Restful風格的請求是使用“url+請求方式”表示一次請求目的的,HTTP 協議裏面四個表示操作方式的動詞如下:

GET:用於獲取資源

POST:用於新建資源

PUT:用於更新資源

DELETE:用於刪除資源

例如:

/user/1 GET : 得到 id = 1 的 user

/user/1 DELETE: 刪除 id = 1 的 user

/user/1 PUT: 更新 id = 1 的 user

/user POST: 新增 user

上述url地址/user/1中的1就是要獲得的請求參數,在SpringMVC中可以使用佔位符進行參數綁定。地址/user/1可以寫成/user/{id},佔位符{id}對應的就是1的值。在業務方法中我們可以使用@PathVariable註解進行佔位符的匹配獲取工作。

http://localhost:8080/ldy_springmvc/quick17/zhangsan

@RequestMapping(value="/quick17/{name}")
@ResponseBody
 public void save17(@PathVariable(value="name") String username) throws IOException {
        System.out.println(username);
 }

2.11 SpringMVC的請求-獲得請求參數-自定義類型轉換器

SpringMVC 默認已經提供了一些常用的類型轉換器,例如客戶端提交的字符串轉換成int型進行參數設置。

但是不是所有的數據類型都提供了轉換器,沒有提供的就需要自定義轉換器,例如:日期類型的數據就需要自定義轉換器。

public class DateConverter implements Converter<String, Date> {
    public Date convert(String dateStr) {
        //將日期字符串轉換成日期對象 返回
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = format.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}
@RequestMapping(value="/quick18")
    @ResponseBody
    public void save18(Date date) throws IOException {
        System.out.println(date);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章