`
zisefeiniao
  • 浏览: 172507 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

信息恢复,未来是属于我的

阅读更多
今天是Struts的最后一部分,总的来说,并不是很难,因为这是把我们之前学习的内容简单的更新了下而已,但是从我自己的角度来看,我觉得Struts本身确实存在了很多的开发问题,老师讲解的时候也着重说了这些,从所有的学习来看,这段时间的学习应该是最轻松的,从开始学习一个个小的知识点,再到树立正确的开发思想,这段时间确实比较辛苦,而一但做了第一个项目之后,就发现许多的知识都能熟练了,看来MLDN的课程安排的确实非常的合理,因为从Struts的使用上就可以发现,我只要再用两天就能把Struts搞到精通的状态了,所以我觉得以后的学习也没问题。


今天所讲的知识点
A Struts的ForwardAction
B Struts的Token
C Struts的动态Form
D Struts的验证框架


我对知识点的分析
A Struts的ForwardAction
有的时候您只是想要从一个页面或资源转换到另一个资源,在MVC/Model 2的架构中,直接使用页面或资源的路径来跳转并不是一个好的主意,这会使得控制器没有机会处理相关的请求事宜,总是由Action调用JSP是个好习惯。 您仍应该通过控制器,使用ForwardAction可以帮您完成这个事情,当控制器使用ForwardAction的perform()方法时,它会使用属性parameter所设定的路径进行forward的动作,一个设定ForwardAction的例子如下:
代码:
        <action
             path="/Welcome"
             type="org.apache.struts.actions.ForwardAction"
             parameter="/pages/Welcome.jsp"/>
ForwardAction是唯一可以不使用ActionForm的Action,用来完成跳转,也只能完成跳转,这样做遵循了MVC的规范,并且隐藏了目标地址。
ForwardAction只需要在struts-config.xml中配置就可以了,而不需要真正的创建Action类和ActionForm类。
<action path="/forward"
type="org.apache.struts.actions.ForwardAction" parameter="/insert.jsp"></action>
其中parameter表示自动跳出的路径
修改跳转路径:
原来
<a href="index.jsp">插入功能</a>
修改为:
<a href="forward.do">插入功能</a>

B Struts的Token
struts如何解决重复提交问题?使用Token指令牌:
☆就是在进入表单页面之前,先通过<a href="mytoken.do"></a>进入一个Action,在该Action中设置一个Token指令   (this.saveToken(request)),然后再进入表单页面,在表单页面的Action中先检查Token指令是否被设置 (this.isTokenValidat(request)),是则再执行打印,打印完之后记得还要取消Token指令牌设置 (this.resetToken(request))。

Struts的Token的工作原理,Token是一个设置在session范围内的属性,在进入插入或修改等页前先设置指令牌,将产生的值传递到页面,自动在表单中隐藏域保存,当表单提交后,对提交的token值与session中的token值比较,如果相等可以提交,如果不等或没有提交的token值,应该提示错误(不能重复提交)
示例:
进入插入页面前,先在Action中设置指令牌
public ActionForward insertpre(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm) form;// TODO Auto-generated method stub
// 设置指令牌
this.saveToken(request);
return mapping.findForward("insert");
}
配置插入的跳转路径
<action attribute="userForm" input="/error.jsp" name="userForm"
path="/user" scope="request" parameter="status"
type="org.liky.struts.action.UserAction">
<forward name="list" path="/list.jsp"></forward>
<forward name="forward" path="/forward.jsp"></forward>
<forward name="update" path="/update.jsp"></forward>
<forward name="insert" path="/insert.jsp"></forward>
</action>
页面上如果使用了html:form,则自动会将token值设置为隐藏域
public ActionForward insert(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {

UserForm userForm = (UserForm) form;// TODO Auto-generated method stub

if (this.isTokenValid(request)) {

boolean flag = false;
try {
flag = DAOFactory.getUserDAOInstance().doCreate(
userForm.getUser());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (flag) {
// 当数据插入到数据库后再进行文件保存
// 判断是否有文件
if (!userForm.getUser().getPhoto().equals("no_photo.jpg")) {
// 定义输出流
try {
FileOutputStream os = new FileOutputStream(new File(
this.getServlet().getServletContext()
.getRealPath("/")
+ "upload/"
+ userForm.getUser().getPhoto()));
// 进行文件保存

os.write(userForm.getPhoto().getFileData());
// 关闭
os.close();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

request.setAttribute("message", flag ? "插入成功!" : "插入失败!");
request.setAttribute("path", "/user.do?status=list");


// 重置Token
this.resetToken(request);

} else {
//提示不得重复提交
ActionMessages errors = new ActionMessages();
errors.add("sub", new ActionMessage("sub.err"));
this.saveErrors(request, errors);
return mapping.getInputForward();
}

return mapping.findForward("forward");
}

C Struts的动态Form
一、DynaActionForm类的引入
使用ActionForm可以给开发者在处理HTML表单上带来极大的帮助。它简化了代码编写,并提供了自动的数据验证。但是,ActionForm也存在几个非常明显的缺点。

首先,如果ActionForm对应的HTML表单添加或删除属性,ActionForm类就可能需要修改并重新编译;其次,如果HTML表单是动态的,那么ActionForm更是无能为力了;另外,ActionForm增加了一个项目中类的绝对数量。

从Struts1.1开始对这些不足进行了改进,引入了动态ActionForm(DynaActionForm)的概念。动态ActionForm允许用户无须为应用程序的每一个HTML表单创建具体的ActionForm类。Struts框架包中的DynaActionForm类及其子类实现了动态ActionForm。DynaActionForm类扩展了ActionForm类。用户可以直接使用DynaActionForm类,或者扩展该类以覆盖其validate()和reset()方法。

二、配置动态ActionForm
1、
动态ActionForm支持在Struts配置文件struts-config.xml中完成ActionForm的全部配置,无须编写任何额外的Java代码。对DynaActionForm来说,在Struts配置文件struts-config.xml中,<form-bean>元素的type属性设置为DynaActionForm或其子类,并在<form-bean>中包含一系列<form-property>子元素来标记动态表单的属性。
例如:
<form-beanname="loginActionForm"type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>

<form-bean>元素的type属性指定使用Struts框架包中的DynaActionForm类,用户也可以扩展这个类,实现自定义的动态ActionForm。
<form-property>元素的name属性指定了ActionForm中的属性名,type属性指定了属性类型。其中属性类型必须是标准的Java类,即当属性类型是int、long、float、double、boolean等这些基本数据类型时,要使用它们的包装类,即要使用Integer、Long、Float、Double和Boolean类。
2、
使用动态ActionForm,当需要添加新的属性时,只需要修改配置文件,无须更改源代码,这样便提供了巨大的功能和灵活性。<form-property>元素允许用户为每一个属性指定初始值。Struts框架在应用程序启动时将这些属性设置为这些值。
3、
在默认情况下,DynaActionForm类的reset()方法调用基类ActionForm的reset()方法。如果想要在每次调用reset()方法时,将所有属性设置到初始状态,就需要定义一个扩展DynaActionForm类的子类,覆盖其reset()方法,在reset()方法中将所有属性复位到初始状态。但是,用户不必在子类的reset()方法中编写冗长的属性复位代码,DynaActionForm类的initialize()方法已经为用户做了这些工作,用户要做的只是在reset()方法中调用initialize()方法。Initialize()方法把表单的所有属性恢复为默认值。表单属性的默认值由<form-bean>元素的<form-property>子元素的initial属性指定。如果没有为<form-property>指定initial属性,则属性的默认值应由相应的Java类型自动决定。例如整型将复位为0,布尔型复位到false,字符串等对象复位到null。

示例:
1、建立注册页面
2、动态ActionForm


建立后,在struts-config.xml中配置的ActionForm里,加入了form-property属性,通过该属性设置了所有ActionForm中保存的内容
<form-beans>
<form-bean name="registForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="password" type="java.lang.String" />
<form-property name="age" type="java.lang.String" />
<form-property name="userid" type="java.lang.String" />
<form-property name="email" type="java.lang.String" />
<form-property name="birthday" type="java.lang.String" />
</form-bean>
</form-beans>


三、在Action中访问动态ActionForm

同普通ActionForm一样,Action类和JSP都可访问动态ActionForm,而访问方法也基本一致。访问动态ActionForm与访问普通ActionForm的最大区别在于对属性的访问方式不同。在标准ActionForm中,针对每个属性都提供了getter和setter方法,来读取和设置属性。而DynaActionForm把所有的属性保存在一个Map对象中,因此访问DynaActionForm中的属性与访问Map对象中的方法类似:
public Object get(String name)
public void set(String name, Object value)

例如,在前面的登录系统的loginAction中访问一个名为loginActionForm的动态ActionForm的方法为:
//从Form Bean中取出表单数据
DynaActionForm loginActionForm = (DynaActionForm)form
String username = (String)loginActionForm.get("username");
String password = (String)loginActionForm.get("password");

示例:在Action中可以通过getString等方法接收参数
获得对象直接用get()
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DynaActionForm registForm = (DynaActionForm) form;// TODO Auto-generated method stub

String userid = registForm.getString("userid");
System.out.println(userid);


return null;
}


四、动态ActionForm的表单验证
DynaActionForm类的validate()方法没有提供任何默认的验证行为。可以通过定义扩展DynaActionForm类的子类,然后覆盖validate()方法,但是以编程的方式来验证动态ActionForm并不是一个理想的策略。动态ActionForm的验证应该使用Struts的Validator验证插件。Validator插件允许采用特定的配置文件为动态ActionForm配置验证规则,如检查必需的输入域、日期和时间等。

D Struts的验证框架
Struts1.1及以上版本,在提供了动态ActionForm的同时,配合数据验证的需要,还提供了表单输入自动验证的功能,即使用Validator验证框架。

Validator验证框架是通过配置验证规则实现验证功能的,开发人员不需要编写代码,同时也能够最大限度重用同一个验证规则。因此,这种验证方式在目前的Struts应用中得到了广泛的应用。

1、如果要使用验证框架,必须配置一个struts插件,在struts-config.xml中
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml"/>
</plug-in>
2、该类用来处理动态验证功能,处理时需要一个验证规则配置文件,该文件在加入Struts支持时,已经加入了,保存在WEB-INF下,因此将该文件路径配置到pathnames属性中
3、修改动态Form的类型或创建一个动态验证非Form
<form-beans>
<form-bean name="registForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="password" type="java.lang.String" />
<form-property name="age" type="java.lang.String" />
<form-property name="userid" type="java.lang.String" />
<form-property name="email" type="java.lang.String" />
<form-property name="birthday" type="java.lang.String" />
</form-bean>
</form-beans>
4、修改Action中Form的转换类型
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DynaValidatorForm registForm = (DynaValidatorForm) form;// TODO Auto-generated method stub

String userid = registForm.getString("userid");
System.out.println(userid);


return null;
}
5、配置错误规则及并在资源文件中配置错误提示信息
非空验证:
<formset>
<form name="registForm">
<field property="userid" depends="required">
<arg key="userid.msg"/>
</field>
<field property="password" depends="required">
<arg key="password.msg"/>
</field>
</form>
</formset>
为了防止错误信息重复,配置参数进行错误信息处理
errors.required=<li>{0} is Required!

userid.msg=Userid
password.msg=Password
增加最小长度验证
<formset>
<form name="registForm">
<field property="userid" depends="required,minlength">
<arg0 key="userid.msg"/>
<arg1 key="minlength.msg"/>
<var>
<var-name>minlength</var-name>
<var-value>6</var-value>
</var>
</field>
<field property="password" depends="required">
<arg key="password.msg"/>
</field>
</form>
</formset>
其中var表示设置的要验证的最小长度值,而arg设置的显示的数据参数值
errors.required=<li>{0} is Required!
errors.minlength=<li>{0} can not be less than {1} characters.
errors.email=<li>{0} is an invalid e-mail address.


userid.msg=Userid
password.msg=Password
email.msg=Email

minlength.msg=6
增加email验证
errors.required=<li>{0} is Required!
errors.minlength=<li>{0} can not be less than {1} characters.
errors.email=<li>{0} is an invalid e-mail address.


userid.msg=Userid
password.msg=Password
email.msg=Email

minlength.msg=6

分享到:
评论

相关推荐

    手机短信恢复软件

    《手机短信恢复软件详解——以“楼月手机短信恢复软件”为例》 在数字化时代,手机短信作为重要的通信工具,承载着我们的个人信息、商务交流甚至重要通知。然而,误删短信的情况时有发生,给人们带来了不小的困扰。...

    苹果微信短信恢复注册版

    本文将详细讨论“苹果微信短信恢复注册版”这一工具,它专注于帮助用户恢复丢失或删除的短信和微信聊天记录。 首先,我们来理解一下标题:“苹果微信短信恢复注册版”。这表明该软件是专为苹果设备设计的,尤其是...

    塞班短信恢复

    塞班系统手机短信恢复软件,恢复一个月内已删短信

    手机短信恢复软件 v3.7

    楼月手机短信恢复软件是一款专业的手机短信恢复软件,不但支持所有iPhone手机(含iPhone X, iPhone 8, iPhone7, iPhone6S, iPhone6, iPhone5S等),也支持所有安卓手机(含三星,华为,小米,联想,魅族,酷派,OPPO...

    楼月手机短信恢复软件 v2.1官方版.zip

    楼月手机短信恢复软件可将您已删除的短信进行恢复。软件支持所有安卓手机及苹果手机。手机短信是保存在手机中的一个sqlite格式的数据库中的,当短信被删除后,其实该数据块并没有在文件中进行删除,只是将该数据块...

    iPhone手机短信恢复软件免费版

    本文将详细讲解如何利用"iPhone手机短信恢复软件免费版"来恢复丢失的短信,以及相关的重要知识点。 首先,我们需要理解的是短信数据是如何存储在iPhone中的。iPhone的短信数据储存在其内部的SQLite数据库中,这些...

    安卓手机短信恢复 2.5官方安卓版

    总的来说,\"安卓手机短信恢复 2.5官方安卓版\" 是一款实用的Android应用,尤其适用于那些需要保护重要信息或经常处理大量短信的用户。它提供了一种便捷的方式,帮助用户在面临短信丢失时,尽可能地找回数据,减少了...

    信息系统灾难恢复规范.pdf

    《信息系统灾难恢复规范》是信息安全领域的一份重要文档,它为组织如何预防、准备、响应和恢复从灾难中提供了一套全面的指导原则。这份规范旨在确保关键信息系统的持续运行,减少因灾难导致的业务中断,保护组织资产...

    苹果手机短信删除恢复方法教程

    打开短信库文件后,可以查看到短信记录,双击左侧短信后右侧显示所有的短信信息,软件默认执行恢复删除的聊天记录。 5. 个人隐私保护:教程中强调了这种方法不需要邮寄手机或发送数据文件,确保了用户个人隐私的...

    GB 20988-2007 信息安全技术信息系统灾难恢复规范.zip

    《GB 20988-2007 信息安全技术信息系统灾难恢复规范》是中国国家标准化管理委员会发布的一项重要标准,旨在为我国的信息系统提供一套完整的灾难恢复策略和实施指南。这一规范对于保障国家信息化建设的安全性和稳定性...

    android短信误删除恢复app

    该app用于将误删除的短信恢复。以txt的形式保存在手机里

    易我数据恢复向导V2.1.0(附注册码)

    《易我数据恢复向导》是首款国内自主研发的数据恢复软件,是一款功能强大并且性价比非常高的数据恢复软件。本软件在WINDOWS操作系统下,提供FAT12/ FAT16/FAT32/VFAT/NTFS/NTFS5分区的数据恢复,支持IDE/ATA、SATA、...

    重要信息系统灾难恢复指南.docx

    重要信息系统灾难恢复指南 重要信息系统灾难恢复指南是确保组织的持续运行和服务质量的关键。该指南提供了一个全面的灾难恢复计划,涵盖了灾难备份和恢复计划的制定、实施和维护。下面是该指南的重要知识点总结: ...

    易我数据恢复向导2.0含注册码

    《易我数据恢复向导2.0:解锁数据恢复的核心技术》 ...无论是个人照片、工作文档,还是企业的重要资料,易我数据恢复向导2.0都能够在关键时刻发挥至关重要的作用,帮助用户挽回损失,保障信息的安全。

    易我数据恢复向导V2.1.0

    在安全方面,易我数据恢复向导V2.1.0在恢复过程中不会对原有数据造成二次破坏,它只是读取硬盘上的信息,不会修改任何现有的文件。这确保了在恢复过程中,用户的原始数据得以最大程度地保护。 总的来说,易我数据...

    苹果兔手机短信恢复软件 v3.2.zip

    苹果兔手机短信恢复软件是一款恢复删除的苹果手机短信及安卓手机短信的数据恢复软件。随着微信及陌陌等聊天软件的普及,现在使用手机短信的用户相对以前来要少一些了,但手机短信永远都是不可能会退出手机历史舞台的...

    易我数据恢复--序列号

    ### 易我数据恢复软件及序列号解析 #### 软件概述 易我数据恢复是一款功能强大的数据恢复工具,适用于Windows系统环境下的各种数据丢失情况。它可以帮助用户找回因误删、格式化、分区丢失等原因导致的数据损失。该...

    信息安全技术 信息系统灾难恢复规范

    ### 信息安全技术 信息系统灾难恢复规范 #### 一、引言与背景 《信息安全技术 信息系统灾难恢复规范》(GB/T20988—2007)是中国国家标准之一,旨在规范信息系统灾难恢复的基本要求及其实施过程。该标准参考并借鉴...

    【数据恢复】易我数据恢复

    《易我数据恢复》是一款专为用户设计的高效数据恢复软件,它可以帮助用户在各种情况下找回丢失的文件,包括误删除、格式化、系统崩溃、病毒攻击等多种原因导致的数据丢失。这款工具以其用户友好的界面和强大的恢复...

    Android项目实战--手机卫士19--短信的恢复

    总之,实现手机卫士中的短信恢复功能是一项涉及Android核心组件、数据库操作以及用户交互设计的任务。开发者需要对Android系统的短信服务有深入理解,并具备良好的编程实践能力,以提供稳定、高效的解决方案。

Global site tag (gtag.js) - Google Analytics