struts2学习之类型转换

1、前言

      我们都知道从前台表单的数据提交到后台时候,都是字符串类型的,我们用到时,还得对它们进行类型转换,如果一个 表单数据很多的话,如果每一个都用request.getParameter("name")来得到的话,那是很烦躁的,这些代码都是重复的,对于有规律的代码,可以单独拿出来进行封装,我曾经也写了一个这样的方法,不过写的很简单,很多情况都没有考虑到,比如类型转换。struts提供了一个很好的转换封装机制,下面看看例子。

2、需要了解的知识点

      struts2和struts1有很大的不同,可以说strus2的前身不是strust1,Struts2从本质上看来源于Webwork,它同时具有Struts和Webwork的优点,struts1和struts2的常用对象对应关系如下:


         说明:struts2对表单信息处理有两种机制,一种是属性驱动,即把表单中的属性定义在action类中,另一种是模型

         驱动,即和struts1一样,把所有的属性放在一个单独的javabean类中,这种方式使得代码的结构比较清晰,由于

         第一篇博客采用了属性驱动来实现了,这篇的例子就采用模型驱动来实现。

3、编写一个User.java模型类

        

package com.champion.bean;

import java.util.Date;

public class User {
	private String username;
	private String password;
	private String repassword;
	private Point point;
	private Date birthday;
	private Date graduated;
	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;
	}
	public String getRepassword() {
		return repassword;
	}
	public void setRepassword(String repassword) {
		this.repassword = repassword;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public Date getGraduated() {
		return graduated;
	}
	public void setGraduated(Date graduated) {
		this.graduated = graduated;
	}
	public Point getPoint() {
		return point;
	}
	public void setPoint(Point point) {
		this.point = point;
	}
	
}

 

    说明:可以看到在这个类中,有一个Point类型的属性point,这个是我另外定义的一个javabean类,我想用更多的

             属性类型来说学习struts2的类型转换机制。

4、还得建一个Point.java模型类

    

package com.champion.bean;

public class Point {
	private int x;
	private int y;

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

}

  

    说明:在这个模型中,我们可以看到它有两个属性x和y,point的意义是一个二维坐标。

3、创建一个registe.jsp页面,才用的时struts内置的标签库,使用它的好处是它内置了很多功能,使得代码更加简单。

   

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
	<head>
		<title>用户注册</title>
	</head>
	<body><h2>坐标请输入两个常数,用逗号隔开,如32,34</h2>
		<s:form action="registe2">
			<s:textfield name="point" value="坐标"></s:textfield>
			<s:textfield name="username" label="用户名:"></s:textfield>
			<s:password name="password" label="密码:"></s:password>
			<s:password name="repassword" label="确认密码:"></s:password>
			<s:textfield name="birthday" label="出生年月:"></s:textfield>
			<s:textfield name="graduated" label="毕业日期:"></s:textfield>
			<s:submit value="提交"></s:submit>
		</s:form>
	</body>
</html>

 

4、编写RegisteAction2java类

 

   

import com.champion.bean.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class RegisteAction2 extends ActionSupport implements ModelDriven<User>{
	User user=new User();
	public User getModel() {
		return user;
	}
	@Override
	public String execute() throws Exception {
	
	       return SUCCESS;
	}
}

     说明:这个类继承了ActionSupport这个动作超类,对于一些自定义的字符类型,如果不继承这个类的话,就无法

              写自定义的方法对自定义类型如Point类型进行转型。继承ModelDriven<I>接口是使用模型驱动,在这个类

              中不用写属性,只要实现ModelDriven<I>中的getModel()方法,返回一个模型对象,struts就会自动的

              对User类 的属性进行匹配类型,并赋值。特别说明,只有动作处理都没有错误(如没有类型转换出错)时,最

              后才会执行execute()放方法,返回一个字符类型。

5、编写注册成功后要显示的页面outInfo.jsp页面

 

   

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
	<head>
		<title>注册信息</title>
	</head>
	<body>
		<s:label value="坐标:"></s:label>
		<s:property value="point" />
		<br>
		<s:label value="用户名:" />
		<s:property value="username" />
		<br>
		<s:label value="密码:" />
		<s:property value="password" />
		<br>
		<s:label value="出生年月:" />
		<s:property value="birthday" />
		<br>
		<s:label value="毕业年月"></s:label>
		<s:property value="graduated" />
	</body>
</html>

 

     说明:这个页面也采用了struts的内置标签,使用<s:property value="属性名">即可活动属性名的值,并输出到

             页面中。

6、编写struts.xml文件

  

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<package name="struts2" extends="struts-default">
		<action name="registe2" class="com.champion.action.RegisteAction2">
			<result name="success">/outInfo.jsp</result>
			<result name="input">/registe2.jsp</result>
		</action>
	</package>
</struts>    

 

     说明:这个文件定义一个action动作,动作类执行成功时,显示outInfo.jsp页面,这段

             <result name="input">/registe2.jsp</result>的意思是如果出错,则继续停留在registe2.jsp页面,但

             是页面会刷新,input这个属性是struts内置的。

7、如果直接运行的话,程序会不会成功呢,由于篇幅的原因,这里就不展示了,答案是否定的,为什么呢,因为我在页面

     坐标输入的如:3,5这样的值,struts是不知道怎么对后台的point进行赋值的,因为point不是一个常见的类型,而

是我自己定义的javabean对象,要想从前台得到的值对它进行赋值,那还得自己编写解析的类。

     struts2对数据的转换提供了很多中转换的方法,由于它是采用了xwork框架来实现的,所以我们也可以编写一个类

让它继承ognl.DefaultTypeConverter这个类,但是这个然后在convertValue(Map context, Object value, Class toType)方法中对数据进行解析就可以,但是这中方法不太好用,所以我决定采用strut2包装好的类来实现,这个类是StrutsTypeConverter,其实它的本质就是继承了ognl.DefaultTypeConverter,只不过它进行包装了,我们用起来更

方便一些。

下面开始编写PointConterver2.java类,实现对Point类型的转换。

 

package com.champion.converter;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.champion.bean.Point;

public class PointConterver2 extends StrutsTypeConverter {
	@Override
	/**
	 * 这个方法是从页面传来的string类型进行转换相应的类型
	 * values表示从页面传回来的一个字符串数组
	 * toType表示需要转换为的类型
	 */
	public Object convertFromString(Map arg0, String[] values, Class toType) {
		// 取得values对象中的数据,这个数组其实只有一个数据,因为我在页面只写了一个point属性的输入框
		String firstValue = values[0];
		// 以逗号将数据进行拆分,拆分后的第一个元素为x,另一个为y
		String[] resultValue = firstValue.split(",");
		// 创建一个Point对象
		Point point = new Point();
		// 对point的x和y进行赋值
		point.setX(Integer.parseInt(resultValue[0]));
		point.setY(Integer.parseInt(resultValue[1]));
		return point;
	}

	@Override
	/**
	 * 这个方法是用来将类型转换为字符类型的方法,当在页面需要显示某个属性的值时,就会调用这个方法
	 * value表示需要转换的对象
	 */
	public String convertToString(Map arg0, Object value) {
		// 强制转型为Point类型
		Point point = (Point) value;
		// 得到x和y的值
		int x = point.getX();
		int y = point.getY();
		// 拼凑一个字符串,当在页面要显示point类型时,显示的格式就是result这样的格式,这个可以自己定义
		String result = "x:" + x + "  y:" + y;
		System.out.println(result);
		return result;
	}
}

 

   说明:在代码中已经说的比较详细了

8、到现在是不是可以了呢,答案还是否定的,因为我们只是编写了转换类,但是它什么时候执行,又对那个属性进行转型,程序都不知道,所以还得编写一个关联文件,文件名为xwork-conversion.properties

 

    

com.champion.bean.Point=com.champion.converter.PointConterver2

   说明:这个文件很简单,只有一行代码,它的意思是对com.champion.bean目录下的Point类型进行转换,用到的转换

             com.champion.converter.PointConterver2,也就是刚刚编写的那个类型转换类,对于那个文件名是规定

             死的了,这个是在全局使用的,也就是无论你在那里action中有Point这中类型的,它都会掉用这个转换器对它进

            行转换,另外还可以定义局部的,关联文件名规则为actionName-converter.properties,并且这个文件要

            与action类要在同一个目录下如在这个例子中, 名为registeAction2-conterter.properties关联文件,那

            么它的内容有所不同,这里的内容为Point=com.champion.converter.PointConterver2,也就是不用说明

             Point的路径了,因为它和RegisteAction2在同一个目录下。

 9、是时候看看效果怎么样了。

      在regist2.jsp页面输入信息如下:

    

   提交后,显示的结果为:



    说明:可以看到Point类型已经成功的进行了类型转换,输入的坐标结果正是在PointConverter2中的result值的

             格式一 样。

10、小结一下

     对于已经存在的数据类型,struts2都可以帮我们自动进行了转换,但是我们定义的类型,就必须自己编写转换类来对其进行转换,其实struts对数据的转换机制和我们自己编写的本质上是一样的,只不过,他采用了反射机制,面向的是泛型

而我们编写的是针对与每一个特定的类型而已,今天学习就到这,累了,想睡觉了。

 

 


 

 

帆软报表开发-快速入门 数据可视化展示功能特点如下:选择权限管理 > 用户最终权限 > 汤姆(Tom) > 选择图表设计入门 > 打开查看权限。 阅读详情

相关推荐

Verilog SDF反标实战:从时序仿真到设计验证的完整流程解析

本文详细解析了Verilog SDF反标的完整实战流程,从时序仿真的必要性到设计验证的核心环节。文章深入拆解了SDF文件结构,并重点阐述了如何使用$sdf_annotate系统任务进行延迟反标注,将后端物理时序信息精确带回前端仿真,以实现更真实的时序验证,帮助工程师在流片前发现并修复潜在的时序违例问题。

bert9linguist的博客 702

struts2 类型转换学习总结

给出如下实例 1、编写输入表单 input.jsp,代码如下   &lt;body&gt; &lt;h2&gt;&lt;font color="red"&gt;用逗号将两个点分开&lt;/font&gt;&lt;/h2&gt; &lt;s:form action="pointConverter"&gt; &lt;s:textfield name=&

fushengfei的专栏 205

【实战指南】OpenClaw 使用 Bird Skill 接入 X(Twitter)的终极省心方案:告别每次都要手动喂 Cookie 的痛苦

OpenClaw 使用 Bird Skill 接入 X(Twitter)的终极省心方案:告别每次都要手动喂 Cookie 的痛苦

hampeter的博客 1802

Struts2学习——(十二)Struts2类型转换

类型转换我们在之前的开发中多多少少已经用到了。前台页面中传递到后台的信息是以字符串的形式,而在后台中Java是强类型的语言,因此需要进行类型转换。

WangQYoho的博客 617

手把手教你离线部署bert-base-uncased模型(附完整文件清单)

本文提供了一份详尽的bert-base-uncased模型离线部署指南。针对严格内网或无网络环境,文章不仅列出了包括config.json、pytorch_model.bin在内的完整必需文件清单,还详细解释了每个文件的作用,并给出了使用snapshot_download工具或手动下载的两种文件获取方法。重点阐述了如何正确设置本地路径、编写健壮的加载代码,并通过多层次验证确保模型在离线环境下成功运行,有效解决了部署过程中常见的文件缺失和路径错误问题。

weixin_29034963的博客 322

LE AUDIO---Volume Control Service

LE AUDIO---Volume Control Service

weixin_42162924的博客 165

Struts2学习之类型转换

1:Struts2的类型转换默认的框架默默的帮助用户完成转换功能,主要用户输入的数据合理地转换为需要的属性的类型,Struts2框架就会在execute方法执行之前,替用户将参数转化为合理的类型   2:Struts2内建类型转换器    int/Integer :  整数型    short/Short:  短整数型    long/Long:    长整型

张波的技术积累 1371

Windows 镜像包大全(附百度云下载链接)

插入U盘,找到下载好的两个驱动软件,并安装,先打开驱动人生万能网卡版,安装好网卡驱动,可以接入wifi或者网线了,然后打开驱动精灵,按照提示,安装所有的驱动(中间要是让你重启,就先选择稍后再说,如果有的驱动安装好之后非要你重启,关不掉的那种,那你就重启吧),等全部安装好了,重启电脑。如果你有显卡,这里以英伟达举例,我是GTX960的,当你的驱动都安装好后,右键桌面,会出现一个英伟达控制面板。安装软碟通,下载之后,一直下一步就ok,啥也不用配置,到了最后一项点击“继续试用”即可。(下载里面的网卡版即可),

悦分享 7378

Struts2学习笔记5:Struts2类型转换续二

Struts2学习笔记5:Struts2类型转换续二绑定:struts2-core-2.0.11.2.jar中类的源代码地址E:/Java/struts-2.0.11.2/src/core/src/main/java新建一个版本,并在tomcat的server.xml文件中声明struts" docBase="F:/eclipse/workspace/struts/WebROO

风达的专栏 1537

【00】虹软2023届校招专场 ,计算机类笔试攻略(笔试考试时间、考察范围、笔试难度 等说明)

虹软科技2023校招笔试攻略:三大岗位类别(算法、算法优化、开发)分别于7月24日进行。题型包括选择题、编程题和问答题,其中算法类题目降低难度,编程题改为LeetCode模式。重点考察数学基础、机器学习、编程能力(C/C++/Python)、数据结构和算法优化等。建议根据投递岗位选择问答题,算法优化类注重系统知识和SIMD优化,开发类侧重多线程等实际应用能力。笔试结果将作为校招offer的重要参考。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 277

SCI投稿Title Page、Cover letter、Highlights、Manuscript模板

(简要介绍一下论文的创新性). I hope this paper issuitable for “Journal Name”.版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.youkuaiyun.com/weixin_48615832/article/details/120317336。

qq_15963745的博客 3702

Struts2学习:类型转换篇

框架中常规的类型转换对我们而言是透明的,我们无需关心,一般来说我们所要做的是确保HTML中input的命名能够在OGNL表达式中使用。在HTML中,并没有数据类型的概念,任何数据都被当做字符串或者字符串数组来传递。Struts2为我们提供了一些内建的类型转换,譬如说基本类型之间的转换、”1984-08-27”格式的字符串能够被正确的转换为Date类型等等。但是这些内建的类型转换有时并不能满足我们的

鱼与飞鸟 4480

AES-128-CMAC:背景、汽车应用、CAPL 实现与开源工具验证

本文详解车载诊断中AES-128-CMAC算法的原理与应用,涵盖其在UDS安全访问、刷写鉴权、SecOC认证及密钥派生中的核心作用。结合真实汽车电子场景,提供纯CAPL实现代码与测试脚本,并通过pycryptodome进行逐字节验证,确保算法正确性。全程基于CANoe实测数据,可直接用于HIL环境复现,助力开发者高效落地汽车网络安全方案。

蚂蚁小兵 120

Struts学习----struts2类型转换

struts2默认支持类型转换 字符串 <--> 指定类型 之间转换 字符串 转成 指定类型:表单提交,浏览器发送服务器 指定类型 转成 字符串:标签回显,服务器发送浏览器 指定类型 8个基本类型、以及包装类 时间 Date(字符串有格式要求:yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss) ...

nonpricklycactus的博客 194

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

struts2学习之三、类型转换

struts2学习之三、类型转换 1、本例中在界面上输入点,所以引入了类型转换点的pojo类 package com.test.bean; public class Point { private int x; private int y; public int getX() { return x; } public void setX(int x) { this.x ...

whp0731 132

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

struts2学习之四、类型转换2

&lt;h3&gt;&lt;font color="red"&gt;使用x坐标,y坐标分两行&lt;/font&gt;&lt;/h3&gt; &lt;s:form action="pointConverter"&gt; &lt;s:textfield name="point.x" label="x"&gt;

whp0731 109

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

struts2入门学习--类型转换

1.创建输入页input.jsp 使用struts的标签 displayPoint">                     2.创建输出页output.jsp 使用struts的标签  3.配置struts.xml文件,我们先假定该action由com.test.struts2.CircleActi

快乐天使专栏 587

类型转换---struts2学习笔记

类型转换的流程   1、用户进行请求,根据请求名在struts.xml中寻找Action  2、在Action中,根据请求域中的名字去寻找对应的set方法。找到后在赋值之前会检查这个属性有没有自定义的类型转换。没有的话,按照默认进行转换;如果某个属性已经定义好了类型转换,则会去检查在Action同一目录下的 action文件名-conversion.properties 文件。

如果一个人只能做好那么很少的几件事情 那么就做自己喜欢做的事 936

Struts2学习:类型转换

框架中常规的类型转换对我们而言是透明的,我们无需关心,一般来说我们所要做的是确保HTML中input的命名能够在OGNL表达式中使用。在HTML中,并没有数据类型的概念,任何数据都被当做字符串或者字符串数组来传递。Struts2为我们提供了一些内建的类型转换,譬如说基本类型之间的转换、”1984-08-27”格式的字符串能够被正确的转换为Date类型等等。但是这些内建的类型转换有时并不能满足我们的...

捌元钱 115

Struts 2学习及问题记录(3)——类型转换及输入校验

所有的MVC框架都需要负责解析HTTP请求参数,并将请求参数传递给控制器组件。但是,HTTP请求参数都是字符串类型,而Java是强类型语言,所以MVC框架必须提供字符串参数和相应数据类型互相转换的功能。   输入校验也是所有Web应用必须处理的问题。因为所有的浏览者都可以自由使用应用,所以收集到的数据非常复杂。可能包括用户的误输入,也可能包含恶意用户的恶意输入,这些都可能导致系统的异常,轻则非正

董小虫的专栏 1235

struts2学习之---类型转换

所有的MVC框架,都需要负责解析HTTP请求参数,并将请求参数传给控制器组件,HTTP请求参数都是字符串类型,但Java是强类型的语言,因此MVC框架必须将这些字符串参数转换成相应的数据类型—这个工作时所有的MVC框架都应该提供的功能。 Struts2的类型转换可以基于OGNL表达式,只要把HTTP参数(表单元素和其他GET/POST的参数)命名为合法的OGNL表达式,就可以充分利用stru

StrongHYQ的博客 566

[Struts2学习笔记] -- 简单的类型转换

  接下来学习一下Struts2简单的类型转换,Struts2基于ognl.jar实现了简单类型的数据转换。比如jsp页面中的form值与字段值的转换,下面写一个例子。   1、创建一个jsp页面,编写一个form表单模拟登录,有一个用户名username和密码password,在加入一个登录按钮。如图: <%@ page language="java" impor...

141

struts2学习笔记(3)——struts2的局部类型转换

今天又学到了一个新的东西,就是struts2的类型转换。 为什么要类型转换? 今天我就要传一个点的坐标给你,保存时用一个自定义的Point类来保存。 因为在表单里面传过去的是字符串,如“12,23”,要把它存进Point类,就必须进行类型转换。将字符串用“,”截取,然后第一部分赋值给x,后一部分赋值给y。 首先设计输入页input.jsp                      

Darren Fang的博客 1040

Struts2学习笔记之类型转换 二

Struts2学习笔记之类型转换Struts2之类型转换一第一次笔记中,在convert类型装换类中只涉及到了对象从页面像后台转换的,这一节将对从后台向页面转换进行完善。output.jsp<html> <head> <title>Insert title here</title> </head> <body> <!-- 本质上,是调用了UserAction中的getUser方法 -->

yujasonjam的专栏 394

Struts2学习笔记4:Struts2的类型转换【2】

 遗留任务:www.opensymphony.com/ognl下载ognl-2.6.11.jar文件的源代码1.建立converter.PointConverter.java文件,以下是源代码import java.util.Map;import model.Point;import ognl.DefaultTypeConverter;pub

风达的专栏 1237

【学习笔记】Struts2 类型转换

为什么需要类型转换 在基于HTTP协议的Web应用中 客户端请求的所有内容(表单中提交的内容等)都以文本编码的方式传输到服务器端但服务器端的编程语言(如Java)有着丰富的数据类型 如 int boolean Date 等等因此 当这些参数进入应用程序时 必须被转换成适合的服务器端编程语言的数据类型 在Servlet中 类型转换工作是由开发者自己完成的比如我们在易买网里要把分页的信息pageI...

weixin_30614587的博客 80
上一篇: struts2学习之入门
下一篇: Struts2学习之表单验证
Champion_netjava
博客等级 码龄16年 10粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值