1. 程式人生 > >系列二、spirngMVC view和controller引數相互傳遞

系列二、spirngMVC view和controller引數相互傳遞

在之前的學習中我們都知道,獲取view層傳遞過來的引數,我們一般的都是key,value鍵-值對的形式,在servlet控制器中使用getParameter,來接收view層傳遞過來的引數!!!作為表現層控制器的springMVC,給我們提供了更加的方式去獲取view層傳遞過來的引數!!!

第一、view層向controller傳遞引數

引數型別分為:

1. 基本資料型別和字串型別
2. 實體型別(JavaBean)
3. 集合資料型別(List、map集合等)

一、簡單的資料型別

準備配置環境

web.xml檔案、springmvc檔案

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <!-- SpringMVC的核心控制器:前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 然後配置Servlet的初始化引數,讀取springmvc的配置檔案,建立spring容器 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 首先是:servlet啟動時載入物件 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--配置過濾器解決中文亂碼:提供初始化引數-->
    <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>
        <!-- 啟動過濾器 -->
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
        
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置spring建立容器時要掃描的包 -->
    <context:component-scan base-package="com.cc"></context:component-scan>

    <!-- 配置檢視解析器:返回請求成功後的頁面 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--檔案所在的目錄-->
        <property name="prefix" value="pages/"></property>
        <!--檔案的字尾名-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置日期型別轉換器-->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <!--給工廠注入一個新的型別轉換器-->
        <property name="converters">
            <!--把我們自己寫的日期型別轉化器配置進去-->
            <bean class="com.cc.util.StringToDataCoverter"></bean>
        </property>
    </bean>

    <!--配置spring開啟註解mvc的支援-->
    <!--開啟啟動日期型別專戶器服務-->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
</beans>

實體類:Account

package com.cc.entity;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 使用者實體類
 */
public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;
    //存在引用型別的時候
    private User user;

    //存在list和map集合的時候

    List<User> list;
    Map<String,User> map;

    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;
    }

    /*public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public void setUser(List<User> user) {
        this.user = user;
    }*/

    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

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

實體類:User

package com.cc.entity;

import javax.xml.crypto.Data;
import java.io.Serializable;

public class User implements Serializable {

    private String uname;
    private String password;
    private Data data;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPassword() {
        return password;
    }

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

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }


    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", password='" + password + '\'' +
                ", data=" + data +
                '}';
    }
}

在jsp頁面,只是用鍵值對的方式

<h1>你好tomcat</h1>
<a href="/hello?username=Tom">入門程式</a>

二、在控制層程式碼(控制器)

要求:提交表單的name和引數的名稱是相同的

package com.cc.controller;
import com.cc.entity.Account;
import com.cc.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    //處理對映器,用於建立請求 URL 和處理請求方法之間的對映關係
    @RequestMapping(path = "/hello")
    public  String sayHello(String username){
        System.out.println("hello springMVC"+"user:"+username);
        return "success";
    }
}

這裡還存在一個問題,就是在Account實體類中如果存在引用型別User類那怎麼辦??採用物件.屬性的表示式獲取屬性

<form action="/account" method="post">
        使用者名稱:<input type="text" name="name"><br>
        賬戶:<input type="text" name="password"><br>
        金額:<input type="text" name="money"><br>
        使用者名稱:<input type="text" name="user.uname"><br>
        密碼:<input type="text" name="user.password"><br>
        <input type="submit" value="提交">
</form>

二、複雜型別:集合和map型別的資料

list資料型別採用list[0].屬性的方式、map集合採用鍵值對的方式

實體類:Account

package com.cc.entity;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 使用者實體類
 */
public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;
    //存在引用型別的時候
    private User user;

    //存在list和map集合的時候

    List<User> list;
    Map<String,User> map;

    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;
    }

    /*public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public void setUser(List<User> user) {
        this.user = user;
    }*/

    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", list=" + list +
                ", map=" + map +
                '}';
    }
}
   <!--繫結封裝list集合和map集合到-->
   <form action="/account" method="post">
        使用者名稱:<input type="text" name="name"><br>
        賬戶:<input type="text" name="password"><br>
        金額:<input type="text" name="money"><br>
        使用者名稱:<input type="text" name="list[0].uname"><br>
        密碼:<input type="text" name="list[0].password"><br>
        <!--帶有map資料封裝,key,value-->
        使用者名稱:<input type="text" name="map['one'].uname"><br>
        密碼:<input type="text" name="map['one'].password"><br>
        <input type="submit" value="提交">
    </form>

第三、解決請求引數中文亂碼的解決

在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>

第四、自定義型別轉換器

表單提交的任何資料型別全部都是字串型別,但是後臺定義Integer型別,資料也可以封裝上,說明Spring框架內部會預設進行資料型別轉換。但是我們自己想要自定義資料型別轉化怎麼辦?可以實現Converter的介面

一、我們可以先建立一個數據型別轉化器,把請求過來的資料型別轉化為我們想要的

package com.cc.util;

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

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

/**
 * 把字串轉換為日期
 * StringUtils這個類需要好好研究一下
 */
public class StringToDataCoverter implements Converter<String, Date> {

    @Override
    public Date convert(String source) {
        try {
            //傳進來引數為空情況
            if (StringUtils.isEmpty(source)) {
                throw new RuntimeException("請輸入要轉換的日期");
            }
            //自定義日期轉換格式
            DateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
            return dt.parse(source);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

二、註冊自定義型別轉換器,在springmvc.xml配置檔案中編寫配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置spring建立容器時要掃描的包 -->
    <context:component-scan base-package="com.cc"></context:component-scan>

    <!-- 配置檢視解析器:返回請求成功後的頁面 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--檔案所在的目錄-->
        <property name="prefix" value="pages/"></property>
        <!--檔案的字尾名-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置日期型別轉換器-->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <!--給工廠注入一個新的型別轉換器-->
        <property name="converters">
            <!--把我們自己寫的日期型別轉化器配置進去-->
            <bean class="com.cc.util.StringToDataCoverter"></bean>
        </property>
    </bean>

    <!--配置spring開啟註解mvc的支援-->
    <!--開啟啟動日期型別專戶器服務-->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
</beans><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置spring建立容器時要掃描的包 -->
    <context:component-scan base-package="com.cc"></context:component-scan>

    <!-- 配置檢視解析器:返回請求成功後的頁面 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--檔案所在的目錄-->
        <property name="prefix" value="pages/"></property>
        <!--檔案的字尾名-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置日期型別轉換器-->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <!--給工廠注入一個新的型別轉換器-->
        <property name="converters">
            <!--把我們自己寫的日期型別轉化器配置進去-->
            <bean class="com.cc.util.StringToDataCoverter"></bean>
        </property>
    </bean>

    <!--配置spring開啟註解mvc的支援-->
    <!--開啟啟動日期型別專戶器服務-->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
</beans>

 在控制器中使用原生的ServletAPI物件,只需要在控制器的方法引數定義HttpServletRequest和HttpServletResponse物件

第二、controller向view層傳遞引數

一、 使用model來儲存資料到前臺

controller頁面程式碼

@RequestMapping("/demo")

public String Model(Model model){

   UserBean bean = new UserBean();

   bean.setName("admin");

   bean.setPwd("admin");

   model.addAttribute("admin", bean);

   return "Model";

}

Model.jsp頁面

<%@ page language="java" contentType="text/html; charset=utf-8"

pageEncoding="utf-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>Insert title here</title>

</head>

<body>

   ${admin }

</body>

</html>

第二、使用modelView的方式

controller層程式碼

@RequestMapping("/demo1")

public ModelAndView ModelView(){

   ModelAndView view = new ModelAndView();

   UserBean bean = new UserBean();

   bean.setName("孫悟空");

   bean.setPwd("豬八戒");

   view.addObject("admin", bean);

   view.setViewName("Model");

   return view;
}

第三、使用session來儲存資料

@RequestMapping("/demo3")

public String session(HttpSession session){

  UserBean bean = new UserBean();

  bean.setName("曹操");

  bean.setPwd("周瑜");

  session.setAttribute("admin", bean);

  return "Model";

}

第四、使用map來傳遞資料

@RequestMapping("/demo2")

public String Hashmap(Map<String, Object> Map){

  UserBean bean = new UserBean();

  bean.setName("劉備");

  bean.setPwd("張飛");

  Map.put("admin", bean);

  return "Model";

}

相關推薦

系列spirngMVC viewcontroller引數相互傳遞

在之前的學習中我們都知道,獲取view層傳遞過來的引數,我們一般的都是key,value鍵-值對的形式,在servlet控制器中使

kafka系列 kafka manager的安裝使用

1. Yahoo kafka manager介紹 專案地址:https://github.com/yahoo/kafka-manager Requirements: Kafka 0.8.1.1 or 0.8.2.* sbt 0.13.x Java 8+ Kafka Mana

英文字母數字不會換行如何處理

英文 一次 bre word-wrap style 英文字母 ron wrap -a 一次偶然的項目中,遇到一個奇怪的問題,為什麽我都寫了換行的css怎麽還是沒有換行?請教宋老師之後才知道“英文字母和數字是不會換行的”,那如何處理呢? 處理辦法,在所在類上增加下面css:

采用Opserver來監控你的ASP.NET項目系列(監控SQL Server與Asp.Net項目)

我們 cto 存儲 nodes index ring username nod 之前 前言 之前有過2篇關於如何監控ASP.NET core項目的文章,有興趣的也可以看看. 今天我們主要來介紹一下,如何使用Opserver監控我們的SQL Server 和ASP.NET

[CXF REST標準實戰系列] Spring4.0 整合 CXF3.0,實現測試接口(轉)

strong print transport location nts bean query keyword tsig 轉自:[CXF REST標準實戰系列] 二、Spring4.0 整合 CXF3.0,實現測試接口 文章Points: 1、介紹RESTful架構風格

SAP UI5CRM WebUI的ViewController是如何綁定的

ons dialog nsh 如何 time 運行時 ui5 無需 一個 UI5 例如我在UI5的界面上畫一個按鈕,點擊之後彈出一個Alert dialog。 在XML view裏只定義了controller的名稱和事件處理函數的名稱。那麽按鈕被點擊之後,controll

WebService系列:使用JDKCXF框架開發WebService

method IT ebean pri build 實例 cxf 地址 result 一、使用JDK開發WebService 服務端程序創建: 1.新建一個JDK開發webservice的服務端maven項目JDKWebServiceServer 2. 定義一個接口,

dubbo系列dubbo+zookeeper+dubboadmin分布式服務框架搭建(windows平臺)

limit send dem ring 分布 gui ref urn standard 一、zookeeper配置中心安裝 1、下載安裝包,zookeeper-3.4.6.tar.gz 2、解壓安裝包,修改配置文件 參考zookeeper-3.4.6/co

[ASP.NET MVC 小牛之路]12 - SectionPartial View Child Action

概括的講,View中的內容可以分為靜態和動態兩部分。靜態內容一般是html元素,而動態內容指的是在應用程式執行的時候動態建立的內容。給View新增動態內容的方式可歸納為下面幾種: Inline code,小的程式碼片段,如 if 和 foreach 語句。 Html hel

CUDA安裝測試

一、前提 ubuntu系統:14.04  不要安裝任何系統補丁和進行系統升級  ubantu14.04(這是比較穩定的版本,推薦使用)  cuda7.5  GPU:GeForce 820M(只要是支援cuda的就好)  檢視GPU是否支援cuda

ASP.NET MVC中SectionPartial View Child Action(轉載)

概括的講,View中的內容可以分為靜態和動態兩部分。靜態內容一般是html元素,而動態內容指的是在應用程式執行的時候動態建立的內容。給View新增動態內容的方式可歸納為下面幾種: Inline code,小的程式碼片段,如 if 和 foreach 語句。 Html helper方法,用來生成單個

SpringBoot框架搭建系列():整合pagehelpermybatis-generator

本次我們整合mybatis的分頁外掛pagehelper,以及mapper自動生成的外掛mybatis-generator 先整合mybatis-generator 1、在pom中引入 <plugin> <groupId

springboot系列springboot專案搭建

一、maven構建專案 1、訪問http://start.spring.io/ 2、選擇構建工具Maven Project、Spring Boot版本2.1.1以及一些工程基本資訊,可參考下圖所示: 3、點選Generate Project下載專案壓縮包 4、解壓後,使用idea,

SectionPartial View Child Action

概括的講,View中的內容可以分為靜態和動態兩部分。靜態內容一般是html元素,而動態內容指的是在應用程式執行的時候動態建立的內容。給View新增動態內容的方式可歸納為下面幾種: Inline code,小的程式碼片段,如 if 和 foreach 語句。 Html helper方法,用來生成單個或多

jdk8系列方法引用

一、方法引用   方法引用使得開發者可以直接引用現存的方法、Java類的構造方法或者例項物件。方法引用和Lambda表示式配合使用,使得java類的構造方法看起來緊湊而簡潔,沒有很多複雜的模板程式碼。 例子中,Car類是不同方法引用的例子,可以幫助讀者區分四種類型的方法引用。 package co

Apriori演算法詳解之【虛擬碼例子】

上一篇文章中對Apriori演算法進行了簡單的描述(http://blog.csdn.net/lizhengnanhua/article/details/9061755),現在用虛擬碼實現,及對經典例子進行描述(紅蘭PPT上之摘抄)。 一、Apriori演算法虛擬碼實現:

MVC的dao層service層controller

dao層主要做資料持久層的工作,負責與資料庫進行聯絡的一些任務都封裝在此,dao層的設計首先是設計dao層的介面,然後在Spring的配置檔案中定義此介面的實現類,然後就可以再模組中呼叫此介面來進行資料業務的處理,而不用關心此介面的具體實現類是哪個類,顯得結構非常清晰,dao層的資料來源配置,以及有關資料庫連

採用Opserver來監控你的ASP.NET專案系列(監控SQL Server與Asp.Net專案)

原文: 採用Opserver來監控你的ASP.NET專案系列(二、監控SQL Server與Asp.Net專案) 前 言 之前有過2篇關於如何監控ASP.NET core專案的文章,有興趣的也可以看看.   今天我們主要來介紹一下,如何使用Opserver監控我們的SQL Serve

Android繪圖系列()——自定義View繪製基本圖形

這個系列主要是介紹下Android自定義View和Android繪圖機制,自己能力有限,如果在介紹過程中有什麼錯誤,歡迎指正 前言 在上一篇Android繪圖系列(一)——自定義View基礎中我們瞭解自定義View相關的基本知識,不過,這些東西依舊還

【移動語義精準轉發系列】std::movestd::forward

在我們開始講解std::move之前,先來介紹一個概念:引用摺疊。這個概念僅用於 typedef 和 模板型別引數 中。 在模板世界中,T&& 稱為Universal Reference,即通用引用。這與普通函式中形參的&&是不同的,希望不要