SpringMVC参数的传递与接收

处理乱码

关于页面传值到后台和后台传值到页面,首先要解决的是中文乱码

post乱码

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

get乱码

有两种处理方法

  第一种

修改tomcat配置文件添加编码与工程编码一致,要修改的配置文件在

第二种

对参数进行重新编码

String userName=new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8");

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

此时后台获取到的userName是经过ISO8859-1编码过的。现在需要做的是按照ISO8859-1的编码方式把userName再变成最原始的字节码(即刚从浏览器端传过来的东西,没有经过编码过的),然后再把这个字节码通过utf-8的方式进行编码。
 

SpringMVC参数之间的传递主要有这两种 需求

  • 在Controller接收从jsp传递过来的数据
  • 将Controller的数据传递到jsp页面

在Controller接收从jsp传递过来的数据

首先解决中文乱码,在web.xml文件中配置

	<filter>
		<filter-name>encoding</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>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 1、 基本数据类型:

  1.1 jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加用户</title>
</head>
<body>
	<form action="addUser" method="post">
	姓名<input type="text" name="name"/><br>
	性别<input type="text" name="age"/><br>
	<input type="submit" value="提交"/>
	</form>
</body>
</html>

1.2 controller代码

package com.example.controller;

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

@Controller
public class UserController {

	@RequestMapping("/addUser")
	public String addUser(String name,int age){
		System.out.println("用户名:" +name+"  年龄"+age);
		return "main.jsp";
	}
}

注意:默认保证参数名称和请求中传递的参数名相同

      但是,有些情况下,前端代码是由前端设计师设计,参数名不对应,则使用@RequestParam()赋值,

package com.example.controller;

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

@Controller
public class UserController {
	@RequestMapping("/addUser")
	public String addUser(@RequestParam(value="name1")String name,@RequestParam(value="age1")int age){
		System.out.println("用户名:" +name+"  年龄"+age);
		return "main.jsp";
		
	}
}

如果方法参数是基本数据类型( 不是封装类) 可以通过@RequestParam 设置默认值.防止没有参数报500错误

package com.example.controller;

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

@Controller
public class UserController {
	@RequestMapping("/addUser")
	public String addUser(@RequestParam(defaultValue="韩信")String name,@RequestParam(defaultValue="22")int age){
		System.out.println("用户名:" +name+"  年龄"+age);
		return "main.jsp";
		
	}
}

如果强制要求必须有某个参数

package com.example.controller;

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

@Controller
public class UserController {
	@RequestMapping("/addUser")
	public String addUser(@RequestParam(required=true)String name,@RequestParam(required=true)int age){
		System.out.println("用户名:" +name+"  年龄"+age);
		return "main.jsp";
		
	}
}

2、对象类型

2.1 jsp代码同上

2.2 创建对象类

package com.example.entity;
public class UserEntity {
	private String name;
	private int age;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}	
	@Override
	public String toString() {
		return "UserEntity [name=" + name + ", age=" + age + "]";
	}
}

2.3 controller代码

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.example.entity.UserEntity;
@Controller
public class UserController {
	@RequestMapping("/addUser")
	public String addUser(UserEntity entity){
		System.out.println("用户:" +entity);
		return "main.jsp";
	}
}

注意:前台传递的参数名与对象的属性名一致,且生成get与set方法

3、请求参数中包含多个同名参数的获取方式

页面代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加用户</title>
</head>
<body>
	<form action="addUser" method="post">
	姓名<input type="text" name="name"/><br>
	性别<input type="text" name="age"/><br>
	兴趣爱好
	<input type="checkbox" name="interest" value="读书">
	<input type="checkbox" name="interest" value="记笔记"/>
	<input type="checkbox" name="interest" value="背单词"/>
	<input type="submit" value="提交"/>
	</form>
</body>
</html>

两种方式:

    第一、兴趣爱好也包含在对象中,在对象中用集合或者数组的形式声明,对象类:

package com.example.entity;

import java.util.Arrays;
import java.util.Date;

public class UserEntity {

	private String name;
	private int age;
	private String[] interest;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String[] getInterest() {
		return interest;
	}
	public void setInterest(String[] interest) {
		this.interest = interest;
	}
	@Override
	public String toString() {
		return "UserEntity [name=" + name + ", age=" + age + ", interest=" + Arrays.toString(interest) +  "]";
	}
}

控制器类:

  

package com.example.controller;

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

import com.example.entity.UserEntity;

@Controller
public class UserController {

	@RequestMapping("addUser")
	public String addUser(UserEntity userEntity){
		System.out.println(userEntity);
		return "main.jsp";	
	}
}

第二种:

package com.example.controller;

import java.util.List;

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

import com.example.entity.UserEntity;

@Controller
public class UserController {

	@RequestMapping("addUser")
	public String addUser(String name,int age,@RequestParam("interest")List<String> list){
		System.out.println(name+"  "+age+"   "+list);
		return "main.jsp";
		
	}
}

4、请求参数中对象.属性格式

页面代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加用户</title>
</head>
<body>
	<form action="addUser" method="post">
	姓名<input type="text" name="user.name"/><br>
	性别<input type="text" name="user.age"/><br>
	<input type="submit" value="提交"/>
	</form>
</body>
</html>

实体类

package com.example.entity;

public class User {

	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
	
}

应用类

对象名和参数中点前面的名称对应,点后面的名称与User中的属性名对应

package com.example.entity;

import java.util.Arrays;
import java.util.Date;

public class UserEntity {
	 
	private User user;

	public User getUser() {
		return user;
	}

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

	@Override
	public String toString() {
		return "UserEntity [user=" + user + "]";
	}
	
}

控制器

package com.example.controller;

import java.util.List;

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

import com.example.entity.UserEntity;

@Controller
public class UserController {

	@RequestMapping("addUser")
	public String addUser(UserEntity userEntity){
		System.out.println(userEntity);
		return "main.jsp";
		
	}
}

5、在请求参数中传递集合对象类型参数

页面代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加用户</title>
</head>
<body>
	<form action="addUser" method="post">
	姓名<input type="text" name="user[0].name"/><br>
	性别<input type="text" name="user[0].age"/><br>
	姓名1<input type="text" name="user[1].name"/><br>
	性别1<input type="text" name="user[1].age"/><br>
	<input type="submit" value="提交"/>
	</form>
</body>
</html>

应用类

package com.example.entity;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class UserEntity {
	 
	private List<User> user;
	public List<User> getUser() {
		return user;
	}
	public void setUser(List<User> user) {
		this.user = user;
	}
	@Override
	public String toString() {
		return "UserEntity [user=" + user + "]";
	}	
}

6、日期类型传值

   springMVC没有提供默认的对日期类型的绑定,需要自定义日期类型的绑定。

第一种

如果查询类使我们自己写,那么在属性前面加上@DateTimeFormat(pattern = "yyyy-MM-dd")  ,即可将String转换为Date类型,如下

public class UserController{

	@RequestMapping("addUser")
	public String addUser(@DateTimeFormat(pattern="yyyy-MM-dd")Date date){
		String simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd").format(date);
		System.out.println(simpleDateFormat);
		return "main.jsp";
	}
}

第二种   

如果我们只负责web层的开发,就只需要在controller中加入数据绑定:

public class UserController{

	@RequestMapping("addUser")
	public String addUser(Date date){
	String simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd").format(date);
		System.out.println(simpleDateFormat);
		return "main.jsp";
	}
	@InitBinder  
	public void initBinder(WebDataBinder binder) {  
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");  
	dateFormat.setLenient(false);  
	binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
	}
}

第三种

可以在系统中加入一个全局类型转换器

建立一个CustomDateConverter .java类

 public class CustomDateConverter implements Converter<String, Date> {    
  @Override    
  public Date convert(String source) {    
      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");    
      dateFormat.setLenient(false);    
      try {    
          return dateFormat.parse(source);    
      } catch (ParseException e) {    
          e.printStackTrace();    
     }           
     return null;    
 }    

在springmvc.xml中配置

<!-- 配置注解驱动 -->
     <mvc:annotation-driven conversion-service="conversionService"/> 
<!-- 转换器 -->
    <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.example.controller.CustomDateConverter"/>
            </list>
        </property>
    </bean> 

控制器类

@Controller
public class UserController{
	@RequestMapping("addUser")
	public String addUser(Date date){
		String simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd").format(date);
		System.out.println(simpleDateFormat);
		return "main.jsp";
	}
}

配置转换类去除空格

还可以配置一个转换类,把通过http请求传过来的字符串的两边去除空格。

public class StringTrimConverter implements Converter<String,String>{

    @Override
    public String convert(String source) {
        try {
            //去掉字符串两边的空格,如果去除后为空设置为null
            if (source!=null) {
                source=source.trim();
                if (source.equals("")) {
                    return null;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return source;
    }
}

在springmvc.xml中配置

<!-- 转换器 -->
    <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="cn.itcast.springmvc.first.converter.CustomDateConverter"/>
                <bean class="cn.itcast.springmvc.first.converter.StringTrimConverter"/>
            </list>
        </property>
    </bean> 

7、restful 传值方式

一般情况传递参数的形式是<a hidden="addUser?name=张三&age=22">登录</a>

restful 传值方式可以简化 jsp 中参数编写格式,在 jsp 中设定特定的格式

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加用户</title>
</head>
<body>
	<a href="addUser?name=abc&age=22">登录</a>
	<a href="addUser1/abc/22">登录1</a>
</body>
</html>

登录1的href是一个标准的控制器格式,

在控制器中

package com.example.controller;

import java.util.List;

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

import com.example.entity.UserEntity;

@Controller
public class UserController {

	@RequestMapping("addUser")
	public String addUser(String name,int age){
		System.out.println(name+"   "+age);
		return "main.jsp";
	}
	@RequestMapping("addUser1/{name1}/{age}")
	public String addUser1(@PathVariable("name1") String name,@PathVariable int age){
		System.out.println(name+"   "+age);
		return "main.jsp";
		
	}
}

使用restful 传值方式:

  • 在@RequestMapping 中一定要和请求格式对应
  • {名称} 中名称自定义名称
  • @PathVariable 获取@RequestMapping 中内容,默认按照方法参数名称去寻找

在浏览器点击登录1效果如下:

这个404是在控制器执行完跳转提示在该地址下找不到main.jsp

原因是控制器在跳转页面时没有找到对应的页面,

所有应该改为全路径return "/main.jsp"

暂时就这些,日后再补充

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值