今天主要讲视图组件和Validator验证框架:
在Struts里面严格来说是没有视图组件的,自定义标签和ActionForm可以算是视图组件……
ActionForm作用:代表页面表单,是DTO的一种,DataTransferObject(数据传输对象)。可以设置页面表单的默认值,并加以验证。
ActionForm共有且只能有两种存在范围,1是request、2是session。不能是超过上面两种作用域中的其他的作用域。
如何设置ActionForm的作用域?设置的时候在配置文件中设置,action中有个scope,指明的就是ActionForm的作用域范围,还有name属性和ActionForm关联,attribute属性指明表单存储在作用域中的属性名字,validate指明是否在ActionForm中进行validate验证。
进入页面时先从action属性中找与哪一个formbean关联,然后去找对应的formbean去设置默认值。提交的时候又是不同的过程。
如果表单作用域是session的话,则ActionForm对象一直存在……除非是request作用域。
调用ActionForm:execute方法中直接调用;从作用域中用attribute属性名取出来;
=====================================================================动态的ActionForm:如果页面上有多个自定义标签的表单的话,为每一个自定义标签表单设置formbean的话是很麻烦的事情,动态的ActionForm是要求你在配置文件中去配置这个东西,也就是不用写ActionForm这个类了。
所谓动态的ActionForm,就是不确定你的表单的属性和名字以及个数等。还是利用了map,键是属性名,值是属性值的方式存储。
org.apache.struts.action包中的:DynaActionForm类就是动态表单。
简单的登陆实例来介绍DynaActionForm的使用……
index.jsp:
<html:form action="/login"> username:<html:text property="username" /><br> password:<html:password property="password" /><br> <html:submit /></html:form>
struts-config.xml:
<form-beans> <form-bean name="userForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="username" type="java.lang.String" initial="jsp" /> //initial指明初始值 </form-property name="password" type="java.lang.String" /> </form-bean></form-beans>
新建一个Action:public ActionForward execute(){ DynaActionForm userForm = (DynaActionForm)form ; String target = "failure" ; if("jsp".equals(userForm.get("username").toString())&& "jsp".equals(userForm.get("password").toString())) { target = "success"; } return mapping.findForward(target) ;}
=======================================================================ActionForm有reset和validate的功效,但是现在一旦变成动态的dynaActionForm了,情况就不一样了,你如何校验和清空呢?这些逻辑都要依据具体的ActionForm的属性来做,这就有点麻烦了…………
假如我要reset,那么可以新写一个类来继承DynaActionForm:public class MyDynaActionForm extends DynaActionForm{ //重写reset方法 public void reset(ActionMapping arg0,HttpServletRequest arg1) { set("username",null); set("password",null); }}但是这么一来的话,相当于还是写一个类再配一个,和ActionForm就没有区别了,所以一般肯定不这么做。
还有一种办法,调用initialize方法,也就是:
public class MyDynaActionForm extends DynaActionForm{ //重写reset方法 public void reset(ActionMapping arg0,HttpServletRequest arg1) { initialize(arg0); }}//这样一来,这个MyDynaActionForm就和特定的表单没有什么关系了。//值会恢复成配置文件里面指明的initial属性中的值。//但是注意:既然写了类,form-bean中的type就要写这个类的全名,而不能是//<form-bean name="userForm" type="org.apache.struts.action.DynaActionForm">
但是现在的问题是:你怎么做校验呢??配置文件里面并没有说明以什么样子的逻辑进行校验,只要一和特定属性关联就失去了动态表单的意义了。
为了动态表单能够不和特定属性关联同时也能够校验,就出现了validate框架,简化Struts开发,这个框架是个独立的框架,在其他地方也完全可以独立运行的,后来被整合到了Struts框架中,也就是commons-validator,里面的Validator类是很重要的!既然不想和表单紧耦合的话,就需要配置文件的解析!
如果要使用validator框架的话,首先得把struts的bin文件夹里面的lib中的一个叫做validator.xml的文件拷贝到WEB-INF中。
public class MyPlugIn implements PlugIn{ public void destroy() { System.out.println("in destroy plug in") ; }
public void init(ActionServlet servlet , ModuleConfig config) { System.out.println("in init plug in") ; }}
还得在Struts的配置文件里面加上:<plug-in className="test.MyPlugIn"> //className是上面写的类的全名</plug-in>
这样ActionServlet一旦被加载立刻就会调用plug-in的init方法,通知应用程序插件的存在!由于validator框架是另一套框架,所以必须用插件的形式将validator框架给引入!
validator框架里面也提供了ValidatorPlugIn,
<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /> </plug-in>
需要新建一个xml文档,而且validator的dtd文档中的DOCTYPE要拷贝过来!在里面指明你要校验的属性和校验的规则……validation.xml:
<?xml version="1.0" encoding="UTF-8"?><form-validation> <formset> <form name="userForm"> //校验一个userForm,其中的属性username用校验器required进行校验! <field property="username" depends="required"> //后面可能有多个校验器, //之间要用逗号隔开 <arg0 key="username" /> //从资源包里面找key为username的值传给上面的arg0中,也就是{0}! //如果resource设成false的话,那就是把username作为字符串!不去找资源包了! </field> <field property="password" depends="required"> <arg0 key="password" /> </field> </form> </formset></form-validation>
在资源包里面加上(注意要使用native2acsii生成新文件!)errors.header=<h3><font color=red>错误列表:</font></h3>errors.prefix=<li>errors.suffix=</li>errors.footer=</ul><hr width="800">
errors.required={0}不能为空!username=用户名password=密码//{0}代表一个参数,说明哪一个参数不可以为空。
先加上plugin,再加入配置文件validator-rules.xml,写上你的配置规则,然后记得使用配置文件中的DOCTYPE去代替我写的配置规则xml文件中的DOCTYPE
但是还有一点需要注意:这个时候要求form-bean中的type="org.apache.struts.validator.DynaValidatorForm"必须得这么设置!这个时候如果想要重载的话只有写一个类来继承这个DynaValidatorForm的reset方法了。
<form-bean name="userForm" type="org.apache.struts.validator.DynaValidatorForm" dynamic="true">//这里一定要注意!!!!如果重写reset方法,势必要派生出DynaValidatorForm的子类,这样一来就必须设置//dynamic属性为true!!不然会出错的!==========================================================整个过程:1、在struts-config.xml中配置validator的plug-in元素,并且指明pathnames属性,value之间要用逗号分割开2、书写validator-rules.xml(人家已经写好了)和validation.xml(里面书写校验哪些表单域以及相应的规则)3、将Form修改为ValidatorForm或者DynaValidatorForm4、在资源包中加资源,在页面上加入<html:errors/>
========================================================================================================================================================================如何在前台加入校验代码:
在header元素中加入:<html:javascript formName="userForm" method="check">//method里面指明生成的函数名字<html:form action="/login" οnsubmit="return check(this)">//this代表form自己就相当于javaScript前台校验代码
同一个表单对应不同的action中可能校验的规则是不一样的,这时候应该使用ValidatorActionForm或者DynaValidatorActionForm来进行校验!而且注意校验的时候上面的formName要写上action元素中的path!!!而不是name!!!!同理,validation.xml中,<html:javascript formName="myForm" method="check">应该写为<html:javascript formName="/login" method="check">
注意以下6个form的区别:
ActionForm / / DynamicActionForm ValidatorForm | | DynamicValidatorForm ValidatorActionForm | DynamicValidatorActionForm
有Action的是可以用路径识别的form,如果没有Action就只能用name来识别该form。有Dynamic开头的都是不需要你去继承它(也就是要求你写一个实现类)直接在配置文件中配好就可以。有Validator的是可以使用Validator的框架。
=================================================================================剩下的时间听刑啸屹讲Log4J和common-Logging源代码:只能试着去记一下了,
刚才田老师还说了一下以前曾经向我们要过一些资料或是文章之类的东西,但是后来没有再要过,原因是因为有些人认为是被利用了,所以基于这个原因,田老师后来没有再让大家整理什么资料然后交给他,其实这里说的“某些人“应该是我把,我的日记中记载了相关的事宜,确实说过类似的想法,所以……
当时我确实有这种大家被利用的感觉……这我得承认,而且在日记中赤裸裸的表现出来了……
”以小人之心度君子之腹“?感觉用在我身上挺合适的……日记嘛,需要实事求是,而且如老罗所说,公民也有龌龊的权利,所以……我在日记中以小人之心度田老师君子之腹也应该可以原谅吧,当然可以原谅。
==================================================================================要了解commons-logging必须首先了解log4j,commonslogging并没有实现日志的功能,只是为java的所有日志实现提供一个统一的接口。
几乎所有的java开源项目都会用到Log4j,但是同时,所有用到log4j的项目一般都会使用commons-logging.引入log4j的包新建一个WEB工程:
看样子记不下来了,学生讲课不比老师,实在是掌握不住节奏,还是一会儿看他找的资料把……import org.apache.log4j.Logger;public class HelloLog4j{ private static Logger logger = Logger.getLogger(HelloLog4j.class.getName()); public static void main(String[] args) { //BasicConfigurator.configure() ;//最简单的配置方法
PropertyConfigurator.configure("c://log4j.properties");//从指定文件读取log4j配置文件的内容 DOMConfigurator.configure();//从xml文件中读入配置信息 logger.setLevel(Level.INFO); //这句话如果写了的话,那么和debug有关的信息就不会输出了,只是输出 //info或是info级别以上的信息! logger.debug("Hello log4j!"); //打印0 [main] DEBUG log4j - Hello log4j! System.out.println("hello world!!"); logger.debug("after hello world!");//打印 10 [main] DEBUG log4j - after hello world! }}
一个日志最麻烦的地方就是如果一个线程正在写文件,但是另外一个线程也要写文件,这时会抛出异常。log4j就解决了这个问题。
public class Common{ private static Log log = LogFactory.getLog(CommonsLogging.class.getName()) ; //用类名作为log的名字 public static void main(String[] args) { log.debug("Hello "); }}
=================================================================================
在北大这么大的地方里,如果碰巧有个人和你一样几乎天天在这个校园里面,那么你碰到他的概率有多大呢?这个数学问题需要建模来解决,而且还要考虑很多的因素,好像是个无厘头的拿来胡闹的问题,也没有解决的意义,来这里上课第54天了,这个概率的分子算是被我撞到了……晚上在餐厅,偶尔抬眼一看,竟然看到了同样在北大读研究生的同班同学……想想就不禁让人感叹,想当初我们系那么多考研的,好像就有一个人考上了北大研究生,一个人考上了清华的研究生,这两个人……还都是我们班的,还都是……一个寝室的……除了”厉害“,我脑子里面也没什么更合适的词来形容这两个人了……如今我碰到了其中之一,很感慨……
其实不太愿意碰到这种情况,毕竟双方地位差距过于悬殊,总感觉别扭,用中国人的观点来说,就是挺没面子的,可是都在北大,迟早会碰到,只是个概率的问题,但是没有想到54天就碰到了,看来这个概率的分母还不够大……聊了什么我已经不怎么记得了……就是记得也没什么意义,谈的东西也没什么意义,无非是我”管丈母娘叫大嫂“,没话搭拉话呗,要不没话说多尴尬啊,上大学的人嘛,牛的人是真牛,衰的人是真衰,如今我这衰人碰到个牛人,窘迫之处可想而知,像我这种不太善于人际交往的人要是以前碰到这种情况,恐怕早就找借口自己先溜了,但是现在毕竟还是承受力强了一些,脸皮厚了一些,甚至能够等对方慢慢吃完然后一起走出去……从某种角度来讲,我还挺佩服自己的……
在大学时就和他没怎么接触过,他是班中的领导层的人,他那一寝室的人几乎都是班中活动的骨干,也深得班主任的器重,我是无所谓,谁领导或是组织什么活动之类的我都不在乎,但是班里面总有人对他颇有微辞,不知为何,我也搞不清楚,试着问别人他们也讳莫如深或是说不明白,我一向不善于看这种东西,谁知道到底是什么原因呢……也许他们寝室政治味儿太浓了……?
这周六晚大学同班同学要在北航附近聚一下……大概20多人的样子,大概几乎所有留京的同学都会到那里把……其实本来今天晚上见到他之前我还犹豫呢,是不是找个理由推掉呢……实在是没什么脸面去,去了自己大概都感觉臊的难受,中国人有的时候很在乎面子,不幸的是我是其中的典型代表,这种臭毛病是什么时候培养出来的我也搞不清楚,但是有的时候自己就是这么个好面子的人,还时不时的犯点红眼病……真邪了!!别人是别人的事情,和我有什么大关系呢??这又不是在工作中,难道这里面能有什么利益纠纷??不能够啊,如果没有的话,为什么有的时候自己还能有那种想法呢?科学家早就研究清楚了,嫉妒可以说是人类最复杂的情感,它牵扯着人大脑的多个区域,如果一个人的”红眼病“太严重的话,是很难治的,它就像把双刃剑,刺伤别人的同时也刺伤自己。还好我的红眼病比较轻微,仅仅刺伤自己而已,没有伤到别人,这就好……
既然今天见到我们班里的北大光华管理学院的高材生了,虽然挺尴尬局促没什么话好说,但总算没像过去那样”落荒而逃“,而且还比较坦然的告诉他自己在这里参加java培训,表现还不错,看样子是个好兆头,这样说来周六还是去看看吧,要不然老这么躲下去对自己性格也没好处,人有的时候就是得没皮没脸一些,老那么在乎面子干什么呢!就是自己连毕业证都没有拿到的话人家也不会笑话你不是么……其实有的时候人与人之间的屏障是自己人为设置的,突破这层屏障有的时候很困难,但是不去突破的话永远也突破不了,尴尬、局促什么的,习惯了就好,没什么大不了的,既然脑子这玩意儿很难用物理行为达到预期的改变效果,那就用潜移默化的化学刺激反应来改变它吧,也许等到以后脸皮比城墙还厚的时候我回头看看今天写的东西会满脸鄙夷的……
一个普普通通的同学聚会都能让我感慨这么多,还冒出这么多怪想法……我确实应该考虑换个脑子了……
=================================================================================