SpringMVC参数的传递与接收

处理乱码

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

post乱码

在web.xml中加入过滤器


        CharacterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            utf-8
        
    

    
        CharacterEncodingFilter
        /*
    

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文件中配置

	
		encoding
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			utf-8
		
	
	
		encoding
		/*
	

 1、 基本数据类型:

  1.1 jsp代码:

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




添加用户


	
姓名
性别

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"%>




添加用户


	
姓名
性别
兴趣爱好

两种方式:

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

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 list){
		System.out.println(name+"  "+age+"   "+list);
		return "main.jsp";
		
	}
}

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

页面代码

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




添加用户


	
姓名
性别

实体类

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"%>




添加用户


	
姓名
性别
姓名1
性别1

应用类

package com.example.entity;

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

public class UserEntity {
	 
	private List user;
	public List getUser() {
		return user;
	}
	public void setUser(List 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 {    
  @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中配置


      

    
        
            
                
            
        
     

控制器类

@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{

    @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中配置


    
        
            
                
                
            
        
     

7、restful 传值方式

一般情况传递参数的形式是

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

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




添加用户


	登录
	登录1

登录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效果如下:

SpringMVC参数的传递与接收_第1张图片

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

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

SpringMVC参数的传递与接收_第2张图片

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

暂时就这些,日后再补充

你可能感兴趣的:(SpringMVC)