1月25日——培训第54天

今天主要讲视图组件和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或者DynaValidatorForm
4、在资源包中加资源,在页面上加入<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培训,表现还不错,看样子是个好兆头,这样说来
周六还是去看看吧,要不然老这么躲下去对自己性格也没好处,人有的时候就是得没皮没脸一些,老那么在乎面子
干什么呢!就是自己连毕业证都没有拿到的话人家也不会笑话你不是么……其实有的时候人与人之间的屏障是自己人
为设置的,突破这层屏障有的时候很困难,但是不去突破的话永远也突破不了,尴尬、局促什么的,习惯了就好,没
什么大不了的,既然脑子这玩意儿很难用物理行为达到预期的改变效果,那就用潜移默化的化学刺激反应来改变它吧,
也许等到以后脸皮比城墙还厚的时候我回头看看今天写的东西会满脸鄙夷的……

一个普普通通的同学聚会都能让我感慨这么多,还冒出这么多怪想法……我确实应该考虑换个脑子了……

=================================================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值