关于页面传值到后台和后台传值到页面,首先要解决的是中文乱码
在web.xml中加入过滤器
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
有两种处理方法
第一种
修改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参数之间的传递主要有这两种 需求
首先解决中文乱码,在web.xml文件中配置
encoding
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
encoding
/*
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.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方法
页面代码
<%@ 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";
}
}
页面代码
<%@ 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";
}
}
页面代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
添加用户
应用类
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 + "]";
}
}
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中配置
一般情况传递参数的形式是登录
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 传值方式:
在浏览器点击登录1效果如下:
这个404是在控制器执行完跳转提示在该地址下找不到main.jsp
原因是控制器在跳转页面时没有找到对应的页面,
所有应该改为全路径return "/main.jsp"
暂时就这些,日后再补充