【Spring篇】SpringMVC的常见数据绑定

news/2024/12/4 12:25:22/

  

      🧸安清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-toc" style="margin-left:80px;">✨修改spring-mvc.xml

✨创建控制器类LoginController

✨创建登录页面login4.jsp

🎃创建SignonConvert类

spring-mvc.xml%E7%B1%BB-toc" style="margin-left:80px;">🎃修改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方法。具体代码如下:

java">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。具体代码如下:

java">public interface SignonDao {public int findSignonByUnameAndPwd(String uname,String pwd);
}

🚦创建SignonDaoImp类

定义一个名为 SignonDaoImp 的Java类,它实现了 SignonDao 接口,并使用 @Repository 注解标记为Spring框架中的持久层组件。这个类提供了 findSignonByUnameAndPwd 方法的具体实现,该方法接收用户名(uname)和密码(pwd)作为参数,并检查它们是否与预设的值("tom"和"12345")相匹配。如果匹配,方法返回1,表示用户验证成功;如果不匹配,方法返回0,表示用户验证失败。具体代码如下:

java">public class SignonDaoImp implements SignonDao {@Overridepublic int findSignonByUnameAndPwd(String uname, String pwd) {if ("tom".equals(uname) && "12345".equals(pwd))return 1;return 0;}
}

🚦创建SignonService接口

定义一个名为 SignonService 的Java接口,其中包含一个公共方法 checkByUnameAndPwd。具体代码如下:

java">public interface SignonService {public boolean checkByUnameAndPwd(String uname,String pwd);
}

🚦创建SignonServiceImp类

定义一个名为 SignonServiceImp 的Java类,它实现了 SignonService 接口,并使用 @Service 注解标记为Spring框架中的服务层组件。类中注入了一个 SignonDao 类型的成员变量 sd,用于访问数据访问层。SignonServiceImp 类实现了 checkByUnameAndPwd 方法,该方法接收用户名和密码作为参数,并调用 sdfindSignonByUnameAndPwd 方法来检查数据库中是否存在匹配的用户记录。如果 findSignonByUnameAndPwd 方法返回1,表示验证成功,checkByUnameAndPwd 方法返回 true;否则返回 false,表示验证失败。具体代码如下:

java">@Service
public class SignonServiceImp implements SignonService{@AutowiredSignonDao sd;@Overridepublic 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"`。

java">@Controller
public class LoginController {@AutowiredSignonService 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方法:

java">    @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"`视图。

java">    @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`。

java">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">✨修改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

java">    @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`对象。

java">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%E7%B1%BB">🎃修改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

java">    @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"`视图。

java">    @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"`的视图。

java">    @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)。

javascript"><%@ 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类

java">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"`视图。

java">    @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>

以上就是本期介绍的全部内容了,主要是关于数据绑定。如果您感兴趣的话,可以订阅我的相关专栏。非常感谢您的阅读,如果这篇文章对您有帮助,那将是我的荣幸。我们下期再见啦🧸!


http://www.ppmy.cn/news/1552266.html

相关文章

张伟楠动手学强化学习笔记|第一讲(上)

张伟楠动手学强化学习笔记|第一讲&#xff08;上&#xff09; 人工智能的两种任务类型 预测型任务 有监督学习无监督学习 决策型任务 强化学习 序贯决策(Sequential Decision Making) 智能体序贯地做出一个个决策&#xff0c;并接续看到新的观测&#xff0c;知道最终任务结…

游戏引擎学习第31天

仓库:https://gitee.com/mrxiao_com/2d_game 回顾 回顾了他们的游戏开发进度&#xff0c;并强调了编写整个游戏的价值。他们提到&#xff0c;这个过程的目的是让每个参与者从零开始编程一个完整的游戏&#xff0c;了解整个游戏的工作原理。这样做的一个关键好处是&#xff0c…

python(18) : flask_sqlalchemy 配置sqlserver数据库对象

1.安装依赖 pip3 install flask_sqlalchemy -i https://mirrors.aliyun.com/pypi/simple/ requests2.数据库配置信息(db_manager.py) import osfrom flask import Flask from flask_cors import CORS from flask_sqlalchemy import SQLAlchemydatabase testapp Flask(__nam…

51单片机从入门到精通:理论与实践指南常用资源篇(五)

坚持一下&#xff0c;确实还有几天就可以学完了&#xff0c;这段时间的努力和付出都将化为宝贵的成果。正如《人民日报》所说&#xff1a;“每一次努力&#xff0c;都是幸运的伏笔。” 不论是在学习、工作还是生活中&#xff0c;坚持都是通往成功的必经之路。当我们在面对困难和…

聚云科技×亚马逊云科技:打通生成式AI落地最后一公里

云计算时代&#xff0c;MSP&#xff08;云管理服务提供商&#xff09;犹如一个帮助企业上云、用云、管理云的专业管家&#xff0c;在云计算厂商与企业之间扮演桥梁的作用。生成式AI浪潮的到来&#xff0c;也为MSP带来全新的生态价值和发展空间。 作为国内领先的云管理服务提供…

Flink项目实战:实时数据流处理

Apache Flink是一款开源的分布式流处理框架,广泛应用于大规模数据处理、实时数据分析和流式计算任务。Flink提供了一个高吞吐量、低延迟的流处理引擎,适合用来处理各种流式数据,例如日志分析、实时监控、推荐系统、社交网络分析等。本篇文章将介绍如何使用Apache Flink构建一…

深入理解 ES6 Promise,开启高效异步编程之旅

1. Promise的基本介绍 在 JavaScript 中,Promise 是一种用于处理异步操作的机制,它代表一个异步操作的最终完成(或失败)及其结果值。Promise 的目标是解决传统回调函数的嵌套问题(即“回调地狱”)。 Promise 是一个对象,代表着一个异步操作的结果。Promise 有三种状态…

Github 2024-11-30 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-11-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10TypeScript项目1Dart项目1Go项目1Rust: 构建可靠高效软件的开源项目 创建周期:5064 天开发语言:Rust协议类型:OtherStar数量:929…