系列二、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 view和controller引數相互傳遞
在之前的學習中我們都知道,獲取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 UI5和CRM WebUI的View和Controller是如何綁定的
ons dialog nsh 如何 time 運行時 ui5 無需 一個 UI5 例如我在UI5的界面上畫一個按鈕,點擊之後彈出一個Alert dialog。 在XML view裏只定義了controller的名稱和事件處理函數的名稱。那麽按鈕被點擊之後,controll
WebService系列二:使用JDK和CXF框架開發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 - Section、Partial 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中Section、Partial View 和 Child Action(轉載)
概括的講,View中的內容可以分為靜態和動態兩部分。靜態內容一般是html元素,而動態內容指的是在應用程式執行的時候動態建立的內容。給View新增動態內容的方式可歸納為下面幾種: Inline code,小的程式碼片段,如 if 和 foreach 語句。 Html helper方法,用來生成單個
SpringBoot框架搭建系列(二):整合pagehelper和mybatis-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,
Section、Partial 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::move和std::forward
在我們開始講解std::move之前,先來介紹一個概念:引用摺疊。這個概念僅用於 typedef 和 模板型別引數 中。 在模板世界中,T&& 稱為Universal Reference,即通用引用。這與普通函式中形參的&&是不同的,希望不要