【Spring篇】SpringMVC的常见数据绑定
🧸安清h:个人主页
🎥个人专栏:【计算机网络】【Mybatis篇】【Spring篇】
🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。
目录
🎯SpringMVC的简单数据绑定
🚦创建Signon类
🚦创建SignonDao接口
🚦创建SignonDaoImp类
🚦创建SignonService接口
🚦创建SignonServiceImp类
🚦创建web.xml文件
🍔默认类型数据绑定
✨创建控制器类LoginController
✨创建登录页面login1.jsp
🍔简单数据类型绑定
✨创建控制器类LoginController
✨创建登录页面login2.jsp
🍔POJO绑定
✨创建控制器类LoginController
✨创建登录页面login3.jsp
🍔自定义类型转换器
✨创建DateConvert类
✨修改spring-mvc.xml
✨创建控制器类LoginController
✨创建登录页面login4.jsp
🎃创建SignonConvert类
🎃修改spring-mvc.xml类
🎃创建控制器类LoginController
🎃创建登录页面login5.jsp
🍔数组类型
✨创建控制器类LoginController
✨创建登录页面login6.jsp
🍔集合类型
✨创建控制器类LoginController
✨创建登录页面login6.jsp
✨创建welcome8.jsp页面
🍔将集合类型数据作为POJO类的数据成员
✨创建User类
✨创建控制器类LoginController
✨创建登录页面login8.jsp
🎯SpringMVC的简单数据绑定
下面将会以登录为例演练并介绍各种类型的数据绑定,以Signon类为例:
🚦创建Signon类
定义一个名为 Signon
的Java类,用于存储用户名和密码,并提供了这两个变量的公共getter和setter方法。具体代码如下:
public class Signon {
String uname1;
String pwd;
public String getUname1() {
return uname1;
}
public void setUname1(String uname1) {
this.uname1 = uname1;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
🚦创建SignonDao接口
定义一个名为 SignonDao
的Java接口,其中包含一个公共方法 findSignonByUnameAndPwd。具体代码如下:
public interface SignonDao {
public int findSignonByUnameAndPwd(String uname,String pwd);
}
🚦创建SignonDaoImp类
定义一个名为 SignonDaoImp
的Java类,它实现了 SignonDao
接口,并使用 @Repository
注解标记为Spring框架中的持久层组件。这个类提供了 findSignonByUnameAndPwd
方法的具体实现,该方法接收用户名(uname
)和密码(pwd
)作为参数,并检查它们是否与预设的值("tom"和"12345")相匹配。如果匹配,方法返回1,表示用户验证成功;如果不匹配,方法返回0,表示用户验证失败。具体代码如下:
public class SignonDaoImp implements SignonDao {
@Override
public int findSignonByUnameAndPwd(String uname, String pwd) {
if ("tom".equals(uname) && "12345".equals(pwd))
return 1;
return 0;
}
}
🚦创建SignonService接口
定义一个名为 SignonService
的Java接口,其中包含一个公共方法 checkByUnameAndPwd。具体代码如下:
public interface SignonService {
public boolean checkByUnameAndPwd(String uname,String pwd);
}
🚦创建SignonServiceImp类
定义一个名为 SignonServiceImp
的Java类,它实现了 SignonService
接口,并使用 @Service
注解标记为Spring框架中的服务层组件。类中注入了一个 SignonDao
类型的成员变量 sd
,用于访问数据访问层。SignonServiceImp
类实现了 checkByUnameAndPwd
方法,该方法接收用户名和密码作为参数,并调用 sd
的 findSignonByUnameAndPwd
方法来检查数据库中是否存在匹配的用户记录。如果 findSignonByUnameAndPwd
方法返回1,表示验证成功,checkByUnameAndPwd
方法返回 true
;否则返回 false
,表示验证失败。具体代码如下:
@Service
public class SignonServiceImp implements SignonService{
@Autowired
SignonDao sd;
@Override
public boolean checkByUnameAndPwd(String uname, String pwd) {
if(sd.findSignonByUnameAndPwd(uname,pwd)==1)
return true;
return false;
}
}
🚦创建web.xml文件
<?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/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean name="/firsttest" class="FirstController"/>
<context:component-scan base-package="com.hkd"/>
</beans>
以上内容为下面统一会用到的,下面内容主要为login登录页面和测试类。
🍔默认类型数据绑定
✨创建控制器类LoginController
使用Spring框架的Java Web应用程序中的控制器类`LoginController`,它负责处理用户登录请求。类中注入了一个名为`SignonService`的自动装配服务,该服务包含验证用户凭据的方法。`LoginController`类中的`login1`方法通过`@RequestMapping("/login1")`注解映射到`/login1`的HTTP请求。该方法接收一个`HttpServletRequest`对象和一个`Model`对象作为参数,从请求中获取用户名和密码,然后调用`SignonService`的`checkByUnameAndPwd`方法来验证这些凭据。如果验证成功,方法会将用户名和密码添加到模型中,并返回视图名称`"welcome"`;如果验证失败,则返回视图名称`"error"`。
@Controller
public class LoginController {
@Autowired
SignonService ss;
@RequestMapping("/login1")
public String login1(HttpServletRequest request, Model model){
String uname=request.getParameter("uname");
String pwd=request.getParameter("pwd");
boolean flag=ss.checkByUnameAndPwd(uname,pwd);
if(flag){
model.addAttribute("uname",uname);
model.addAttribute("pwd",pwd);
return "welcome";
}else{
return "error";
}
}
}
✨创建登录页面login1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="post" action="login1">
用户名:<input type="text" name="uname"><br>
密码:<input type="text" name="pwd"><br>
<input type="submit" value="提交"><input type="reset" value="重置">
</form>
</body>
</html>
输入正确的用户名和密码后跳转到的界面如下:
🍔简单数据类型绑定
✨创建控制器类LoginController
在控制器LoginController类中创建login2方法:
@RequestMapping("/login2")
public String login2(String uname,String pwd,Model model){
boolean flag=ss.checkByUnameAndPwd(uname, pwd);
if(flag){
model.addAttribute("uname",uname);
model.addAttribute("pwd",pwd);
return "welcome";
}else{
return "error";
}
}
✨创建登录页面login2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="post" action="login2">
用户名:<input type="text" name="uname"><br>
密码:<input type="text" name="pwd"><br>
<input type="submit" value="提交"><input type="reset" value="重置">
</form>
</body>
</html>
登录成功之后页面和上面一样。
🍔POJO绑定
✨创建控制器类LoginController
定义`LoginController`类中的`login3`方法,它通过`@RequestMapping("/login3")`注解映射到`/login3`的HTTP请求。该方法接收一个`Signon`对象和一个`Model`对象作为参数,使用`Signon`对象中的用户名和密码调用`ss.checkByUnameAndPwd`方法进行验证。如果验证成功,将用户名和密码添加到模型中并返回`"welcome"`视图;如果验证失败,则返回`"error"`视图。
@RequestMapping("/login3")
public String login3(Signon signon,Model model){
boolean flag=ss.checkByUnameAndPwd(signon.getUname(),signon.getPwd());
if(flag){
model.addAttribute("uname",signon.getUname());
model.addAttribute("pwd",signon.getPwd());
return "welcome";
}else{
return "error";
}
✨创建登录页面login3.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="login3" method="post">
用户名:<input type="text" name="uname"><br>
密码:<input type="password" name="pwd"><br>
<input type="submit" value="提交"><input type="reset" value="重置">
</form>
</body>
</html>
🍔自定义类型转换器
第一种以Date为例:
✨创建DateConvert类
定义一个名为`DateConvert`的类,它实现了`Converter<String, Date>`接口,用于将字符串转换为`Date`对象。在`convert`方法中,它使用`SimpleDateFormat`类以"yyyy-MM-dd"格式解析传入的字符串参数`source`。如果解析成功,返回对应的`Date`对象;如果解析失败,抛出`ParseException`,并由`catch`块捕获后抛出一个`RuntimeException`。
public class DateConvert implements Converter<String,Date>{
public Date convert(String source){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date date=null;
try {
date=sdf.parse(source);
} catch (ParseException e) {
throw new RuntimeException(e);
}
return date;
}
}
✨修改spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置Spring MVC要扫描的包-->
<context:component-scan base-package="com.hkd"/>
<!-- 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/"/>
<!-- 后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<bean id="DateConvert" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.hkd.DateConvert"/>
</set>
</property>
</bean>
<!-- <mvc:annotation-driven conversion-service="DateConvert"/>-->
<mvc:annotation-driven conversion-service="DateConvert"/>
</beans>
✨创建控制器类LoginController
@RequestMapping("/login4")
public String login4(int age, @DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday){
System.out.println(birthday);
System.out.println(age);
return "welcome";
}
✨创建登录页面login4.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="login4" method="post">
年龄:<input type="text" name="age"><br>
生日:<input type="text" name="birthday"><br>
<input type="submit" value="提交"> <input type="reset" value="重置">
</form>
</body>
</html>
第二种以Signon为例:
🎃创建SignonConvert类
定义一个名为`SignonConvert`的类,它实现了`Converter<String, Signon>`接口,用于将一个包含用户名和密码(以逗号分隔)的字符串转换为一个`Signon`对象。在`convert`方法中,使用`StringTokenizer`对输入字符串进行分割,提取出用户名和密码,然后创建一个新的`Signon`实例并设置这些属性,最后返回这个`Signon`对象。
public class SignonConvert implements Converter<String,Signon>{
public Signon convert(String source){
StringTokenizer st=new StringTokenizer(source,",");
String uname=st.nextToken();
String pwd=st.nextToken();
Signon signon=new Signon();
signon.setUname(uname);
signon.setPwd(pwd);
return signon;
}
}
🎃修改spring-mvc.xml类
在文件spring-mvc.xml中添加如下代码:
<bean id="SignonConvert" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.hkd.SignonConvert"/>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="SignonConvert"/>
🎃创建控制器类LoginController
@RequestMapping("/login5")
public String login6(Signon signon){
System.out.println(signon.getUname()+","+signon.getPwd());
return "welcome";
}
🎃创建登录页面login5.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="login5" method="post">
用户信息(用户名,密码之间以逗号隔开):<input type="text" name="signon"><br>
<input type="submit" value="提交"><input type="reset" value="重置">
</form>
</body>
</html>
🍔数组类型
✨创建控制器类LoginController
定义一个名为`login6`的方法,它通过`@RequestMapping("/login6")`注解映射到`/login6`的HTTP请求。该方法接收一个名为`uname`的字符串数组作为参数,并遍历数组中的每个字符串,将它们打印到控制台。无论数组内容如何,最终方法都会返回`"welcome"`视图。
@RequestMapping("/login6")
public String login6(String uname[]){
for(String str:uname){
System.out.println(str);
}
return "welcome";
}
}
✨创建登录页面login6.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="login6" method="post">
用户1<input type="text" name="uname">
用户1<input type="text" name="uname">
用户1<input type="text" name="uname">
用户1<input type="text" name="uname">
用户1<input type="text" name="uname">
用户1<input type="text" name="uname">
<input type="submit" value="提交"><input type="reset" value="重置">
</form>
</body>
</html>
🍔集合类型
✨创建控制器类LoginController
定义一个名为`login7`的Spring MVC控制器方法,它通过`@RequestMapping("/login7")`注解映射到`/login7`的HTTP请求。该方法接收一个名为`uname`的`List<String>`类型的请求参数,表示用户名列表,并将这些用户名打印到控制台。随后,它将用户名列表添加到模型中,以便在视图中使用,并最终返回名为`"welcome8"`的视图。
@RequestMapping("/login7")
public String login7(@RequestParam("uname")List<String> uname,Model model){
for(String str:uname){
System.out.println(str);
}
model.addAttribute("uname",uname);
return "welcome8";
}
✨创建登录页面login6.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="login7" method="post">
用户1<input type="text" name="uname"><br>
用户1<input type="text" name="uname"><br>
用户1<input type="text" name="uname"><br>
用户1<input type="text" name="uname"><br>
用户1<input type="text" name="uname"><br>
<input type="submit" value="提交"><input type="reset" value="重置">
</form>
</body>
</html>
✨创建welcome8.jsp页面
<c:forEach item="${uname}" var="data">
:这个标签开始一个循环,它告诉JSP页面遍历uname
集合中的每个元素。item
属性指定了要遍历的集合,var
属性定义了在循环体内代表当前元素的变量名(在这里是data
)。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:forEach items="${uname}" var="data">
${data}
</c:forEach>
</body>
</html>
在框内输入以下内容:
跳转后的页面为:
🍔将集合类型数据作为POJO类的数据成员
✨创建User类
public class User {
List<String> uname;
public List<String> getUname() {
return uname;
}
public void setUname(List<String> uname) {
this.uname = uname;
}
}
✨创建控制器类LoginController
定义一个名为`login8`的Spring MVC控制器方法,它通过`@RequestMapping("/login8")`注解映射到`/login8`的HTTP请求。该方法接收一个`User`类型的参数`user`,假设`User`类有一个`getUname`方法返回一个`String`集合。方法中遍历这个集合,将每个用户名打印到控制台,然后返回`"welcome"`视图。
@RequestMapping("/login8")
public String login8(User user){
for(String str: user.getUname()){
System.out.println(str);
}
return "welcome";
}
✨创建登录页面login8.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="login8" method="post">
用户1<input type="text" name="uname"><br>
用户1<input type="text" name="uname"><br>
用户1<input type="text" name="uname"><br>
用户1<input type="text" name="uname"><br>
用户1<input type="text" name="uname"><br>
<input type="submit" value="提交"><input type="reset" value="重置">
</form>
</body>
</html>
以上就是本期介绍的全部内容了,主要是关于数据绑定。如果您感兴趣的话,可以订阅我的相关专栏。非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!