2006年12月26日

 public ActionErrors validate(ActionMapping actionMapping,
                                 HttpServletRequest httpServletRequest) {
        String style =
                "^[a-zA-Z][a-zA-Z0-9._-]*@([a-zA-Z0-9-_]+\\.)+(com|gov|net|com\\.cn|edu\\.cn)$";
        Pattern ptt = Pattern.compile(style);
        Matcher mch=ptt.matcher(email);
        ActionErrors errors = new ActionErrors();
        if ((name == null || name.equals(""))) {
            ActionError error = new ActionError("error.name");
            errors.add("name", error);
        } else
        if (!mch.matches()) {
            ActionError error = new ActionError("error.email");
            errors.add("email", error);
        }
        return errors;
    }

posted @ 2006-12-28 11:58 鹭 阅读(1290) | 评论 (0)编辑 收藏

在Struts中,担任 MVC / Model 2 中Controller角色的是ActionServlet,所有的请求都必须先通过它,然而在Struts 1.1後,有关於请求的处理大部份已交由RequestProcessor,当ActionServlet收到GET或POST的请求,其doGet() 或doPost()会呼叫process()方法来处理请求:
protected void process(HttpServletRequest request,
                        HttpServletResponse response)
                   throws IOException, ServletException {
    RequestUtils.selectApplication(request,
                                   getServletContext());
    getApplicationConfig(
         request).getProcessor().process(request, response);
}
 
RequestUtils是个工具类,ActionServlet呼叫其selectApplication()方法,藉由 request.getServletPath()来取得请求路径以选择应用程式模块来处理请求,之後从ApplicationConfig物件取得 RequestProcessor物件,将使用者的请求委托它来进行处理。

通常是将ActionServlet当作黑盒子,您只要使用它,然而您也可以继承ActionServlet来定义自己的控制器,但由於在Struts 1.1中大部份的请求已经委托RequestProcessor来处理,继承ActionServlet来定义自己的控制器请求处理意义已经不大,通常的 目的是重新定义ActionServlet的init()方法,增加自己的初始化动作:
public class CustomActionServlet extends ActionServlet {
    public void init() throws ServletException {
        super.init();

        // 增加自己的初始化动作
        ....
    }
}
 
预设的RequestProcessor物件是org.apache.struts.action.RequestProcessor,您可以藉由观看 process()方法的原始码来了解它作了哪些事情:
public void process(HttpServletRequest request,
                     HttpServletResponse response)
                  throws IOException, ServletException {
    // 处理 contentType 为 multipart/form-data 的 POST 请求
    request = processMultipart(request);

    // 取得 URI 路径
    String path = processPath(request, response);
    if(path == null)
        return;
    .....

    // 确定客户端的位置
    // 是否要将一个Locale物件储存在 session 中
    // 配合 <controller> 的 locale 属性使用
    processLocale(request, response);

    // 确定contentType,预设是 text/html
    processContent(request, response);

    // 判断<controller>属性nocache是否被确定
    // 若是,在 response 中加入防止快取的header
    processNoCache(request, response);

    // 前置处理,预设返回 true
    //子类可以重新定义它以决定要不要继续处理
    if(!processPreProcess(request, response)) {
        return;
    }

    // 从URI路径确定ActionMapping
    ActionMapping mapping =
                   processMapping(request, response, path);
    if(mapping == null) {
        return;
    }

    ....

    // 处理ActionForm
    // 如果没有就新增一个,之後一直使用它
    ActionForm form =
            processActionForm(request, response, mapping);
   
    // 将表单的栏位值填入ActionForm
    processPopulate(request, response, form, mapping);

    // 判断是否执行ActionForm的validate()方法
    if(!processValidate(request, response, form, mapping)) {
        return;
    }

    // 判断 标签的 forward 或 include 标签
// 是不是被设定,这两个标签在设定一个路径
// 其与 type 属性是互斥的,当设定其中一个属性时
// 调用 RequestDispatcher 的 forward() 或 include()
// 其作用与设定ForwardAction或IncludeAction相同
// 直接绕送而不再使用Action物件进行接下来的处理

    if(!processForward(request, response, mapping)) {
        return;
    }
    if(processInclude(request, response, mapping)) {
        return;
    }

    // 处理Action,如果没有就生成一个,之後一直使用它
    Action action =
            processActionCreate(request, response, mapping);
    if(action == null) {
        return;
    }

    // 呼叫Action的execute()或perform()方法
// 并返回ActionForward

    ActionForward forward =
                    processActionPerform(request,
                                         response,
                                         action,
                                         for, mapping);

    // 处理ActionForward
    processActionForward(request, response, forward);
}
 

您可以继承RequestProcessor,并改写其中的processXXXXX()方法来自定义请求的处理方式,如果您要使用自己的 RequestProcessor,要在struts-config.xml中使用<controller>标签来定义,例如:
  • struts-config.xml
...
<controller
contentType="text/html;charset=Big5"
locale="true"
nocache="true"
processorClass="caterpillar.CustomRequestProcessor"/>
...

在Struts 1.1後,新增了<controller>标签,它可以用於指定ActionServlet的一些参数,在Struts 1.1之前,这些参数是在<init-params>中加以指定,使用<controller>标签,应用程式中不同的模组也可 以指定各自的参数给ActionServlet。

posted @ 2006-12-28 10:24 鹭 阅读(808) | 评论 (0)编辑 收藏

html:link有很多参数选项,如关键有:
action --指定点击链接后,进入的*.do动作action的值不需要跟后缀,struts自动补上.do
page  -- 跟action一样的功能,不过这个不会自动补.do,也就是说可以链接其他类型的动作,如html,jsp,php等

paramId--指定参数的key名称,如要输出http://abc.com/ss?kk=abc,则paramId="kk"
paramName -- 能识别作用域(任意)内的Object的名称。
paramProperty--paramName的输出属性,paramId,paramName ,paramProperty可以组成单一参数传递的link,如<html:link  action="/PRC301E1"  paramId="prc_no" paramName="element" paramProperty="fjPrcNo">,当element.getfjPrcNo()的值为prc1时,则输出为 http://xxoo.com/PRC301E1.do?prc_no=prc1

name--为HashMap属性的对象,用此属性,可以进行多参数输出。例:

CODE:
[Copy to clipboard]
     <%
        HashMap map=new HashMap();
       map.put("check","22");
       map.put("name","abc");
       pageContext.setAttribute("map",map); //因为所有tag的取值只会搜索作用域(page/request/session/application),而不会识别当前的实例,所以只有存入。
      %>
      <html:link action="/PRC301E1"  name="map">
        多参数输出
      </html:link>

-----------------------------------------------------------------------------------------

在struts标签<html:link>的page属性指定的URI后面传递参数可以有几种方式:

1.若明确参数名和参数值则直接在URI后输出,
如:<html:link page="/test.do?action=add">add</html:link>

2.对于参数值不确定的,paramName和paramProperty来输出,用paramId属性指定参数名。
对于paramName指定的对象应该存在于page、request、session、application其中之一。一般来说,是从Action类传过来的,作为request的属性之一(requst.setAttribute("name",object))。
如果paramName指定的对象是action的ActionForm,则无需使用request.setAttribute方法。
例:<html:link page="/test.do" paramId="userid" paramName="uid">uname</html:link>
若参数值是一个bean对象的属性值(比如ActionForm,或者集合中存放的对象)则:
<html:link page="/test.do" paramId="userid" paramName="user" paramProperty="uid">uname</html:link>

3.若两个参数,一个确定一个不确定,则是以上两种方法的结合,即:
<html:link page="/test.do?action=modify" paramId="userid" paramName="uid">modify</html:link>

4.对于多个参数的问题,可以使用一个HashMap集合对象来存放所有的参数名及对应的参数值的方式,paramName属性值指定为该HashMap集合对象即可。
举例:
<%
//代码理想的位置应该是在action中
//可以在jsp页面测试
  java.util.HashMap pms = new java.util.HashMap();
  pms.put("code", "001002");
  pms.put("name", "tester");
  pms.put("alias", new String[]{"matin","jack"});
  request.setAttribute("params", pms);
%>
<html:link action="/test.do" name="params" >test</html:link>
编译后的结果:<a href="/test.do?code=001002&name=tester&alias=matin&alias=jack">test</a>
这种方式虽然可以解决传多参数的问题,但是实现起来也比较麻烦,特别是对记录集中的数据逐条列出的时候

5.针对有的网友在<html:link>标签中嵌入使用jsp脚本(scriptlet)的问题,
例如:
<html:link page="/test.do?code=<%=varible%>">add</html:link>,这种写法是错误的,是无法编译的。
有的网友认为在struts标签内是不允许使用jsp脚本的,这种说法也不准确。如果前面的写法改成:
<html:link page="<%="/test.do?code="+varible%>">add</html:link>,就可以被执行,但是要注意URL相对路径的问题。

虽然在struts标签中嵌入jsp脚本不是真正意义上的struts应用,但是有时在委曲求全的情况下也只能如此了,除非使用自定义标签。比如在form表单中可能需要根据具体数据让某个字段是只读的,就可以用嵌入jsp脚本来实现:
<%
boolean rdonly=false;
if(2==2) rdonly=true;
%>
<html:text property="userid" readonly="<%=rdonly%>" />

6.另外一种比较变态的方法,既不是真正意义上的struts,也不符合xml规范。那就是在<a>标签中用<bean:write>标签输出参数值。
如:<a href="test.do?uid=<bean:write name="user" property="userid"/>&name=<bean:write name="user" property="username"/>">test</a>

posted @ 2006-12-27 14:35 鹭 阅读(337) | 评论 (0)编辑 收藏

  myeclipse+eclipse+tomcat配置
一、安装j2sdk1.4,设定环境变量。 
   我的安装目录是 D:\work\j2sdk 。 所以设定环境变量如下:  
   操作: 我的电脑(右键) ----> 系统特性----> 高级----> 环境变量:  
(此处原文有图片,不懂如何设置的朋友可以产看原文)
设定环境变量为:
   1. (新建)JAVA_HOME: D:\work\j2sdk
   2. (新建)CLASSPATH: .;D:\work\j2sdk\lib\tools.jar (注意:点号不能省略,表示当前目录)
   3. 编辑PATH的变量值,在后面加上 ;%JAVA_HOME%\bin (注意:要有分号隔开) 

   到这里,j2sdk安装完毕,用命令简单测试一下: java -version  
二、安装Tomcat5.0 
我安装的是jakarta-tomcat-5.0.28,是安装版,同样安装在d:\work目录下,便于管理。
 
三、安装Eclipse3.1 
1、下载地址:http://www.eclipse.org/downloads/index.php 找到下面的页面
直接解压缩到d:\work目录就可以用了   到这里, Eclipse3.1 安装完毕。
2、汉化,下在汉化包[Eclipse3.1.1和中文语言包,MyEclipse4.0.3].NLpack1-eclipse-SDK-3.1.1a-win32,解压后把features和plugins这2个目录拷贝到 Eclipse的相应目录下。
一定要先汉化,如果先破解再汉化会出现意想不到的错误。
四、安装 MyEclipse4.1.1 (MyEclipse不是免费的,所以我们先下载一个试用版,再去网上下载一个注册机)  
下载版本: MyEclipse Enterprise Workbench 4.1.1 GA for Windows 98/2000/XP (8/29/2005) 
 
下载完成后,开始安装: 
1. 选择你的eclipse所在目录(根目录 如:D:\work\eclipse),其它都点下一步,默认安装。
 
2.安装完毕之后,找到myeclipse的安装目录
 
3. 将features和plugins这2个目录复制出来。
 
4. 将第3步复制的features和plugins这2个目录下的文件, 拷贝到 Eclipse的相应目录下。
 
解释一下上面做的原因: 因为myeclipse是eclipse的插件,所以只要把features和plugins这2个目录的内容拷贝到eclipse的相应目录,eclipse会自动认出这些插件。 
到这一步,myeclipse算是安装完毕 
 
五、破解myeclipse4.1.1 
1.去google搜索下载一个注册机。MyEclipse 4.0 以上版本(http://www.blogjava.net/Files/oksonic/MyEclipseKeyGen4.X.rar

2.解开注册机,可以看到有三个文件.运行KeyGen.exe. 选择合适的MyEclipse版本随便输入一个名字,然后生成注册码. 把Name和Key都记录下来留着一会使用.

3.运行eclipse.exe, 设定同目录下的workspace
 
4.这个时候myeclipse插件应该已经被识别出来如果不能识别请在仔细检查上述步骤.并通过goole解决.
 
5. 点击 Window ----> Preferences ----> Subscription ----> Enter Subscription, 输入注册码,破解myeclipse
 
到这里,myeclipse破解完毕。 

posted @ 2006-12-26 07:36 鹭 阅读(920) | 评论 (1)编辑 收藏

我的星座

白羊座的人令人觉得他开朗而热情。即使他内心是有那么点害羞,表面上仍可以很自在、大方。当一头白羊愁眉苦脸时,只会出现在他家里镜子中。他再伤心,就是不会在别人面前摆出苦脸。好强?可以这么说。谁不好强呢?其实白羊座的人仍会向朋友吐苦水,但真正的眼泪,你是看不到的。

  一群朋友,开开心心的,在阳光下嬉耍,是白羊座最怀念的美好时光。悲郁的人生绝不是白羊座的人所向往的,不幸陷入时,他也会极力设法让自己不要太相信会就这么过一生,他全心希望有一个新生活。

  爱恨分明不吃回头草

  白羊座的人爱恨分明,爱就是爱,恨就是恨。不过A型白羊,对“恨”这个字眼没多大兴趣,他是不爱就是不爱而已。在爱情上,白羊是相当干脆的,不喜欢拖泥带水,属于行动派,要求立见真章。他们最不能忍受一厢情愿。

  凡是白羊决定不要的东西,绝不会再捡回来,否则他无颜面对自己。不吃回头草,也是白羊座人好强的证据。由于白羊座对爱情具有童话格,要求纯洁、唯一与童稚心的恋情,与旧情人复燃爱曲当然是白羊座不屑的。

  谈恋爱时,白羊座的人是不会骗你的,大可放心。但是他的爱意来得快,去得快。除非你有超强的吸引力,一旦一头白羊陷入不可自拔的情网时,你要抽身,也就很难了。那将会是悲剧的下场。你也得不到好处。

  乐观乃天性不是不悲观

  白羊座天性乐观,但长大后遭遇到的事了,他们也会悲观到了极点。只不过悲观归悲观,既然不想死,活下去就得乐观点,日子才会有趣些。因此白羊座的人只不过是不把悲观当一回事,并不是不悲观。而他们乐观的天性极具感染力,你得稳着点,以免误陷入一塌糊涂的乐观绝地之中。

  白羊行使侠义的性格,使他能结交许多剖心相见的朋友。但是他对朋友的要求也很高,不少人受不了白羊座对朋友的殷殷期许。自然啦,白羊对情人、对丈夫(或妻子)、对同事,也都有些标准在心中测量。与标准不符时,他便会觉沮丧、食欲不振。现实的人永难成为白羊座人的朋友。

  爆发型的浪漫

  白羊座的人当然是浪漫的,但是是属于爆发型的浪漫。公羊、母羊皆如此。一点一滴积出来的浪漫,对白羊座来说,强度不够,只觉累赘、厚重,这种浪漫容易分叉、断裂。白羊座喜欢在庆典的夜晚,与情人并肩仰望烟火在夜空中爆放出光芒万丈,而那也正象征着爱情发生的瞬间,浪漫不过了。

  当白羊座处于浪漫的瞬间,几乎没有什么事可以挪动他们的感性。浪漫过后他显然全已清醒,接下来端看那瞬间爆发的浪漫,到底能在他的记忆中存留多久,才能知他到底有多在乎曾经发生过的感动。

  因此,你也可以推论出,工作、事业、婚姻、友情都不在白羊浪漫的范畴中,他对这些反是以细水长流的方式经营。“徒步越过爱琴岛是可能的,你只要逐岛跳过去就行了。”

  嗨!我在这里

  不必等到风吹草低见牛羊的那一刻,你便会远远看到有只羊在拚命蹬踢他强健的小蹄子,在半空中跳跃,向你打招呼:“嗨!我在这。”

  是的,白羊座的人就是这么令人觉得他开朗而热情。即使他内心是有那么一点害羞,表面上仍可以很自在、大方。当一头白羊愁眉苦脸时,只会出现在他家镜子中。他再伤心,就是不会在别人面摆出苦旦脸。好强?可以这么说。谁不好强呢?其实白羊座的人仍会向朋友吐苦水,但真正的眼泪,你是看不到的。

  一群朋友,开开心心的,在阳光下嬉耍,是白羊座最怀念的美好时光。悲郁的人生绝不是一头白羊所向往的,不幸陷入时,他也会极力设法让自己不要太相信就这么过一生,他会全心希望有一个新生活。

  正经八百的,会要他的命

  白羊座出现在高贵、华丽的场合中,不会显得格格不入,但是他自己却难受得要命,因为他不能自在地跷二郎腿,不能在高兴时放浪形骸。正经八百的,会要他的命。

  一般社会上流行的娱乐,白羊座都能欣然加作,但是他本来就有的独特娱乐品味也不会放弃。也就是说很爱听歌剧,但也喜欢到卡拉OK高歌一曲。基本上,白羊座的是很雅、俗共赏的。他们的适应很强,但又随遇而安。在白羊的心中总是有一个更好的天堂在等着他。

  白羊座的人对于生命力旺盛的人,特别注意。他喜欢被专家领导,不会随便怀疑,一旦怀疑便打入十八层地狱。而他成为专家时,也不要随便怀疑他,如果你不能拿出令他心服口服的证据,你将永不能再从他那得到教诲。

  若不能举足轻重,宁可自动消失

  白羊座的人常因过度自信而冲动行事,又因冲动行事失败而自毁信心。对白羊座的人来说,三思而后行是比较好的。在一个团体中,白羊座若不能举足轻重,他宁可自动消失,并且不会以任何借口。消失就消失了,这不是我的王国,他把自己在团体中的角色看得很重,相对地也愿意承担更多的责任,他不会认为自己可以不劳而获。一旦劳了还是没有获得的时候就绝不恋栈。

  他的自尊心强,你的一句“老实说”会伤他的心许久。如果你问他会不会表演空中飞人,他心中盘算自己应可胜任,便会点头,答应你一个月后的表演,这一个月中他就会勤加苦练。而对于自己没有把握的事,白羊座的人是不至于去强出头的。

  爱情是一生中最大的课题

  白羊是很容易不耐烦的。在恋爱中,你得把那些小把戏收藏起来,他可受不了什么“考验”之类的事。既然爱他就应该信任他。不管公羊、母羊,他们对爱情都是十分认真的。对他们来说,爱情有两种,一种是真的,一种是假的。假情爱情,极易发生在冲动而善感的白羊座身上,但很快会结束,并且会像是从未发生过。真正的爱情,是白羊座一生中最大的课题,他总觉得这个课题怎么写也写不完整。

  友情与情是白羊座不可或缺的两大支柱。当爱情没着落时,他们可靠着这两大支柱中的任一项,发展他的事业。即使他十七岁时就有了结婚的对象,但到了七十岁若未结婚,他也仍在心中保有一个结婚对象,这是他的乐天知命所使然。

  相信小精灵的孩子

  仅管白羊座的人长得人高马大,他仍是个孩子,他一直保有天真的一面,即使长大了,他还是相信世界上有小精灵的存在。有时白羊座的人相当幼稚,可是他绝不是不聪明,他的反应可快得很呢!

  他有带头当第一的强烈欲望,做第二免谈。所以他做起事来动作很快,甚少优柔寡断。他非常自信,深信自己处理事务的能力无人可及。他也从不向命运低头,仅管挫折一次又一次的出现。他信任所有的人,很少会去怀疑别人是否会对他不利,而他的勇敢也使他能不断地站在最前面。

  与白羊座的人相处时,你必须注意一些重要的关键,他是个喜欢争先的人,这是所有白羊座的天性,所以有时你必须要有心理准备。他说话或做事都相当直接,很少会跟你拐弯抹角,他也相当诚实,只要一说谎就很容易被人察觉。

  他是个不擅处理细节的人,所以,如果你想请他处理些较细微的工作的话,倒不如自己做还来的恰当些。

 

      偶然机会看到这样一个帖子,对着我自己来一条条比较,发现竟然那么的相似,那么的准确!其实我一直都不是很相信命运的,我妈曾经给我算过命,说我这几年运道不是很好,我都没有相信,但是最近发生在我身上的一些事,好像不得不使我有那么一点相信它的存在了。最后祝愿所有白羊座的人们都开心!愉快!

posted @ 2006-12-26 07:33 鹭 阅读(209) | 评论 (0)编辑 收藏