数据绑定:将请求消息转换成后台方法参数的过程。
数据绑定的过程:
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/>
密 码: <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)
错误未知,请大佬指正。
本文深入探讨SpringMVC框架中的数据绑定机制,包括默认数据类型、简单数据类型及POJO类型的绑定过程,通过实例展示如何将请求消息转换为控制器方法参数。
1722

被折叠的 条评论
为什么被折叠?



