<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<script>
//补充完成下边的函数,打开新的一个模式窗口
function openShowModalDialog(){
var obj = window;
var params = new Array("aaaa",obj);
var returnValue = window.showModalDialog("DEMO04_01.html",params);
document.getElementById("showContentDiv").innerHTML=returnValue;
}
</script>
</head>
<body>
<h1>模式窗口的使用:</h1>
<h3>补充完成openShowModalDialog函数,打开新的一个模式窗口</h3>
<button onclick="openShowModalDialog();">打开新的模式窗口</button>
<br>
<hr>
<div id="showContentDiv">
</div>
</body>
</html>
DEM004-01.html
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<script>
//补充完成函数,将文本框returnValue的值设置为父窗口返回值,并关闭本窗口
function closeShowModalDialog(){
//获得模式窗体的参数。
var p = window.dialogArguments;
window.returnValue=document.getElementById("returnValue").value;
//设置父窗体的返回值 p[1] 事实上是拿到了父窗体的引用
p[1].returnValue=document.getElementById("returnValue").value;
window.close();
}
</script>
</head>
<body>
<h1>模式窗口的使用:</h1>
<h3>补充完成closeShowModalDialog函数,将文本框returnValue的值设置为父窗口返回值,并关闭本窗口</h3>
<button onclick="closeShowModalDialog();">设置返回值,并关闭窗口</button>
<hr>
窗口的返回值
<input type="text" id="returnValue" value="在这里设置返回值">
</body>
</html>
作者:caoyinghui1986 发表于2008-6-15 12:27:00
原文链接
DEM003.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<frameset rows="70,*" cols="*" framespacing="0" frameborder="yes" style="border:0px">
<frame src="DEMO03_bar.html" name="bar" scrolling="No" noresize="noresize" id="bar"arginwidth="0" marginheight="0" />
<frameset cols="150,*" frameborder="yes" border="1" framespacing="0">
<frame src="DEMO03_menu.html" name="menu" scrolling="No" noresize="noresize" id="menu" marginwidth="0" marginheight="0" />
<frame src="DEMO03_main.html" name="mainFrame" id="main" marginwidth="0" marginheight="0" />
</frameset>
</frameset>
<noframes><body>
</body>
</noframes></html>
DEM003_bar.html
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<script>
//补充完成此函数,用于刷新Menu窗体的页面
function flushMenuFrame(){
//top表示顶级窗口 的 window对象
window.top.menu.location.href="DEMO03_menu.html";
}
//补充完成此函数,将barText文本框的值写入到Main窗口的mainText中去。
function writeValueToMainFrame(){
//parent表示 但前窗口的 上级窗口的 window对象
window.parent.mainFrame.document.getElementById("mainText").value=document.getElementById("barText").value;
}
</script>
</head>
<body>
<center>BAR页面</center>
<button onclick="flushMenuFrame();">刷新框架Menu窗口的页面</button>
Bar页面的文本框:<input type="text" id="barText" value="Bar页面的值1"><button onclick="writeValueToMainFrame();">向Main窗口写值</button>
</body>
</html>
DEMO003_main.html
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
</head>
<body>
<center>Main窗体</center>
<br><br>
Main窗体中的文本框
<input type="text" id="mainText" value="Main页面的值2">
</body>
</html>
作者:caoyinghui1986 发表于2008-6-15 12:24:00
原文链接
实现功能是 用户本地浏览一个图片后(本来要用上传 为简单起见就制作本地测试) 功过Hibernate中向数据库插入图片 并在另一个页面把这个图片显示出来
index.jsp
<body>
<form name="frm" action="imgServlet" method="post">
<input type="file" name="path"/>
<input type="submit" value="提交">
</form>
</body>
一个简单的表单用于浏览图片
Img.java
public class Img implements java.io.Serializable {
// Fields
private Integer id;
private byte[] img;
......
}
Img.hbm.xml
<hibernate-mapping>
<class name="hib.Img" table="img" schema="dbo" >
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="img" type="binary">
<column name="img" not-null="true" />
</property>
</class>
</hibernate-mapping>
servlet中的处理方式 (web.xml 中 <url-pattern>/imgServlet</url-pattern> 对这个servlet的配置)
public void doPostt(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
//PrintWriter out2 = response.getWriter();
//servlet 中 out 对象只可取一次.
//如果要用与输出二进制数据 . 就必须用 OutputStream 对象.
OutputStream out = response.getOutputStream();
request.setCharacterEncoding("UTF-8");
String path = request.getParameter("path");
java.io.File file = new File(path);
InputStream inputStream = new FileInputStream(file);
byte[] buff= new byte[(int) file.length()];
inputStream.read(buff, 0, (int) file.length());
Img img = new Img();
img.setImg(buff);
Session session = HibernateSessionFactory.getSession();
session.save(img);
session.beginTransaction().commit();
String realPath = request.getSession().getServletContext().getRealPath("/");
System.out.println("realPath"+realPath);
System.out.println("path:"+path);
System.out.println("插入成功!!!");
try {
//将图片写入到输出流中
out.write(img.getImg());
} catch (Exception e) {
e.printStackTrace();
}
//request.getRequestDispatcher("show.jsp").forward(request, response);
response.sendRedirect("show.jsp");
out.flush();
out.close();
}
show.jsp
<body>
<img src="imgServlet"/>
</body>
通过提交就可以在 show.jsp看到用户提交的图片并且改图片保存到了数据库
作者:caoyinghui1986 发表于2008-6-6 14:52:00
原文链接
每次在CSDN回贴的时候都会遇到好多关于连接池的贴。自己在测试的时候也发现这个东西,有时候确实比较麻烦。干脆就花了一点时间把他们总结了
一下.
我机器的环境是 Eclipse3.2 + tomcate5.5+ JDK1.5 +sqlserver2000
测试前 首先要确保 sql2000 打了spk3,spk4补丁包。
struts中c3p0 连接池的配置。
<data-sources >
<data-source key="ds" type="com.mchange.v2.c3p0.ComboPooledDataSource">
<set-property property="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
<set-property property="url" value="jdbc:microsoft:sqlserver://localhost:1433;databasename=pubs" />
<set-property property="maxCount" value="10"/>
<set-property property="minCount" value="1"/>
<set-property property="username" value="sa" />
<set-property property="password" value="" />
</data-source>
Action中获得这个连接的方式。
DataSource ds = this.getDataSource(request,"ds");
struts中dbcp 连接池的配置
<data-source key="dsDBCP" type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver" />
<set-property property="url" value="jdbc:microsoft:sqlserver://localhost:1433;databasename=pubs" />
<set-property property="maxCount" value="10"/>
<set-property property="minCount" value="1"/>
<set-property property="username" value="sa" />
<set-property property="password" value="" />
</data-source>
使用 dbcp 连接池 时除了要注意 导入必要的 3个连接池驱动包外 还要引入sql的三个驱动包。
-------------------------------------------------------------------------------------------------------------------------------
Spring中dbcp 连接池的配置
jdbc.properties
jdbc.driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc.url=jdbc:microsoft:sqlserver://localhost:1433;databasename=pubs
jdbc.username=sa
jdbc.password=
jdbc.properties 文件来定义连接信息。
在 dbcpPoolBean.xml文件中的bean配置。
<bean id="aa" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- 对与单个文件 这里可以直接用 location属性 然后给一个 value单值 原因是因为在其 父类的实现中
PropertiesLoaderSupport 有个 setLocation方法.
public void setLocation(Resource location) {
this.locations = new Resource[] {location};
}
public void setLocations(Resource[] locations) {
this.locations = locations;
}
所以单个文件可以简单的用 location对应一个 值(value)
-->
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="password" value="${jdbc.password}"/>
<property name="username" value="${jdbc.username}"/>
</bean>
客户段可以通过
ApplicationContext ctx = new ClassPathXmlApplicationContext("dbcpPoolBean.xml");
DataSource ds = (org.apache.commons.dbcp.BasicDataSource )ctx.getBean("dataSource");
来获得数据源。当然在web开发中可以通过容器自动注入。
----------------------------------------------------------------------------------------------------------------------------
Tocmate5.5中配置数据源:
自己在配置这个东西的时候搞了好久 ,最后还是求助 CSDN解决的
贴子http://topic.csdn.net/u/20080605/20/7fdd0eee-9c43-428a-8b82-5db9a1968151.html
总结下几个需要注意的地方:
1,首先在 tomcate 的server.xml文件中正确配置
2,要将相关的驱动包(sql的和连接池的)copy到 C:/Tomcat 5.5/common/lib(我的tomcate在c盘)
server.xml中的配置信息:
<Context path="/testPool"
docBase="F:/Exercise/Newer/tomcatePool/WebRoot"
debug="5"
reloadable="true"
crossContext="true">
<Resource name="jdbc/userDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
username="sa"
password=""
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
maxActive="100"
maxIdle="1000"
maxWait="5000"/>
</Context>
读取连接池的方法:
try{
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/userDB");
//可以获得 ds
System.out.println(ds);
Connection con = ds.getConnection();
System.out.println("我的到了连接拉:"+con);
//out.println( ds.getConnection());
}catch(Exception ex){
ex.printStackTrace();
}
通过这两步配置后你就可以用 http://localhost:8080/testPool/来访问 你的资源 testPool 是你在 <Context path="/testPool"/> 中path的值匹配
如果你吧你的项目部署到tomcate还是不能获得连接。 这是你要在 C:/Tomcat 5.5/conf/Catalina/localhost 下新建一个xml 文件 (tomcatePool.xml)
tomcatePool 是你的当前项目的名字。
这样就可以通过 http://localhost:8080/tomcatePool/ 来访问你的资源了。这时 server.xml文件中就可以不配置。
tomcatePool.xml
<Context path=""
docBase=""
debug="5"
reloadable="true"
crossContext="true">
<Resource name="jdbc/userDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.commons.dbcp.BasicDataSourceFactory"
username="sa"
password=""
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
maxActive="100"
maxIdle="1000"
maxWait="5000"/>
</Context>
注意path和docBase 因为是通过项目名来访问的所以这两个值没有意义。
------------------------------------------------------------------------------------------------------------------------------
hibernate 中获得容器(tomcate)中的数据源。
只要加 一个配置。
hibernate.cfg.xml文件
<property name="connection.datasource">java:comp/env/jdbc/userDB</property>
有了这个后
<!-- <property name="connection.username">sa</property>-->
<!-- <property name="connection.url">-->
<!-- jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=temp-->
<!-- </property>-->
<!-- <property name="myeclipse.connection.profile">sql2000</property>-->
<!-- <property name="connection.driver_class">-->
<!-- com.microsoft.jdbc.sqlserver.SQLServerDriver -->
<!-- </property>-->
这些就可以注释掉呢。
另外测试中发现 .hbm.xml 文件中的 catalog="temp" 属性可以覆盖 数据源中
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs" 这里配置的数据库名称。
****************************************************************************************************
目前就只做了这么多 以后遇到了新的再来补充.
作者:caoyinghui1986 发表于2008-6-6 14:28:00
原文链接
Hibernate映射类型对照表
java类型 |
Hibernate映射类型 |
SQL类型 |
java.math.BigDecimal |
big_decimal |
numeric |
byte[] |
binary |
varbinary(blob) |
boolean(java.lang.Boolean) |
boolean |
bit |
byte(java.lang.Byte) |
byte |
tinyint |
java.util.Calendar |
calendar |
timestamp |
java.sql.Clob |
clob |
clob |
java.util.Date 或java.sql.Date |
date |
date |
double(java.lang.Double) |
double |
double |
float(java.lang.Float) |
float |
float |
int (java.lang.Integer) |
integer |
integer |
java.util.Local |
local |
varchar |
long(java.lang.Long) |
long |
bigint |
java.io.Serializable的某个实例 |
serializable |
varbinary(或blob) |
java.lang.String |
string |
varchar |
java.lang.String |
text |
clob |
java.util.Date 或 java.sql.Timestamp |
time |
timestamp |
从书上把这个表抄下来方便以后查阅.
考虑到 操作 blob 的字段太复杂 一个变换的技巧是 . 实体类用 byte[] 类型 , hibernate 类型用 binary ,数据库还是用 blob .这样 可以简化一些操作.
作者:caoyinghui1986 发表于2008-6-4 20:56:00
原文链接
Spring 和 struts 整合的三种方式。
1,使用Spring 的 ActionSupport
2, 使用Spring 的 DelegatingRequestProcessor 类。
3,全权委托。
无论用那种方法来整合第一步就是要为struts来装载spring的应用环境。 就是在 struts 中加入一个插件。
struts-config.xml中
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>
spring 的配置文件被作为参数配置进来。这样可以省略对web.xml 文件中的配置。确保你的applicationContext.xml 在WEB-INF目录下面
1,使用Spring的ActionSupport .
Spring 的ActionSupport 继承至 org.apache.struts.action.Action
ActionSupport的子类可以或得 WebApplicationContext类型的全局变量。通过getWebApplicationContext()可以获得这个变量。
这是一个 servlet 的代码:
public class LoginAction extends org.springframework.web.struts.ActionSupport {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
//获得 WebApplicationContext 对象
WebApplicationContext ctx = this.getWebApplicationContext();
LoginDao dao = (LoginDao) ctx.getBean("loginDao");
User u = new User();
u.setName(loginForm.getName());
u.setPwd(loginForm.getPwd());
if(dao.checkLogin(u)){
return mapping.findForward("success");
}else{
return mapping.findForward("error");
}
}
}
applicationContext.xml 中的配置
<beans>
<bean id="loginDao" class="com.cao.dao.LoginDao"/>
</beans>
这中配置方式同直接在web.xml文件配置差别不大。注意:Action继承自 org.springframework.web.struts.ActionSupport 使得struts和spring耦合在一起。
但实现了表示层和业务逻辑层的解耦(LoginDao dao = (LoginDao) ctx.getBean("loginDao"))。
2,使用Spring 的 DelegatingRequestProcessor 类
DelegatingRequestProcessor 继承自 org.apache.struts.action.RequestProcessor 并覆盖了里面的方法。
sturts-config.xml 中 <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/> 通过 <controller >来替代
org.apache.struts.action.RequestProcessor 的请求处理。
public class LoginAction extends Action {
//利用spring来注入这个对象。
private LoginDao dao ;
public void setDao(LoginDao dao) {
System.out.println("执行注入");
this.dao = dao;
}
public LoginDao getDao() {
return dao;
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
//这样一改这行代码似乎没有必要了。
//WebApplicationContext ctx = this.getWebApplicationContext();
//LoginDao dao = (LoginDao) ctx.getBean("loginDao");
User u = new User();
u.setName(loginForm.getName());
u.setPwd(loginForm.getPwd());
//直接用dao来调用spring会将这个对象实例化。
if(dao.checkLogin(u)){
return mapping.findForward("success");
}else{
return mapping.findForward("error");
}
}
}
这里的。
LoginAction extends Action 说明 struts 每有和spring 耦合。
看一下
applicationContext.xml 中的配置。
<beans>
<bean id="loginDao" class="com.cao.dao.LoginDao"/>
<bean name="/login" class="com.cao.struts.action.LoginAction">
<property name="dao">
<ref local="loginDao"/>
</property>
</bean>
</beans>
这里 name="/login" 与struts 中的path匹配
class="com.cao.struts.action.LoginAction" 与struts 中的type匹配
还要为 LoginAction 提供必要的setXXX方法。 获得ApplicationCotext和依赖注入的工作都在DelegatingRequestProcessor中完成。
3,全权委托:
Action 的创建和对象的依赖注入全部由IOC容器来完成。 使用Spring的DelegatingAcionProxy来帮助实现代理的工作
org.springframework.web.struts.DelegatingActiongProxy继承于org.apache.struts.action.Action .
全权委托的配置方式同 方式 2 类似 (applcationContext.xml文件的配置和 Action类的实现方式相同)。
<struts-config>
<data-sources />
<form-beans >
<form-bean name="loginForm" type="com.cao.struts.form.LoginForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<!-- type指向的是spring 的代理类 -->
<action
attribute="loginForm"
input="login.jsp"
name="loginForm"
path="/login"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy" >
<forward name="success" path="/ok.jsp" />
<forward name="error" path="/error.jsp" />
</action>
</action-mappings>
<message-resources parameter="com.cao.struts.ApplicationResources" />
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>
</struts-config>
不同之处
1, <action>中 type指向的是spring 的代理类
2, 去掉struts-config.xml中 <controller >
三种整和方式中我们优先选用 全权委托的方式。
理由:
1,第一种使得过多的耦合了Spring和Action .
2,RequestProcessor类已经被代理 如果要再实现自己的实现方式(如:编码处理)怕有点麻烦。
总结一下:
整合工作中的步骤:
1,修改struts-config.xml
2, 配置applicationContext.xml
3, 为Action添加get/set方法 来获得依赖注入的功能。
作者:caoyinghui1986 发表于2008-6-2 6:16:00
原文链接
1,通过Listener加载ApplicationContext
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
-----------------------------------------------------------------------------------------------------------------------------------------
通过Servlet加载ApplicationContext
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>SpringContextServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
-------------------------------------------------------------------------------------------------------------------------------------------
两种加载方式中要特别注意 路径问题。
<param-value>/WEB-INF/applicationContext.xml</param-value>
其中要确保你的 WEB-INF 下 有 applicationContext.xml 这个文件
测试发现WEB-INF区分大小写。 空格好象没有发现问题。
Listener 接口 是在 servelt2.3 版本被引入的 我机器的配置是Eclipse3.2 +Tomcate5.0+JDK1.5
使用这个没有问题。
还有一个 applicationContext.xml 如果放在 WEB-INF目录外似乎在这里
哪怕是改成相应的路径好象也访问不到。
servlet中可以通过
ApplicationContext context = org.springframework.web.context.support.WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
得到 context 对象。
作者:caoyinghui1986 发表于2008-6-1 15:52:00
原文链接
calendar.js
--------------------------------------------------------------------------------
<!--
document.write("<div id=meizzCalendarLayer style='position: absolute; z-index: 9999; width: 144; height: 193; display: none'>");
document.write("<iframe name=meizzCalendarIframe scrolling=no frameborder=0 width=100% height=100%></iframe></div>");
function writeIframe()
{
var strIframe = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=gb2312'><style>"+
"*{font-size: 12px; font-family: 宋体}"+
".bg{ color: "+ WebCalendar.lightColor +"; cursor: default; background-color: "+ WebCalendar.darkColor +";}"+
"table#tableMain{ width: 142; height: 180;}"+
"table#tableWeek td{ color: "+ WebCalendar.lightColor +";}"+
"table#tableDay td{ font-weight: bold;}"+
"td#meizzYearHead, td#meizzYearMonth{color: "+ WebCalendar.wordColor +"}"+
".out { text-align: center; border-top: 1px solid "+ WebCalendar.DarkBorder +"; border-left: 1px solid "+ WebCalendar.DarkBorder +";"+
"border-right: 1px solid "+ WebCalendar.lightColor +"; border-bottom: 1px solid "+ WebCalendar.lightColor +";}"+
".over{ text-align: center; border-top: 1px solid #FFFFFF; border-left: 1px solid #FFFFFF;"+
"border-bottom: 1px solid "+ WebCalendar.DarkBorder +"; border-right: 1px solid "+ WebCalendar.DarkBorder +"}"+
"input{ border: 1px solid "+ WebCalendar.darkColor +"; padding-top: 1px; height: 18; cursor: hand;"+
" color:"+ WebCalendar.wordColor +"; background-color: "+ WebCalendar.btnBgColor +"}"+
"</style></head><body onselectstart='return false' style='margin: 0px' oncontextmenu='return false'><form name=meizz>";
if (WebCalendar.drag){ strIframe += "<scr"+"ipt language=javascript>"+
"var drag=false, cx=0, cy=0, o = parent.WebCalendar.calendar; function document.onmousemove(){"+
"if(parent.WebCalendar.drag && drag){if(o.style.left=='')o.style.left=0; if(o.style.top=='')o.style.top=0;"+
"o.style.left = parseInt(o.style.left) + window.event.clientX-cx;"+
"o.style.top = parseInt(o.style.top) + window.event.clientY-cy;}}"+
"function document.onkeydown(){ switch(window.event.keyCode){ case 27 : parent.hiddenCalendar(); break;"+
"case 37 : parent.prevM(); break; case 38 : parent.prevY(); break; case 39 : parent.nextM(); break; case 40 : parent.nextY(); break;"+
"case 84 : document.forms[0].today.click(); break;} window.event.keyCode = 0; window.event.returnValue= false;}"+
"function dragStart(){cx=window.event.clientX; cy=window.event.clientY; drag=true;}</scr"+"ipt>"}
strIframe += "<select name=tmpYearSelect onblur='parent.hiddenSelect(this)' style='z-index:1;position:absolute;top:3;left:18;display:none'"+
" onchange='parent.WebCalendar.thisYear =this.value; parent.hiddenSelect(this); parent.writeCalendar();'></select>"+
"<select name=tmpMonthSelect onblur='parent.hiddenSelect(this)' style='z-index:1; position:absolute;top:3;left:74;display:none'"+
" onchange='parent.WebCalendar.thisMonth=this.value; parent.hiddenSelect(this); parent.writeCalendar();'></select>"+
"<table id=tableMain class=bg border=0 cellspacing=2 cellpadding=0>"+
"<tr><td width=140 height=19 bgcolor='"+ WebCalendar.lightColor +"'>"+
" <table width=140 id=tableHead border=0 cellspacing=1 cellpadding=0><tr align=center>"+
" <td width=15 height=19 class=bg title='向前翻 1 月 快捷键:←' style='cursor: hand' onclick='parent.prevM()'><b><</b></td>"+
" <td width=60 id=meizzYearHead title='点击此处选择年份' onclick='parent.funYearSelect(parseInt(this.innerText, 10))'"+
" onmouseover='this.bgColor=parent.WebCalendar.darkColor; this.style.color=parent.WebCalendar.lightColor'"+
" onmouseout='this.bgColor=parent.WebCalendar.lightColor; this.style.color=parent.WebCalendar.wordColor'></td>"+
" <td width=50 id=meizzYearMonth title='点击此处选择月份' onclick='parent.funMonthSelect(parseInt(this.innerText, 10))'"+
" onmouseover='this.bgColor=parent.WebCalendar.darkColor; this.style.color=parent.WebCalendar.lightColor'"+
" onmouseout='this.bgColor=parent.WebCalendar.lightColor; this.style.color=parent.WebCalendar.wordColor'></td>"+
" <td width=15 class=bg title='向后翻 1 月 快捷键:→' onclick='parent.nextM()' style='cursor: hand'><b>></b></td></tr></table>"+
"</td></tr><tr><td height=20><table id=tableWeek border=1 width=140 cellpadding=0 cellspacing=0 ";
if(WebCalendar.drag){strIframe += "onmousedown='dragStart()' onmouseup='drag=false' onmouseout='drag=false'";}
strIframe += " borderColorLight='"+ WebCalendar.darkColor +"' borderColorDark='"+ WebCalendar.lightColor +"'>"+
" <tr align=center><td height=20>日</td><td>一</td><td>二</td><td>三</td><td>四</td><td>五</td><td>六</td></tr></table>"+
"</td></tr><tr><td valign=top width=140 bgcolor='"+ WebCalendar.lightColor +"'>"+
" <table id=tableDay height=120 width=140 border=0 cellspacing=1 cellpadding=0>";
for(var x=0; x<5; x++){ strIframe += "<tr>";
for(var y=0; y<7; y++) strIframe += "<td class=out id='meizzDay"+ (x*7+y) +"'></td>"; strIframe += "</tr>";}
strIframe += "<tr>";
for(var x=35; x<39; x++) strIframe += "<td class=out id='meizzDay"+ x +"'></td>";
strIframe +="<td colspan=3 class=out title='"+ WebCalendar.regInfo +"'><input style=' background-color: "+
WebCalendar.btnBgColor +";cursor: hand; padding-top: 4px; width: 100%; height: 100%; border: 0' onfocus='this.blur()'"+
" type=button value=' 关闭' onclick='parent.hiddenCalendar()'></td></tr></table>"+
"</td></tr><tr><td height=20 width=140 bgcolor='"+ WebCalendar.lightColor +"'>"+
" <table border=0 cellpadding=1 cellspacing=0 width=140>"+
" <tr><td><input name=prevYear title='向前翻 1 年 快捷键:↑' onclick='parent.prevY()' type=button value='<<'"+
" onfocus='this.blur()' style='meizz:expression(this.disabled=parent.WebCalendar.thisYear==1000)'><input"+
" onfocus='this.blur()' name=prevMonth title='向前翻 1 月 快捷键:←' onclick='parent.prevM()' type=button value='< '>"+
" </td><td align=center><input name=today type=button value='Today' onfocus='this.blur()' style='width: 50' title='当前日期 快捷键:T'"+
" onclick=/"parent.returnDate(new Date().getDate() +'/'+ (new Date().getMonth() +1) +'/'+ new Date().getFullYear())/">"+
" </td><td align=right><input title='向后翻 1 月 快捷键:→' name=nextMonth onclick='parent.nextM()' type=button value=' >'"+
" onfocus='this.blur()'><input name=nextYear title='向后翻 1 年 快捷键:↓' onclick='parent.nextY()' type=button value='>>'"+
" onfocus='this.blur()' style='meizz:expression(this.disabled=parent.WebCalendar.thisYear==9999)'></td></tr></table>"+
"</td></tr><table></form></body></html>";
with(WebCalendar.iframe)
{
document.writeln(strIframe); document.close();
for(var i=0; i<39; i++)
{
WebCalendar.dayObj[i] = eval("meizzDay"+ i);
WebCalendar.dayObj[i].onmouseover = dayMouseOver;
WebCalendar.dayObj[i].onmouseout = dayMouseOut;
WebCalendar.dayObj[i].onclick = returnDate;
}
}
}
function WebCalendar() //初始化日历的设置
{
this.regInfo = "WEB Calendar ver 3.0 作者:meizz(梅花雪疏影横斜) 网站:http://www.meizz.com/ 关闭的快捷键:[Esc]";
this.regInfo += " Ver 2.0:walkingpoison(水晶龙) Ver 1.0:meizz(梅花雪疏影横斜)";
this.daysMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
this.day = new Array(39); //定义日历展示用的数组
this.dayObj = new Array(39); //定义日期展示控件数组
this.dateStyle = null; //保存格式化后日期数组
this.objExport = null; //日历回传的显示控件
this.eventSrc = null; //日历显示的触发控件
this.inputDate = null; //转化外的输入的日期(d/m/yyyy)
this.thisYear = new Date().getFullYear(); //定义年的变量的初始值
this.thisMonth = new Date().getMonth()+ 1; //定义月的变量的初始值
this.thisDay = new Date().getDate(); //定义日的变量的初始值
this.today = this.thisDay +"/"+ this.thisMonth +"/"+ this.thisYear; //今天(d/m/yyyy)
this.iframe = window.frames("meizzCalendarIframe"); //日历的 iframe 载体
this.calendar = getObjectById("meizzCalendarLayer"); //日历的层
this.dateReg = ""; //日历格式验证的正则式
this.yearFall = 50; //定义年下拉框的年差值
this.format = "yyyy-mm-dd"; //回传日期的格式
this.timeShow = false; //是否返回时间
this.drag = true; //是否允许拖动
this.darkColor = "#FF6347"; //控件的暗色
this.lightColor = "#FFFFFF"; //控件的亮色
this.btnBgColor = "#FFF5A0"; //控件的按钮背景色
this.wordColor = "#000040"; //控件的文字颜色
this.wordDark = "#DCDCDC"; //控件的暗文字颜色
this.dayBgColor = "#FFFACD"; //日期数字背景色
this.todayColor = "#FF9933"; //今天在日历上的标示背景色
this.DarkBorder = "#FFE4C4"; //日期显示的立体表达色
} var WebCalendar = new WebCalendar();
function calendar() //主调函数
{
var e = window.event.srcElement; writeIframe();
var o = WebCalendar.calendar.style; WebCalendar.eventSrc = e;
if (arguments.length == 0) WebCalendar.objExport = e;
else WebCalendar.objExport = eval(arguments[0]);
WebCalendar.iframe.tableWeek.style.cursor = WebCalendar.drag ? "move" : "default";
var t = e.offsetTop, h = e.clientHeight, l = e.offsetLeft, p = e.type;
while (e = e.offsetParent){t += e.offsetTop; l += e.offsetLeft;}
o.display = ""; WebCalendar.iframe.document.body.focus();
var cw = WebCalendar.calendar.clientWidth, ch = WebCalendar.calendar.clientHeight;
var dw = document.body.clientWidth, dl = document.body.scrollLeft, dt = document.body.scrollTop;
if (document.body.clientHeight + dt - t - h >= ch) o.top = (p=="image")? t + h : t + h + 6;
else o.top = (t - dt < ch) ? ((p=="image")? t + h : t + h + 6) : t - ch;
if (dw + dl - l >= cw) o.left = l; else o.left = (dw >= cw) ? dw - cw + dl : dl;
if (!WebCalendar.timeShow) WebCalendar.dateReg = /^(/d{1,4})(-|//|.)(/d{1,2})/2(/d{1,2})$/;
else WebCalendar.dateReg = /^(/d{1,4})(-|//|.)(/d{1,2})/2(/d{1,2}) (/d{1,2}):(/d{1,2}):(/d{1,2})$/;
try{
if (WebCalendar.objExport.value.trim() != ""){
WebCalendar.dateStyle = WebCalendar.objExport.value.trim().match(WebCalendar.dateReg);
if (WebCalendar.dateStyle == null)
{
WebCalendar.thisYear = new Date().getFullYear();
WebCalendar.thisMonth = new Date().getMonth()+ 1;
WebCalendar.thisDay = new Date().getDate();
alert("原文本框里的日期有错误!/n可能与你定义的显示时分秒有冲突!");
writeCalendar(); return false;
}
else
{
WebCalendar.thisYear = parseInt(WebCalendar.dateStyle[1], 10);
WebCalendar.thisMonth = parseInt(WebCalendar.dateStyle[3], 10);
WebCalendar.thisDay = parseInt(WebCalendar.dateStyle[4], 10);
WebCalendar.inputDate = parseInt(WebCalendar.thisDay, 10) +"/"+ parseInt(WebCalendar.thisMonth, 10) +"/"+
parseInt(WebCalendar.thisYear, 10); writeCalendar();
}
} else writeCalendar();
} catch(e){writeCalendar();}
}
function funMonthSelect() //月份的下拉框
{
var m = isNaN(parseInt(WebCalendar.thisMonth, 10)) ? new Date().getMonth() + 1 : parseInt(WebCalendar.thisMonth);
var e = WebCalendar.iframe.document.forms[0].tmpMonthSelect;
for (var i=1; i<13; i++) e.options.add(new Option(i +"月", i));
e.style.display = ""; e.value = m; e.focus(); window.status = e.style.top;
}
function funYearSelect() //年份的下拉框
{
var n = WebCalendar.yearFall;
var e = WebCalendar.iframe.document.forms[0].tmpYearSelect;
var y = isNaN(parseInt(WebCalendar.thisYear, 10)) ? new Date().getFullYear() : parseInt(WebCalendar.thisYear);
y = (y <= 1000)? 1000 : ((y >= 9999)? 9999 : y);
var min = (y - n >= 1000) ? y - n : 1000;
var max = (y + n <= 9999) ? y + n : 9999;
min = (max == 9999) ? max-n*2 : min;
max = (min == 1000) ? min+n*2 : max;
for (var i=min; i<=max; i++) e.options.add(new Option(i +"年", i));
e.style.display = ""; e.value = y; e.focus();
}
function prevM() //往前翻月份
{
WebCalendar.thisDay = 1;
if (WebCalendar.thisMonth==1)
{
WebCalendar.thisYear--;
WebCalendar.thisMonth=13;
}
WebCalendar.thisMonth--; writeCalendar();
}
function nextM() //往后翻月份
{
WebCalendar.thisDay = 1;
if (WebCalendar.thisMonth==12)
{
WebCalendar.thisYear++;
WebCalendar.thisMonth=0;
}
WebCalendar.thisMonth++; writeCalendar();
}
function prevY(){WebCalendar.thisDay = 1; WebCalendar.thisYear--; writeCalendar();}//往前翻 Year
function nextY(){WebCalendar.thisDay = 1; WebCalendar.thisYear++; writeCalendar();}//往后翻 Year
function hiddenSelect(e){for(var i=e.options.length; i>-1; i--)e.options.remove(i); e.style.display="none";}
function getObjectById(id){ if(document.all) return(eval("document.all."+ id)); return(eval(id)); }
function hiddenCalendar(){getObjectById("meizzCalendarLayer").style.display = "none";};
function appendZero(n){return(("00"+ n).substr(("00"+ n).length-2));}//日期自动补零程序
function String.prototype.trim(){return this.replace(/(^/s*)|(/s*$)/g,"");}
function dayMouseOver()
{
this.className = "over";
this.style.backgroundColor = WebCalendar.darkColor;
if(WebCalendar.day[this.id.substr(8)].split("/")[1] == WebCalendar.thisMonth)
this.style.color = WebCalendar.lightColor;
}
function dayMouseOut()
{
this.className = "out"; var d = WebCalendar.day[this.id.substr(8)], a = d.split("/");
this.style.removeAttribute('backgroundColor');
if(a[1] == WebCalendar.thisMonth && d != WebCalendar.today)
{
if(WebCalendar.dateStyle && a[0] == parseInt(WebCalendar.dateStyle[4], 10))
this.style.color = WebCalendar.lightColor;
this.style.color = WebCalendar.wordColor;
}
}
function writeCalendar() //对日历显示的数据的处理程序
{
var y = WebCalendar.thisYear;
var m = WebCalendar.thisMonth;
var d = WebCalendar.thisDay;
WebCalendar.daysMonth[1] = (0==y%4 && (y%100!=0 || y%400==0)) ? 29 : 28;
if (!(y<=9999 && y >= 1000 && parseInt(m, 10)>0 && parseInt(m, 10)<13 && parseInt(d, 10)>0)){
alert("对不起,你输入了错误的日期!");
WebCalendar.thisYear = new Date().getFullYear();
WebCalendar.thisMonth = new Date().getMonth()+ 1;
WebCalendar.thisDay = new Date().getDate(); }
y = WebCalendar.thisYear;
m = WebCalendar.thisMonth;
d = WebCalendar.thisDay;
WebCalendar.iframe.meizzYearHead.innerText = y +" 年";
WebCalendar.iframe.meizzYearMonth.innerText = parseInt(m, 10) +" 月";
WebCalendar.daysMonth[1] = (0==y%4 && (y%100!=0 || y%400==0)) ? 29 : 28; //闰年二月为29天
var w = new Date(y, m-1, 1).getDay();
var prevDays = m==1 ? WebCalendar.daysMonth[11] : WebCalendar.daysMonth[m-2];
for(var i=(w-1); i>=0; i--) //这三个 for 循环为日历赋数据源(数组 WebCalendar.day)格式是 d/m/yyyy
{
WebCalendar.day[i] = prevDays +"/"+ (parseInt(m, 10)-1) +"/"+ y;
if(m==1) WebCalendar.day[i] = prevDays +"/"+ 12 +"/"+ (parseInt(y, 10)-1);
prevDays--;
}
for(var i=1; i<=WebCalendar.daysMonth[m-1]; i++) WebCalendar.day[i+w-1] = i +"/"+ m +"/"+ y;
for(var i=1; i<39-w-WebCalendar.daysMonth[m-1]+1; i++)
{
WebCalendar.day[WebCalendar.daysMonth[m-1]+w-1+i] = i +"/"+ (parseInt(m, 10)+1) +"/"+ y;
if(m==12) WebCalendar.day[WebCalendar.daysMonth[m-1]+w-1+i] = i +"/"+ 1 +"/"+ (parseInt(y, 10)+1);
}
for(var i=0; i<39; i++) //这个循环是根据源数组写到日历里显示
{
var a = WebCalendar.day[i].split("/");
WebCalendar.dayObj[i].innerText = a[0];
WebCalendar.dayObj[i].title = a[2] +"-"+ appendZero(a[1]) +"-"+ appendZero(a[0]);
WebCalendar.dayObj[i].bgColor = WebCalendar.dayBgColor;
WebCalendar.dayObj[i].style.color = WebCalendar.wordColor;
if ((i<10 && parseInt(WebCalendar.day[i], 10)>20) || (i>27 && parseInt(WebCalendar.day[i], 10)<12))
WebCalendar.dayObj[i].style.color = WebCalendar.wordDark;
if (WebCalendar.inputDate==WebCalendar.day[i]) //设置输入框里的日期在日历上的颜色
{WebCalendar.dayObj[i].bgColor = WebCalendar.darkColor; WebCalendar.dayObj[i].style.color = WebCalendar.lightColor;}
if (WebCalendar.day[i] == WebCalendar.today) //设置今天在日历上反应出来的颜色
{WebCalendar.dayObj[i].bgColor = WebCalendar.todayColor; WebCalendar.dayObj[i].style.color = WebCalendar.lightColor;}
}
}
function returnDate() //根据日期格式等返回用户选定的日期
{
if(WebCalendar.objExport)
{
var returnValue;
var a = (arguments.length==0) ? WebCalendar.day[this.id.substr(8)].split("/") : arguments[0].split("/");
var d = WebCalendar.format.match(/^(/w{4})(-|//|.|)(/w{1,2})/2(/w{1,2})$/);
if(d==null){alert("你设定的日期输出格式不对!/r/n/r/n请重新定义 WebCalendar.format !"); return false;}
var flag = d[3].length==2 || d[4].length==2; //判断返回的日期格式是否要补零
returnValue = flag ? a[2] +d[2]+ appendZero(a[1]) +d[2]+ appendZero(a[0]) : a[2] +d[2]+ a[1] +d[2]+ a[0];
if(WebCalendar.timeShow)
{
var h = new Date().getHours(), m = new Date().getMinutes(), s = new Date().getSeconds();
returnValue += flag ? " "+ appendZero(h) +":"+ appendZero(m) +":"+ appendZero(s) : " "+ h +":"+ m +":"+ s;
}
WebCalendar.objExport.value = returnValue;
hiddenCalendar();
}
}
function document.onclick()
{
if(WebCalendar.eventSrc != window.event.srcElement) hiddenCalendar();
}
//-->
----------------------------------------------------------------------------------------------------------------------------------------------
<SCRIPT LANGUAGE="JavaScript" src="calendar.js"></SCRIPT>
在你的页面中引入 这个 js 文件
通过onfocus来调用并显示日历
<input type="text" onfocus="calendar()" name="xxx">
当把一个带中文的js文件考到Eclipse工程时候会报编码错误这是 需要点右键 属性 更改编码。然后粘贴就可以
了
如果粘贴出现乱码 http://d.download.csdn.net/down/476931/caoyinghui1986
有完整的JS文件 js文件中出错的地方可以用 <!-- --> 注释. (JBuilder2005不报错 ,Eclipse好象有这个问题)
注释 后就没有事情了。
作者:caoyinghui1986 发表于2008-5-31 17:56:00
原文链接
public class Test {
public static void main(String[] args) {
String str = new String(
"1,2,3,4,5,6,7,8,9,11,13,14,1000,1001,1002,1003");
String[] s = str.split(",");
int[] num = new int[s.length];
String result = "";
for (int i = 0; i < s.length; i++) {
num[i] = Integer.parseInt(s[i]);
}
for (int i = 0; i < num.length; i++) {
if (i == 0) {
result = "" + num[i];
} else if (i == num.length - 1) {
if (num[i] - num[i - 1] == 1) {
result = result + "-" + num[i];
} else {
result = result + "," + num[i];
}
} else {
if ((num[i] - num[i - 1] == 1) && (num[i + 1] - num[i] == 1)) {
continue;
}
if ((num[i] - num[i - 1] == 1) && (num[i + 1] - num[i] != 1)) {
result = result + "-" + num[i];
}
if ((num[i] - num[i - 1] != 1)) {
result = result + "," + num[i];
}
}
}
System.out.println(result);
}
}
作者:caoyinghui1986 发表于2008-5-31 14:11:00
原文链接
Spring通过PropertyEdit(属性编辑器) 可以将字符串转换为真实类型。通过CustomEditorConfigurer ,ApplicationContext 可以很方便的支持自定义
PropertyEdit。
MyType.java
package com.cao.spring.applicationContext;
public class MyType {
private String text;
public MyType(String text){
this.text = text;
}
public String getText(){
return this.text;
}
}
DependsOnType.java
package com.cao.spring.applicationContext;
public class DependsOnType {
private MyType type;
public MyType getType() {
return type;
}
public void setType(MyType type) {
this.type = type;
}
}
//自定义的属性编辑器MyTypeEdit.java
package com.cao.spring.applicationContext;
public class MyTypeEdit extends java.beans.PropertyEditorSupport{
//提供一种对字符串的转换策略
private String format;
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
//覆盖父类(PropertyEditorSupport)的setAsText方法。
public void setAsText(String text) {
if(format!=null && format.equals("upperCase")){
System.out.println("修改前的样子:"+text);
text=text.toUpperCase();
}
//获得编辑前的类型
System.out.println("获得编辑前的类型 "+text.getClass().getSimpleName());
//包装成真实类型
MyType type = new MyType(text);
//注入包装后的类型
setValue(type);
}
}
配置bean propertyEdit.xml
<beans>
<bean id="myBean" class="com.cao.spring.applicationContext.DependsOnType">
<!-- type的真实类型是 MyType 但这里指定的是一个普通的String -->
<property name="type">
<value>abc</value>
</property>
</bean>
</beans>
将属性编辑器配置进来 plugin.xml
<bean id="aaa" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map> <!-- key指定了转换后的类型 -->
<entry key="com.cao.spring.applicationContext.MyType">
<!-- 内部bean 配置了自定义的属性编辑器 -->
<bean class="com.cao.spring.applicationContext.MyTypeEdit">
<!-- 配置字符串的转换策略 -->
<property name="format" value="upperCase"/>
</bean>
</entry>
</map>
</property>
</bean>
测试类:
public class MyEditorTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"application/plugin.xml","application/propertyEdit.xml"});
DependsOnType type= (DependsOnType) ctx.getBean("myBean");
System.out.println(type.getType().getClass().getSimpleName());
System.out.println(type.getType().getText());
}
}
//输出结果:
修改前的样子:abc获得编辑前的类型 StringMyTypeABC
作者:caoyinghui1986 发表于2008-5-30 20:44:00
原文链接