SpringMVC数据绑定

本文深入探讨SpringMVC框架中的数据绑定机制,包括默认数据类型、简单数据类型及POJO类型的绑定过程,通过实例展示如何将请求消息转换为控制器方法参数。

数据绑定:将请求消息转换成后台方法参数的过程。
数据绑定的过程:
1.将ServletRequest传递给DataBinder。
2.将入参对象传递给DataBinder。
3.DataBinder 调用ConversitionService组件进行数据类型的转换,并且将ServletRequest对象中的消息填充到参数对象中。
4.调用Validator进行合法性校验。
5.生成绑定的结果:BindingRequest。

一:绑定默认数据类型的绑定:
默认类型包括:
HttpSeveletRequest
HttpSeveletResponse
HttpSession
Model
ModelMap

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1" metadata-complete="true">

	<servlet>
		<!--配置前端过滤器 -->
		<servlet-name>springmvc</servlet-name>
		<!--用于加载客户端向服务器发送的请求 -->
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!--加载初始化配置文件  -->
		<init-param>
			<!--固定的配置文件名  -->
			<param-name>contextConfigLocation</param-name>
			<!-- 我们的配置文件所在的位置 -->
			<param-value>classpath:springmvc-config.xml</param-value>
		</init-param>
		<!-- 容器启动的时候立即加载Servlet -->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<!-- 拦截URL,交给DispatcherServlet -->
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

springmvc-config:

<?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.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
	<!--指定需要扫描的包 -->
	<context:component-scan base-package="com.student.controller" />
	<!-- 定义视图解析器,用于解析视图 -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!--设置前缀  -->
		<property name="prefix" value="/WEB-INF/jsp/"></property>
		<!-- 设置后缀 -->
		<property name="suffix" value=".jsp"></property>
	</bean>
</beans>

UserController:

package com.student.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
	@RequestMapping("/selectUser")
	public String selectUser(HttpServletRequest request){
		String id = request.getParameter("id");
		System.out.println("id="+id);
		return "success";
	}

}

success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>结果页面</title>
</head>
<body>
	OK
</body>
</html>

控制台输出:

id=1

浏览器显示:
在这里插入图片描述
运行过程分析:
http://localhost:8080/work13//selectUser?id=1,浏览器请求消息(selectUser?id=1)---->被UserController类中的@RequestMapping("/selectUser")拦截到---->这个Request请求就被传入public String selectUser(HttpServletRequest request)方法中,request就被强制的转换成HttpServletRequest类型(默认数据类型绑定成功),接下来调用request的getParameter方法获取请求中的id,并打印。return “success”;则根据配置文件,直接访问success。jsp文件,这样在浏览器就显示了OK。

二:简单数据类型的绑定:
简单数据类型指的是:int String Double 等类型。
我们把控制类:UserController修改成这种格式,这样直接将请求消息中的id,转换成输入参数中的id(数据绑定)。

package com.student.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
	@RequestMapping("/selectUser")
	public String selectUser(Integer id){
		System.out.println("id="+id);
		return "success";
	}

}

三:POJO类型的绑定:
解释:将消息中的信息,先用一个类来存放,然后将这个类,当做参数,传入到控制类当中。

首先创建一个User类:

package com.student.po;

public class User {
	private Integer id;
	private String username;
	private String password;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	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;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}
	
}

修改控制类:

package com.student.controller;

import org.apache.catalina.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class UserController {
	
	@RequestMapping("/selectUser")
	public String selectUser(Integer id) {
		System.out.println("id="+id);
		return "success";
	}
	
	@RequestMapping("/toRegister")
	public String toRegister() {
		return "register";
	}
	@RequestMapping("/registerUser")
	public String registerUser(User user) {
		String username = user.getUsername();
		String password = user.getPassword();
		System.out.println(username);
		System.out.println(password);
		return "success";
	}

}

register.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
	<form action="${pageContext.request.contextPath}/registerUser" method="post">
		用户名:<input type="text" name="username" /><br/>&nbsp;&nbsp;&nbsp;: <input type="text" name="password" /><br/>
		<input type="submit" value="注册" />
	</form>
</body>
</html>

代码解释:http://localhost:8080/work13//toRegister会被拦截到,然后跳转到register.jsp页面。由于register.jsp页面有一个提交action="${pageContext.request.contextPath}/registerUser" method=“post”>,所以会将输入的用户名和密码再提交到registerUser中,会被再次拦截下来,在registerUser方法中被输出到控制台,并且会跳转到success.jsp页面。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出现bug:还未解决:如有大神看到,还请赐教:

java.lang.NullPointerException
	at com.student.controller.UserController.registerUser(UserController.java:23)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:180)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
	at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

错误未知,请大佬指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StanwenRen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值