系列2、spirngMVC view和controller参数相互传递

在以前的学习中咱们都知道,获取view层传递过来的参数,咱们通常的都是key,value键-值对的形式,在servlet控制器中使用getParameter,来接收view层传递过来的参数!!!做为表现层控制器的springMVC,给咱们提供了更加的方式去获取view层传递过来的参数!!!html

第1、view层向controller传递参数

参数类型分为:前端

1. 基本数据类型和字符串类型
2. 实体类型(JavaBean)
3. 集合数据类型(List、map集合等)java

1、简单的数据类型

准备配置环境web

web.xml文件、springmvc文件spring

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

实体类:Accountspring-mvc

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

实体类:Usertomcat

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页面,只是用键值对的方式session

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

2、在控制层代码(控制器)mvc

要求:提交表单的name和参数的名称是相同的app

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>

2、复杂类型:集合和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>

第3、解决请求参数中文乱码的解决

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

第4、自定义类型转换器

表单提交的任何数据类型所有都是字符串类型,可是后台定义Integer类型,数据也能够封装上,说明Spring框架内部会默认进行数据类型转换。可是咱们本身想要自定义数据类型转化怎么办?能够实现Converter的接口

1、咱们能够先建立一个数据类型转化器,把请求过来的数据类型转化为咱们想要的

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

2、注册自定义类型转换器,在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对象

第2、controller向view层传递参数

1、 使用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>

第2、使用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;
}

第3、使用session来保存数据

@RequestMapping("/demo3")

public String session(HttpSession session){

  UserBean bean = new UserBean();

  bean.setName("曹操");

  bean.setPwd("周瑜");

  session.setAttribute("admin", bean);

  return "Model";

}

第4、使用map来传递数据

@RequestMapping("/demo2")

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

  UserBean bean = new UserBean();

  bean.setName("刘备");

  bean.setPwd("张飞");

  Map.put("admin", bean);

  return "Model";

}

//携带数据并实现跳转的两种方式
    //第一种
    @RequestMapping("index")
    public String test(Model model){
        //携带数据
        model.addAttribute("username","张三")
        return "index";
    }
    //第二种
    @RequestMapping("index")
    public ModelAndView testone(){
        //携带数据
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("username","张三");
        modelAndView.setViewName("index");
        return modelAndView;
    }
相关文章
相关标签/搜索