置顶随笔
这个Email验证的正则表达式基本符合RFC3521规范,缺少ipv6部分的验证。
Mail=("([\\x20-\\x21\\x23-\\x5B\\x5D-\\x7E]|(\\\\[\\x20-\\x7E]))*"|^[-!#$%&\'*+/0-9=?A-Z\\^_`a-z{|}~]+(.[-!#$%&\'*+/0-9=?A-Z\\^_`a-z{|}~]+)*)@([a-zA-Z0-9]+([\\-\\da-zA-Z]*[a-zA-Z0-9]+)*(\\.[a-zA-Z\\d]+([\\-\\da-zA-Z]*[a-zA-Z0-9]+)*)*|[\\[]((1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9]))[\\]]|((1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])))
RFC3521中的相关定义:
Domain = sub-domain *("." sub-domain)
sub-domain = Let-dig [Ldh-str]
Let-dig = ALPHA / DIGIT
Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
address-literal = "[" ( IPv4-address-literal /
IPv6-address-literal /
General-address-literal ) "]"
; See Section 4.1.3
Mailbox = Local-part "@" ( Domain / address-literal )
Local-part = Dot-string / Quoted-string
; MAY be case-sensitive
Dot-string = Atom *("." Atom)
Atom = 1*atext
Quoted-string = DQUOTE *QcontentSMTP DQUOTE
QcontentSMTP = qtextSMTP / quoted-pairSMTP
quoted-pairSMTP = %d92 %d32-126
; i.e., backslash followed by any ASCII
; graphic (including itself) or SPace
qtextSMTP = %d32-33 / %d35-91 / %d93-126
; i.e., within a quoted string, any
; ASCII graphic or space is permitted
; without blackslash-quoting except
; double-quote and the backslash itself.
2008年12月19日
这个Email验证的正则表达式基本符合RFC3521规范,缺少ipv6部分的验证。
Mail=("([\\x20-\\x21\\x23-\\x5B\\x5D-\\x7E]|(\\\\[\\x20-\\x7E]))*"|^[-!#$%&\'*+/0-9=?A-Z\\^_`a-z{|}~]+(.[-!#$%&\'*+/0-9=?A-Z\\^_`a-z{|}~]+)*)@([a-zA-Z0-9]+([\\-\\da-zA-Z]*[a-zA-Z0-9]+)*(\\.[a-zA-Z\\d]+([\\-\\da-zA-Z]*[a-zA-Z0-9]+)*)*|[\\[]((1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9]))[\\]]|((1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])\\.(1[0-9][0-9]|25[0-5]|2[0-4][0-9]|0[0-9][0-9]|00[0-9]|[0-9][0-9]|[0-9])))
RFC3521中的相关定义:
Domain = sub-domain *("." sub-domain)
sub-domain = Let-dig [Ldh-str]
Let-dig = ALPHA / DIGIT
Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
address-literal = "[" ( IPv4-address-literal /
IPv6-address-literal /
General-address-literal ) "]"
; See Section 4.1.3
Mailbox = Local-part "@" ( Domain / address-literal )
Local-part = Dot-string / Quoted-string
; MAY be case-sensitive
Dot-string = Atom *("." Atom)
Atom = 1*atext
Quoted-string = DQUOTE *QcontentSMTP DQUOTE
QcontentSMTP = qtextSMTP / quoted-pairSMTP
quoted-pairSMTP = %d92 %d32-126
; i.e., backslash followed by any ASCII
; graphic (including itself) or SPace
qtextSMTP = %d32-33 / %d35-91 / %d93-126
; i.e., within a quoted string, any
; ASCII graphic or space is permitted
; without blackslash-quoting except
; double-quote and the backslash itself.
2008年8月15日
既然 Tomcat 本身已经可以提供这样的服务,我们为什么还要引入 Apache 或者其他的一些专门的 HTTP 服务器呢?原因有下面几个:
1. 提升对静态文件的处理性能
2. 利用 Web 服务器来做负载均衡以及容错
3. 无缝的升级应用程序
原理:
tomcat 为一个servelet容器,apache为一个web server,两者之间通信通过mod_jk的模块(由web服务器像apache、iis等使用)和Web Server通信,Tomcat 默认的 AJP Connector 的端口是 8009.整个过程其实就是让apache的httpd.conf文件调用mod_jk.conf,mod_jk.conf调用workers.properties,最后配置虚拟主机。
文件说明 :
mod_jk.conf
主要定义mod_jk模块的位置以及mod_jk模块的连接日志设置,还有定义worker.properties文件的位置。
worker.properties
定义worker的参数,主要是连接tomcat主机的地址和端口信息。如果Tomcat与apache不在同一台机器上,或者需要做多台机器上tomcat的负载均衡只需要更改workers.properties文件中的相应定义即可。
%APACHE_HOME%为你的安装目录
整合
1、准备下载下列文件:
Jdk1.5
下载地址: http://java.sun.com
tomcat 5.5.9
下载地址:http://jakarta.apache.org
apache_2.2.4-win32-x86-no_ssl.msi
下载地址: http://httpd.apache.org/download.cgi
mod_jk-apache-2.2.3.so
下载地址:http://archive.apache.org/dist/jakarta/tomcat-connectors/
2、安装好Jdk、tomcat、apache后,加入mod_jk连接模块,就是把mod_jk-apache-2.2.3.so文件重名为mod_jk.so文件并拷贝到%APACHE_HOME%"modules下
3、修改apache的配置文件:
为了保持httpd.conf文件的简洁,把jk模块的配置放到单独的文件中来,就在httpd.conf中增加一行调用
代码 include %APACHE_HOME%Apache2"conf"mod_jk.conf
4:配置mod_jk.conf
请注意使用绝对路径
其实最关键的就是 第一条 第二条 和最后一条,如果要精简,就保留这三条内容就可以了。
代码
# Load mod_jk module
LoadModule jk_module "E:"Program Files"Apache Software Foundation"Apache2.2"modules"mod_jk.so"
# Where to find workers.properties
JkWorkersFile "E:"Program Files"Apache Software Foundation"Apache2.2"conf"workers.properties"
# Where to put jk logs
JkLogFile "E:"Program Files"Apache Software Foundation"Apache2.2"logs"mod_jk.log"
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# Send servlet for context /examples to worker named ajp13
#JkMount /servlet/* ajp13
# Send JSPs for context /examples to worker named ajp13
JkMount /*.jsp ajp13
JkMount /*.do ajp13
上面这一行我们设置了了 /*.jsp ajp13 就是说把所有.jsp结尾的文件都由ajp13这个worker交给tomcat处理了,如果应用被映射为一个.do的URL,这样就会出错.解决方法是再添加如下一行:
代码
JkMount /*.do ajp13
5:配置apache2"conf"workers.properties
代码
workers.tomcat_home=E:"Program Files"Apache Software Foundation"Tomcat 5.5
workers.java_home=E:"Program Files"Java"jdk1.5.0_08
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost #
worker.ajp13.type=ajp13 #
worker.ajp13.lbfactor=1 #
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost #本机,若上面Tomcat主机不为localhost,作相应修改
worker.ajp13.type=ajp13 #类型
worker.ajp13.lbfactor=1 #代理数,不用修改
第二部分:虚拟主机的配置
举例配置2个vhost网站 一个是 localhost ,另一个是 www.ok.com
当然www.ok.com 是虚拟的,本地测试时,应该修改系统中的hosts文件,添加一行 127.0.0.1 www.ok.com
1:Apache 虚拟主机配置:
Httpd.conf文件最后添加
代码
include D:"server"Apache2"conf"vhost.conf
而vhost.conf内容写
代码
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin webmaster at localhost
DocumentRoot "D:/server/Tomcat/webapps/ROOT"
ServerName localhost
ErrorLog logs/localhost-error_log
CustomLog logs/localhost-access_log common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host dot example.com
DocumentRoot D:/server/www/
ServerName www.ok.com
ErrorLog logs/ok.com-error_log
CustomLog logs/ok.com-access_log common
<Location /server-status> # 这样我可以看到apache服务器状态
SetHandler server-status
Order deny,allow
Deny from all
Allow from localhost
Allow from www.ok.com
</Location>
</VirtualHost>
2:Tomcat虚拟主机配置
添加新的www.ok.com 虚拟主机,在tomcat安装路径"conf"server.xml的最后,找到<Engine>段,改为
代码
<Engine>
<Host name=”localhost” ……>
</Host>
<Host name="www.ok.com" debug="0" appBase="D:/server/www/" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="." />
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="ok.com_log." suffix=".txt" timestamp="true" />
</Host>
</Engine>
3:测试虚拟主机效果
访问http://localhost/ 应该可以看到原来的tomcat默认页面。
写一个 index.jsp
代码
<html>
<title>
test jsp
</title>
<%
String showMessage="Oh My God!";
out.print(showMessage);
%>
</html>
放在d:/server/www下面,访问 http://www.ok.com
页面显示Oh My God! 就成功了
2008年3月5日
要启动客户端验证,必须将HTML标记库的javascript标记放入在jsp页面文件中,例如:
<html:javascript formName="selectForm"/>.
而且要在form标签中这样写<html:form action = "/selectAction.do"method = "post" focus="userId" onsubmit="return validateSelectForm(this);">
注意DynaValidatorForm(ValidatorForm)和DynaValidatorActionForm(ValidatorActionForm)的区别。前者主要的视角是formbean,而后者的视角是action。
当formbean被不同的action使用时,对于不同的action而言,使用的formbean的属性集合有大有小。此时如果仍然以formbean为主体,会造成其他action的不正常使用。因此,struts中提出了DynaValidatorActionForm(ValidatorActionForm)。此时在validation.xml中的form标签的name属性改为action的path属性,又由于action中有attribute和name属性,validation框架就可根据这个action得到对应的formbean。
同时注意页面文件的相应控件也要改为action的path属性。例:<html:javascript formName="/selectAction"/>