Spring MVC請求參數綁定 自定義類型轉化 和獲取原聲帶額servlet request response信息

首先還在咱們的框架的基礎上創建文件html

 

 

在domian下創建Account實體類前端

 

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "/account")
public class Account {

    private String username;
    private  String password;
    private Double money;

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Double getMoney() {
        return money;
    }

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

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                '}';
    }
}
Account

 

而後在controller中的 類中進行對象綁定java

 

在controller中的ParamsController中的創建一個方法接受這個類對象python

    @RequestMapping(value = "/accout")
    public String save(Account account){  //把Account類中的信息都有封裝進去  
        return "success";
    }

 

而後傳參的時候把對象的值得信息給傳遞進去web

前端定義界面spring

<form action="/params/accout" method="post">


    姓名:<input name="username" type="text"/> <br/>   //傳遞的是account類中的屬性值 由於請求路徑中須要的參數的封裝進了account類中 也就是把參數給整合了
    密碼:<input name="password" type="text"/> <br/>
    金額:<input name="money" type="text"/> <br/>

    <input type="submit" value="提交"/>



</form>

 

這個時候請求是能夠成功的  由於就至關於把須要的參數給整合在一塊兒了session

 

 

若是對象中再包含對象怎麼作呢?mvc

下面看app

 

 

咱們再創建一個對象類User框架

 

 

User:

public class User {



    private  String username;
    private  String u_password;

    public String getUsername() {
        return username;
    }

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

    public String getU_password() {
        return u_password;
    }

    public void setU_password(String u_password) {
        this.u_password = u_password;
    }

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

 

而後把User這個對象傳遞到Account中

get  set 和toString方法也要從新生成

 

而後再把Account當成參數的時候  那麼久也須要對Account中封裝的User類也要傳遞參數的

 

這個時候的前端傳值要把那個對象的名字也加上

 

前端傳值:  直接在值前面加上對象. 值

<form action="/params/accout" method="post">


    <!--姓名:<input name="account.name" type="text"/> <br/>-->  <!--這裏不能夠指定對象傳值否則就會識別不到-->
    姓名:<input name="name" type="text"/> <br/> 
    密碼:<input name="password" type="text"/> <br/>
    金額:<input name="money" type="text"/> <br/>
    User名字:<input name="user.username" /><br/>
    User密碼:<input name="user.u_password"/><br/>

    <input type="submit" value="提交"/>
    
</form>

 

解決中文亂碼問題

若是咱們輸入中文的話 不會報錯可是顯示就是亂碼的 

 

由於web.xml控制着和前端交互的配置  咱們就須要再這裏配置下

web.xml中加入這些內容:

    配置解決中文亂碼的過濾器
    <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>

 

再輸入中文就不會亂碼了

 輸入:

輸出信息:

 

 

 

也能夠在Controller中加 可是那樣就要每一個Controller都要加了

在controller中的RequestMapping中加入

produces = "text/html; charset=utf-8"

 

 

 

 這樣也能夠對這個請求的返回都解決中文亂碼 可是其餘的Controller不解決  因此仍是配置中加比較好

 

 

 

 

自定義類型轉化器:

 

咱們再設置請求參數的時候 有時候本該是String的咱們輸入Integer也能夠這就是Spring mvc爲咱們自動作的類型轉化 可是有些是須要咱們本身轉化的好比日期

 

定義一個User類 其中包含 Date  屬性

import javax.xml.crypto.Data;
import java.util.Date;

public class User {



    private  String username;
    private  String u_password;
    private Date date;
    public String getUsername() {
        return username;
    }

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

    public String getU_password() {
        return u_password;
    }

    public void setU_password(String u_password) {
        this.u_password = u_password;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", u_password='" + u_password + '\'' +
                ", date=" + date +
                '}';
    }
}
User

定義一個Controller

    @RequestMapping(value = "/user")
    public  String save(User user){

        System.out.println("User"+user);
        return "success";

    }

 

 

而後前端定義

<form action="/params/user" method="post">
    
    User名字:<input name="username" /><br/>
    User密碼:<input name="u_password"/><br/>
    User日期:<input name="date"/><br/>

    <input type="submit" value="提交"/>

</form>

 

 

此時咱們輸入斜杆的日期是能夠被識別的這是正規的日期輸入格式

輸出:

UserUser{username='zyl', u_password='123232', date=Mon Mar 04 00:00:00 CST 2019}

 

 

而後咱們輸入字符串格式的

而後就輸出

是不被識別的 ,既然不被識別那麼咱們就要自定義類型轉換器來進行數據類型的轉化

 

轉換步驟:

一:先編寫轉化的類方法

我再咱們的java/cn/itcas/目錄下再編寫了一個StringToDateConverter類用來編寫方法

StringToDateConverter: 由於自己java提供了這個轉換的接口Converter咱們只須要重寫這個接口就能夠了
package cn.itcas.utils;


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

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

/**
 * 把字符串轉換爲日期
 *
 */
public class StringToDateConverter implements Converter<String, Date>{
    /**
     *
     * @param source 傳遞進來的值
     * @return
     */
    @Override
    public Date convert(String source){  //必須實現這個方法否則會報錯

        if(source == null){
            throw new RuntimeException("請您傳入數據");
        }

        try {
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // 解析字符串 定義格式
            Date date = df.parse(source);
            return date;
        } catch (Exception e) {
            throw new RuntimeException("類型轉換錯誤");
        }


    }
}
StringToDateConverter

 

 

 

二 :爲了讓你的方法生效就須要再配置文件中進行配置

springmvc.xml

    <bean id="conversionService"
          class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="cn.itcas.utils.StringToDateConverter"/>  <!--這裏是你的轉化的Controller-->
            </set>
        </property>
    </bean>




    <!-- 開啓springmvc框架 註解打開   -->
    <mvc:annotation-driven   conversion-service="conversionService"/>  <!--把咱們的類型轉化器生效-->

 

而後再輸入字符串就能夠成功了

 

打印信息:

UserUser{username='zy', u_password='123232', date=Mon Mar 04 00:00:00 CST 2019}

 

 

 

 

獲取原生的servlet信息

首先咱們獲取的信息都是傳遞來的  那麼想要獲取 原生的request  和response信息的話 怎麼來獲取呢?

其實很簡單隻須要經過HttpServletRequest  和HttpservletResponse這兩個對象來獲取就能夠了

就像python中的  咱們能夠直接經過get和post來拿到request和response的信息

 

 

前端:

<a href="/params/testSerlet"> 獲取原生的servlet信息</a>

controller:

    /**
     * 獲取原生的serlet請求信息
     * @return
     */
    @RequestMapping("/testSerlet")
    public String  testSerlet(HttpServletRequest request, HttpServletResponse response){  // 若是咱們想要 進行原生的serlet信息獲取就要先傳遞兩個原生的信息

        HttpSession session = request.getSession();  // 從request中得到請求的session

        System.out.println("session:"+session);
        System.out.println("session:"+session.getAttributeNames());

        ServletContext context = session.getServletContext();  // 從session中獲取請求鏈接
        System.out.println("context"+context);

    return "params";
    }
相關文章
相關標籤/搜索