使用SMM框架开发企业级应用-----MVC参数传递

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

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"

原文地址:https://www.cnblogs.com/haohanwuyin/p/11839158.html

时间: 2024-10-10 13:16:57

使用SMM框架开发企业级应用-----MVC参数传递的相关文章

使用SMM框架开发企业级应用-----Spring简介即Spring Ioc

Spring框架简介 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅限于服务器端的开发.从简单性.可测试性和松耦合的角度而言,任何Java应用都可以从S

使用SMM框架开发企业级应用-----打印机案例

Ø 要求:可灵活配置使用彩色墨盒或灰色墨盒 Ø 可灵活配置打印页面的大小 实现步骤 打印机功能的实现依赖于墨盒和纸张(对象间的依赖) 定义Ink和Paper接口 使用Ink接口和Paper接口开发打印机程序 开发Ink接口和Paper接口的实现类:ColorInk,GreyInk和TextPaper 组装打印机,运行调试 测试 原文地址:https://www.cnblogs.com/haohanwuyin/p/11740381.html

使用SMM框架开发企业级应用-----基础配置

视图解析器 在spring-mvc文件中编写 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.

使用SMM框架开发企业级应用-----初始Mybatis的模糊查询以及自动映射

在学习MyBatis过程中想实现模糊查询,下面列举几种方式:1.用${…}代替#{…}    SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%');  2.  bind标签  3. CONCAT Mybatis的自动映射 0x00:引子 在 MyBatis 的映射配置文件中,select 标签查询配置结果集时使用过 resultType 属性,当在 resultType 中定义一个 Java 包装类时,

使用SMM框架开发企业级应用-----关联查询

关联映射一对多 以国家和省份对应的一对多关系举例. smbms_role数据库: select u.id,u.userName,u.userRole, r.rid,r.roleName from smbms_user as u,smbms_role as r where u.userRole=r.rid and r.rid=3 SmbmsRole实体类:  Dao层接口:  编写小配置xml文件: 测试: 自连接一对多 数据库: 实体类: public class Category {    

使用SMM框架开发企业级应用-----mybatis注解

@select查詢 @insert添加 @delete刪除 @update修改 @Results自关联 @Results映射 @One UserByRole表: RoleByUser表: @Many RoleByUser表: UserByRole表: 原文地址:https://www.cnblogs.com/haohanwuyin/p/11740304.html

使用SMM框架开发企业级应用-----面试题

Spring中的bean 组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean. 简单地讲,bean就是由IoC容器初始化.装配及管理的对象 Spring中的bean默认都是单例的(scope="singleton"默认值) 我们可以设置为多例(scope="prototype") bean的作用域 当scope="singleton"时 Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象

使用SMM框架开发企业级应用-----代理(静态,JDK,CGLIB)

静态代理 步骤一:创建抽象主题(接口) 步骤二:真实业务代码 步骤三:测试 JDK代理 步骤一:创建抽象主题(接口) 步骤二:真实业务代码 步骤三:测试 CGLIB代理 步骤一:代码层 步骤二:测试 public class ServiceCglib { public static void main(String[] args) { //步骤一:目标对象 final Cglib cglib=new Cglib(); //步骤二:生成代理 Enhancer enhancer=new Enhanc

使用SMM框架开发企业级应用-----Spring集合注入和域属性自动注入byName和byType

Spring集合的注入 步骤一:导入依赖 步骤二:创建实体类 步骤三:创建大配置文件 步骤四:测试 域属性自动注入 byName与byType 步骤一:创建两个实体类 public class Student { private Integer stuid; private String stuName; private Teacher teacher; public Teacher getTeacher() { return teacher; } public void setTeacher(