November 2006 Archives

equinox?谁啊?

| No Comments | No TrackBacks

Equinox


Equinox 是AppFuse的一个轻量级版本。Equinox使用Spring MVC与Hibernate作为默认实现(数据库为:PostgreSQL)。但是你可以把Web框架改成JSF, Struts,Tapestry或WebWork。也可以把持久层框改成iBATIS,JDO(JPOX),Spring JDBC或OJB()。同时支持Ant和Maven2进行构建与测试。AppFuse与Equinox的不同之处在于AppFuse有以下特性:
1.使用Acegi Security进行授权和认证;
2.用户管理;
3.为基于增删改查(CRUD)的应用程序自动生成代码;
4.文件上传;
Demo:

Spring · Spring w/ Ajax
JSF
Struts
Tapestry
WebWork
https://equinox.dev.java.net/
 主页 https://equinox.dev.java.net/

用JavaScript实现的日历

| No Comments | No TrackBacks

calendar.css:
.cal {
background-color: #ffffff;
}

.head {
color: #bb0000;
font-family: Arial;
font-weight: bold;
text-align: left;
}

.days {
color: #0000bb;
font-family: Arial;
font-weight: bold;
text-align: right;
}

.grey {
color: #ffffff;
font-family: Arial;
font-size: small;
text-align: right;
}

.links {
color: #ff0000;
font-family: Arial;
font-size: small;
text-align: right;
}

.today {
color: #ffffff;
background-color: #ff0000;
font-family: Arial;
font-size: small;
text-align: right;
}

calendar.js:
'January','February','March',
'April','May','June','July',
'August','September','October',
'November','December'
);

var daysOfMonth = new Array(
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
);

var daysOfMonthLY = new Array(
31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
);

var dow = new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat',
'Sun','Mon','Tue','Wed','Thu','Fri');

var size = 'width="50" height="30"';
var border = 'border="1"';

function isLeapYear(num) {
if (((num % 4 == 0) && (num % 100 != 0)) || (num % 400 == 0))
return true;
return false;
}

function CalendarSelect(Month,Year, offset) {
if (offset == null) offset = 0;

if (window.changeMonth) { }
else {
alert('A changeMonth() function has not been defined');
return '';
}

if (window.changeYear) { }
else {
alert('A changeYear() function has not been defined');
return '';
}

if (window.changeDay) { }
else {
alert('A changeDay() function has not been defined');
return '';
}

var output = '';

output += '<form name="Cal">';
output += CalendarHead(Month,Year,true);
output += CalendarMonth(Month,Year,offset);
output += '</form>';

return output;
}

function CalendarHead(Month,Year,Select) {
var output = '';

output +=
'<table cellspacing="0" class="cal">' +
'<tr><td align="left" width="100%" class="head">' +
moy[Month-1] + ' ' + Year +
'</td>';

if (Select) {

output += '<td width="50%" align="right">' +
'<select name="Month" onChange="CalMonth()">';

for (var month=1; month<=12; month++) {
output += '<option value="' + month + '"';
if (month == Month) output += ' selected';
output += '>' + moy[month-1] + '</option>';
}

output += '</select>' +
'<select name="Year" onChange="CalYear();">';

for (var year=1900; year<=2100; year++) {
output += '<option value="' + year + '"';
if (year == Year) output += ' selected';
output += '>' + year + '</option>';
}

output += '</select>';
}

output += '</td></tr></table>';

return output;
}

function CalendarMonth(M,Y,offset) {
M--;
if (offset == null) offset = 0;

firstDay = new Date(Y,M,1);
startDay = firstDay.getDay();

if (startDay < offset) startDay += 7;

var days = daysOfMonth;
if (isLeapYear(Y)) days = daysOfMonthLY;

var output = '';

output +=
'<table ' + border + ' cellpadding="0" class="cal"><tr>';

for (var i=0; i<7; i++)
output += '<td ' + size + ' class="days">' +
dow[i + offset] + '</td>';

output += '</tr><tr>';

var column = 0;
var lastM = M - 1;
if (lastM == -1) lastM = 11;

for (var i=0+offset; i<startDay; i++, column++)
output += '<td ' + size + ' class="grey">' +
(days[lastM]-startDay+i+1) + '</td>';

for (var i=1; i<=days[M]; i++, column++) {
var style = ' class="links"';
if (day == i && month == M+1 && year == Y)
style = ' class="today"';
if (window.changeDay)
output += '<td ' + size + '>' +
'<a href="javascript:CalDay('+i+','+(M+1)+','+Y+')"' +
style + '>' + i + '</a></td>';
else
output += '<td ' + size + style + '>' + i + '</td>';

if (column == 6) {
output += '</tr><tr>';
column = -1;
}
}

if (column > 0) {
for (var i=1; column<7; i++, column++)
output += '<td ' + size + ' class="grey">' + i + '</td>';
}

output += '</tr></table>';

return output;
}

function getAnOptionValue(what) {
return what.options[what.options.selectedIndex].value;
}

function CalMonth() {
CalendarMonth = getAnOptionValue(document.Cal.Month) - 0;
changeMonth(CalendarMonth);
}

function CalYear() {
CalendarYear = getAnOptionValue(document.Cal.Year) - 0;
changeYear(CalendarYear);
}

function CalDay(day,month,year) {
CalendarDay = day;
CalendarMonth = month;
CalendarYear = year;
changeDay(CalendarDay,CalendarMonth,CalendarYear);
}

var CalendarMonth;
var CalendarYear;
var CalendarDay;

current.js:
function getFullYear() {
var year = this.getYear();
if (year < 1000) year += 1900;
return year;
}

if (!Date.getFullYear)
Date.prototype.getFullYear = getFullYear;

function getMilliseconds() {
var date = new Date(
this.getFullYear(), this.getMonth(), this.getDate(),
this.getHours(), this.getMinutes(), this.getSeconds(), 0
);
return this.getTime() - date.getTime();
}

if (!Date.getMilliseconds)
Date.prototype.getMilliseconds = getMilliseconds;

var daysOfWeek = new Array(
'Sunday','Monday','Tuesday','Wednesday',
'Thursday','Friday','Saturday'
);

var monthsOfYear = new Array(
'January','February','March','April','May','June',
'July','August','September','October','November','December'
);

function y2k(number) {
number = number - 0;
return (number < 1000) ? number + 1900 : number;
}

function dayOfWeek(day,month,year) {
var a = Math.floor((14 - month)/12);
var y = year - a;
var m = month + 12*a - 2;
var d = (day + y + Math.floor(y/4) - Math.floor(y/100) +
Math.floor(y/400) + Math.floor((31*m)/12)) % 7;
return d;
}

function nths(day) {
if (day == 1 || day == 21 || day == 31) return 'st';
if (day == 2 || day == 22) return 'nd';
if (day == 3 || day == 23) return 'rd';
return 'th';
}

function formatFullDate(day,month,year) {
var dow = dayOfWeek(day,month,year);
return daysOfWeek[dow] + ' ' +
day + nths(day) + ' ' +
monthsOfYear[month-1] +' '+ year;
}

function padout(num) {
return (num < 10) ? '0' + num : num;
}

function formatShortDate(day,month,year) {
return padout(day) + '/' + padout(month) + '/' + year;
}

function formatShortDateUS(day,month,year) {
return padout(month) + '/' + padout(day) + '/' + year;
}

index.htm:
<html>

<head>

<title>Calendar</title>

<link rel="stylesheet" href="calendar.css" type="text/css">

<script language="JavaScript" src="current.js"></script>
<script language="JavaScript" src="calendar.js"></script>

</head>

<body bgcolor="#ffffff">

<center>

<script language="JavaScript"><!--
size = '';
border = 'border="0"';
dow = new Array('S','M','T','W','T','F','S',
'S','M','T','W','T','F');
moy = new Array(
'Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec'
);

function changeDay(day, month, year) {
alert(new Date(year, month, day));
}

var output = '';

if (window.formatFullDate && window.CalendarSelect) {
var today = new Date();
var day = today.getDate();
var month = today.getMonth() + 1;
var year = today.getFullYear();

output +=
'<table class="cal" border="1"><tr><td valign="top">';

for (var i = 1; i <= 12; i++) {
output += '<table><tr><td>' +
CalendarHead(i,year) +
CalendarMonth(i,year,1) +
'</td></tr></table>';

if (i != 12) {
if (i % 3 == 0)
output += '</td></tr><tr><td valign="top">';
else
output += '</td><td valign="top">';
}
}

output += '</td></tr></table>';
}

document.write(output);
//--></script>

</center>

</body>

</html>

把这四个文件放在同一目录下。运行index.htm

javaScript小日历

| 1 Comment | No TrackBacks

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Author" content="Jiang Hongbin">
<title>日期选择 - BY ziyue</title>
<script language="JavaScript" type="text/JavaScript">
// 日期选择
// By Ziyue(http://www.web-v.com/)
var months = new Array("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月");
var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var days = new Array("日","一", "二", "三", "四", "五", "六");
var today;

document.writeln("<div id='Calendar' style='position:absolute; z-index:1; visibility: hidden; filter:\"progid:DXImageTransform.Microsoft.Shadow(direction=135,color=#999999,strength=3)\"'></div>");

function getDays(month, year)
{
    //下面的这段代码是判断当前是否是闰年的
    if (1 == month)
        return ((0 == year % 4) && (0 != (year % 100))) || (0 == year % 400) ? 29 : 28;
    else
        return daysInMonth[month];
}

function getToday()
{
    //得到今天的年,月,日
    this.now = new Date();
    this.year = this.now.getFullYear();
    this.month = this.now.getMonth();
    this.day = this.now.getDate();
}

function getStringDay(str)
{
    //得到输入框的年,月,日
    var str=str.split("-")
   
    this.now = new Date(parseFloat(str[0]),parseFloat(str[1])-1,parseFloat(str[2]));
    this.year = this.now.getFullYear();
    this.month = this.now.getMonth();
    this.day = this.now.getDate();
}

function newCalendar() {
    var parseYear = parseInt(document.all.Year.options[document.all.Year.selectedIndex].value);
    var newCal = new Date(parseYear, document.all.Month.selectedIndex, 1);
    var day = -1;
    var startDay = newCal.getDay();
    var daily = 0;
   
    if ((today.year == newCal.getFullYear()) &&(today.month == newCal.getMonth()))
        day = today.day;
       
    var tableCal = document.all.calendar;
    var intDaysInMonth =getDays(newCal.getMonth(), newCal.getFullYear());
    
    for (var intWeek = 1; intWeek < tableCal.rows.length;intWeek++)
        for (var intDay = 0;intDay < tableCal.rows[intWeek].cells.length;intDay++)
        {
            var cell = tableCal.rows[intWeek].cells[intDay];
            if ((intDay == startDay) && (0 == daily))
                daily = 1;
               
            if(day==daily) //今天,调用今天的Class
            {
                cell.style.background='#6699CC';
                cell.style.color='#FFFFFF';
                //cell.style.fontWeight='bold';
            }
            else if(intDay==6) //周六
                cell.style.color='green';
            else if (intDay==0) //周日
                cell.style.color='red';
           
            if ((daily > 0) && (daily <= intDaysInMonth))
            {
                cell.innerText = daily;
                daily++;
            }
            else
                cell.innerText = "";
        }
}

function GetDate(InputBox)
{
    var sDate;
    //这段代码处理鼠标点击的情况
    if (event.srcElement.tagName == "TD")
        if (event.srcElement.innerText != "")
        {
            sDate = document.all.Year.value + "-" + document.all.Month.value + "-" + event.srcElement.innerText;
            eval("document.all."+InputBox).value=sDate;
            HiddenCalendar();
        }
}

function HiddenCalendar()
{
    //关闭选择窗口
    document.all.Calendar.style.visibility='hidden';
}

function ShowCalendar(InputBox)
{
    var x,y,intLoop,intWeeks,intDays;
    var DivContent;
    var year,month,day;
    var o=eval("document.all."+InputBox);
    var thisyear; //真正的今年年份
   
    thisyear=new getToday();
    thisyear=thisyear.year;
   
    today = o.value;
    if(isDate(today))
        today = new getStringDay(today);
    else
        today = new getToday();
   
    //显示的位置
    x=o.offsetLeft;
    y=o.offsetTop;
    while(o=o.offsetParent)
    {
        x+=o.offsetLeft;
        y+=o.offsetTop;
    }
    document.all.Calendar.style.left=x+2;
    document.all.Calendar.style.top=y+20;
    document.all.Calendar.style.visibility="visible";
   
    //下面开始输出日历表格(border-color:#9DBAF7)
    DivContent="<table border='0' cellspacing='0' style='border:1px solid #0066FF; background-color:#EDF2FC'>";
    DivContent+="<tr>";
    DivContent+="<td style='border-bottom:1px solid #0066FF; background-color:#C7D8FA'>";
   
    //年
    DivContent+="<select name='Year' id='Year' onChange='newCalendar()' style='font-family:Verdana; font-size:12px'>";
    for (intLoop = thisyear - 105; intLoop < (thisyear + 106); intLoop++)
        DivContent+="<option value= " + intLoop + " " + (today.year == intLoop ? "Selected" : "") + ">" + intLoop + "</option>";
    DivContent+="</select>";
   
    //月
    DivContent+="<select name='Month' id='Month' onChange='newCalendar()' style='font-family:Verdana; font-size:12px'>";
    for (intLoop = 0; intLoop < months.length; intLoop++)
        DivContent+="<option value= " + (intLoop + 1) + " " + (today.month == intLoop ? "Selected" : "") + ">" + months[intLoop] + "</option>";
    DivContent+="</select>";
   
    DivContent+="</td>";
   
    DivContent+="<td style='border-bottom:1px solid #0066FF; background-color:#C7D8FA; font-weight:bold; font-family:Wingdings 2,Wingdings,Webdings; font-size:16px; padding-top:2px; color:#4477FF; cursor:hand' align='center' title='关闭' onClick='javascript:HiddenCalendar()'>S</td>";
    DivContent+="</tr>";
    
    DivContent+="<tr><td align='center' colspan='2'>";
    DivContent+="<table id='calendar' border='0' width='100%'>";
   
    //星期
    DivContent+="<tr>";
    for (intLoop = 0; intLoop < days.length; intLoop++)
        DivContent+="<td align='center' style='font-size:12px'>" + days[intLoop] + "</td>";
    DivContent+="</tr>";
   
    //天
    for (intWeeks = 0; intWeeks < 6; intWeeks++)
    {
        DivContent+="<tr>";
        for (intDays = 0; intDays < days.length; intDays++)
            DivContent+="<td onClick='GetDate(\"" + InputBox + "\")' style='cursor:hand; border-right:1px solid #BBBBBB; border-bottom:1px solid #BBBBBB; color:#215DC6; font-family:Verdana; font-size:12px' align='center'></td>";
        DivContent+="</tr>";
    }
    DivContent+="</table></td></tr></table>";

    document.all.Calendar.innerHTML=DivContent;
    newCalendar();
}

function isDate(dateStr)
{
    var datePat = /^(\d{4})(\-)(\d{1,2})(\-)(\d{1,2})$/;
    var matchArray = dateStr.match(datePat);
    if (matchArray == null) return false;
    var month = matchArray[3];
    var day = matchArray[5];
    var year = matchArray[1];
    if (month < 1 || month > 12) return false;
    if (day < 1 || day > 31) return false;
    if ((month==4 || month==6 || month==9 || month==11) && day==31) return false;
    if (month == 2)
    {
        var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
        if (day > 29 || (day==29 && !isleap)) return false;
    }
    return true;
}
</script>
<style type="text/css">
<!--
td,input {
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 12px;
}
-->
</style>
</head>

<body>
<form name="form1" method="post" action="">
    <table width="500"  border="0" align="center" cellspacing="1" bgcolor="#CCCCCC">
      <tr bgcolor="#FFFFFF">
          <td align="right">选择日期:</td>
          <td><input name="birthday" type="text" id="birthday" title="点击选择" onClick="javascript:ShowCalendar(this.id)" size="20">
             <input type="button" name="Submit" value="选 择" onClick="javascript:ShowCalendar('birthday')"></td>
           <td>BLOG:<a href="Http://Blog.CSDN.Net/AppleBBS">Http://Blog.CSDN.Net/AppleBBS</a></td>
      </tr>
      </table>
</form>
</body>
</html>

一个JavaScript的日历

| No Comments | No TrackBacks

<Script LANGUAGE="JavaScript">

  var months = new Array("一", "二", "三","四", "五", "六", "七", "八", "九","十", "十一", "十二");


  var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31,30, 31, 30, 31);


  var days = new Array("日","一", "二", "三","四", "五", "六");


  var classTemp;


  var today=new getToday();


  var year=today.year;


  var month=today.month;


  var newCal;


  function getDays(month, year) {


  if (1 == month) return ((0 == year % 4) && (0 != (year % 100))) ||(0 == year % 400) ? 29 : 28;


  else return daysInMonth[month];


  }


  function getToday() {


  this.now = new Date();


  this.year = this.now.getFullYear();


  this.month = this.now.getMonth();


  this.day = this.now.getDate();


  }


  function Calendar() {


  newCal = new Date(year,month,1);


  today = new getToday();


  var day = -1;


  var startDay = newCal.getDay();


  var endDay=getDays(newCal.getMonth(), newCal.getFullYear());


  var daily = 0;


  if ((today.year == newCal.getFullYear()) &&(today.month == newCal.getMonth()))


  {


  day = today.day;


  }


  var caltable = document.all.caltable.tBodies.calendar;


  var intDaysInMonth =getDays(newCal.getMonth(), newCal.getFullYear());


  for (var intWeek = 0; intWeek < caltable.rows.length;intWeek++)


  for (var intDay = 0;intDay < caltable.rows[intWeek].cells.length;intDay++)


  {


  var cell = caltable.rows[intWeek].cells[intDay];


  var montemp=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1);


  if ((intDay == startDay) && (0 == daily)){ daily = 1;}


  var daytemp=daily<10?("0"+daily):(daily);


  var d="<"+newCal.getFullYear()+"-"+montemp+"-"+daytemp+">";


  if(day==daily) cell.className="DayNow";


  else if(intDay==6) cell.className = "DaySat";


  else if (intDay==0) cell.className ="DaySun";


  else cell.className="Day";


  if ((daily > 0) && (daily <= intDaysInMonth))


  {


  cell.innerText = daily;


  daily++;


  } else


  {


  cell.className="CalendarTD";


  cell.innerText = "";


  }


  }


  document.all.year.value=year;


  document.all.month.value=month+1;


  }


  function subMonth()


  {


  if ((month-1)<0)


  {


  month=11;


  year=year-1;


  } else


  {


  month=month-1;


  }


  Calendar();


  }


  function addMonth()


  {


  if((month+1)>11)


  {


  month=0;


  year=year+1;


  } else


  {


  month=month+1;


  }


  Calendar();


  }


  function setDate()


  {


  if (document.all.month.value<1||document.all.month.value>12)


  {


  alert("月的有效范围在1-12之间!");


  return;


  }


  year=Math.ceil(document.all.year.value);


  month=Math.ceil(document.all.month.value-1);


  Calendar();


  }


  </Script>


  <Script>


  function buttonOver()


  {


  var obj = window.event.srcElement;


  obj.runtimeStyle.cssText = "background-color:#FFFFFF";


  // obj.className="Hover";


  }


  function buttonOut()


  {


  var obj = window.event.srcElement;


  window.setTimeout(function(){obj.runtimeStyle.cssText = "";},300);


  }


  </Script>


  <Style>


  Input {font-family: verdana;font-size: 9pt;text-decoration: none;background-color: #FFFFFF;height: 20px;border: 1px solid #666666;color:#000000;}


  .Calendar {font-family: verdana;text-decoration: none;width: 170;background-color: #C0D0E8;font-size: 9pt;border:0px dotted #1C6FA5;}


  .CalendarTD {font-family: verdana;font-size: 7pt;color: #000000;background-color:#f6f6f6;height: 20px;width:11%;text-align: center;}


  .Title {font-family: verdana;font-size: 11pt;font-weight: normal;height: 24px;text-align: center;color: #333333;text-decoration: none;background-color: #A4B9D7;border-top-width: 1px;border-right-width: 1px;border-bottom-width: 1px;border-left-width: 1px;border-bottom-style:1px;border-top-color: #999999;border-right-color: #999999;border-bottom-color: #999999;border-left-color: #999999;}


  .Day {font-family: verdana;font-size: 7pt;color:#243F65;background-color: #E5E9F2;height: 20px;width:11%;text-align: center;}


  .DaySat {font-family: verdana;font-size: 7pt;color:#FF0000;text-decoration: none;background-color:#E5E9F2;text-align: center;height: 18px;width: 12%;}


  .DaySun {font-family: verdana;font-size: 7pt;color: #FF0000;text-decoration: none;background-color:#E5E9F2;text-align: center;height: 18px;width: 12%;}


  .DayNow {font-family: verdana;font-size: 7pt;font-weight: bold;color: #000000;background-color: #FFFFFF;height: 20px;text-align: center;}


  .DayTitle {font-family: verdana;font-size: 9pt;color: #000000;background-color: #C0D0E8;height: 20px;width:11%;text-align: center;}


  .DaySatTitle {font-family: verdana;font-size: 9pt;color:#FF0000;text-decoration: none;background-color:#C0D0E8;text-align: center;height: 20px;width: 12%;}


  .DaySunTitle {font-family: verdana;font-size: 9pt;color: #FF0000;text-decoration: none;background-color: #C0D0E8;text-align: center;height: 20px;width: 12%;}


  .DayButton {font-family: Webdings;font-size: 9pt;font-weight: bold;color: #243F65;cursor:hand;text-decoration: none;}


  </Style>


  <table border="0" cellpadding="0" cellspacing="1" class="Calendar" id="caltable">


  <thead>


  <tr align="center" valign="middle">


  <td colspan="7" class="Title">


  <a href="javaScript:subMonth();" title="上一月" Class="DayButton">3</a> <input name="year" type="text" size="4" maxlength="4" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,')" onpaste="this.value=this.value.replace(/[^0-9]/g,')"> 年 <input name="month" type="text" size="1" maxlength="2" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,')" onpaste="this.value=this.value.replace(/[^0-9]/g,')"> 月 <a href="JavaScript:addMonth();" title="下一月" Class="DayButton">4</a>


  </td>


  </tr>


  <tr align="center" valign="middle">


  <Script LANGUAGE="JavaScript">


  document.write("<TD class=DaySunTitle id=diary >" + days[0] + "</TD>");


  for (var intLoop = 1; intLoop < days.length-1;intLoop++)


  document.write("<TD class=DayTitle id=diary>" + days[intLoop] + "</TD>");


  document.write("<TD class=DaySatTitle id=diary>" + days[intLoop] + "</TD>");


  </Script>


  </TR>


  </thead>


  <TBODY border=1 cellspacing="0" cellpadding="0" ID="calendar" ALIGN=CENTER ONCLICK="getDiary()">


  <Script LANGUAGE="JavaScript">


  for (var intWeeks = 0; intWeeks < 6; intWeeks++)


  {


  document.write("<TR style='cursor:hand'>");


  for (var intDays = 0; intDays < days.length;intDays++) document.write("<TD class=CalendarTD onMouseover='buttonOver();' onMouseOut='buttonOut();'></TD>");


  document.write("</TR>");


  }


  </Script>


  </TBODY>


  </TABLE>


  <Script LANGUAGE="JavaScript">


  Calendar();


  </Script>

javascript实现日历式日期选择

| No Comments | No TrackBacks

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Canlender--JavaScript</title>
<style>
td {
 font-family: Arial, Helvetica, sans-serif;
 font-size: 12px;
}

</style>

</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="180">
<tr><td id=cc>
</td></tr></table>
</body>
<script language="JavaScript">
function RunNian(The_Year)
{
 if ((The_Year%400==0) || ((The_Year%4==0) && (The_Year%100!=0)))
  return true;
 else
  return false;
}
function GetWeekday(The_Year,The_Month)
{
 
 var Allday;
 Allday = 0;
 if (The_Year>2000)
 {
  
  for (i=2000 ;i<The_Year; i++) 
   if (RunNian(i))
    Allday += 366;
   else
    Allday += 365;
  for (i=2; i<=The_Month; i++)
  {
   switch (i)
   {
    case 2 :
     if (RunNian(The_Year))
      Allday += 29;
     else
      Allday += 28;
     break;
    case 3 : Allday += 31; break;
    case 4 : Allday += 30; break;
    case 5 : Allday += 31; break;
    case 6 : Allday += 30; break;
    case 7 : Allday += 31; break;
    case 8 : Allday += 31; break;
    case 9 : Allday += 30; break;
    case 10 : Allday += 31; break;
    case 11 : Allday += 30; break;
    case 12 :  Allday += 31; break;
    
   }
   
  }
 }
 
 return (Allday+6)%7;
 

}

function chooseday(The_Year,The_Month,The_Day)
{
 var Firstday;
 var completely_date;
 if (The_Day!=0)
  completely_date = The_Year + "-" + The_Month + "-" + The_Day;
 else
  completely_date = "No Choose";
 //showdate 只是一个为了显示而采用的东西,
 //如果外部想引用这里的时间,可以通过使用 completely_date引用完整日期
 //也可以通过The_Year,The_Month,The_Day分别引用年,月,日
 //当进行月份和年份的选择时,认为没有选择完整的日期
 showdate.innerText = completely_date;
 Firstday = GetWeekday(The_Year,The_Month);
 ShowCalender(The_Year,The_Month,The_Day,Firstday);
 
}

function nextmonth(The_Year,The_Month)
{
 if (The_Month==12)
  chooseday(The_Year+1,1,0);
 else
  chooseday(The_Year,The_Month+1,0);
}

function prevmonth(The_Year,The_Month)
{
 if (The_Month==1)
  chooseday(The_Year-1,12,0);
 else
  chooseday(The_Year,The_Month-1,0);
}

function prevyear(The_Year,The_Month)
{
 chooseday(The_Year-1,The_Month,0);
}

function nextyear(The_Year,The_Month)
{
 chooseday(The_Year+1,The_Month,0);
}

 

 

function ShowCalender(The_Year,The_Month,The_Day,Firstday)
{

 var showstr;
 var Month_Day;
 var ShowMonth;
 var today;
 today = new Date();
 
 
 
 switch (The_Month)
 {
  case 1 : ShowMonth = "January"; Month_Day = 31; break;
  case 2 :
   ShowMonth = "February";
   if (RunNian(The_Year))
    Month_Day = 29;
   else
    Month_Day = 28;
   break;
  case 3 : ShowMonth = "March"; Month_Day = 31; break;
  case 4 : ShowMonth = "April"; Month_Day = 30; break;
  case 5 : ShowMonth = "May"; Month_Day = 31; break;
  case 6 : ShowMonth = "June"; Month_Day = 30; break;
  case 7 : ShowMonth = "July"; Month_Day = 31; break;
  case 8 : ShowMonth = "August"; Month_Day = 31; break;
  case 9 : ShowMonth = "September"; Month_Day = 30; break;
  case 10 : ShowMonth = "October"; Month_Day = 31; break;
  case 11 : ShowMonth = "November"; Month_Day = 30; break;
  case 12 : ShowMonth = "December"; Month_Day = 31; break;
   
 }
 
 
 showstr = "";
 showstr = "<Table cellpadding=0 cellspacing=0 border=1 bordercolor=#999999 width=95% align=center valign=top>";
 showstr +=  "<tr><td width=0 style='cursor:hand' onclick=prevyear("+The_Year+"," + The_Month + ")>&lt;&lt;</td><td width=0>&nbsp;" + The_Year + "&nbsp;</td><td width=0 onclick=nextyear("+The_Year+","+The_Month+")  style='cursor:hand'>&gt;&gt;</td><td width=0 style='cursor:hand' onclick=prevmonth("+The_Year+","+The_Month+")>&lt;&lt;</td><td width=100 align=center>" + ShowMonth + "</td><td width=0 onclick=nextmonth("+The_Year+","+The_Month+")  style='cursor:hand'>&gt;&gt;</td></tr>";
 showstr +=  "<tr><td align=center width=100% colspan=6>";
 showstr +=  "<table cellpadding=0 cellspacing=0 border=1 bordercolor=#999999 width=100%>";
 showstr += "<Tr align=center bgcolor=#999999> ";
    showstr += "<td><strong><font color=#0000CC>日</font></strong></td>";
    showstr += "<td><strong><font color=#0000CC>一</font></strong></td>";
    showstr += "<td><strong><font color=#0000CC>二</font></strong></td>";
    showstr += "<td><strong><font color=#0000CC>三</font></strong></td>";
    showstr += "<td><strong><font color=#0000CC>四</font></strong></td>";
    showstr += "<td><strong><font color=#0000CC>五</font></strong></td>";
    showstr += "<td><strong><font color=#0000CC>六</font></strong></td>";
 showstr += "</Tr><tr>";
 
 for (i=1; i<=Firstday; i++)
  showstr += "<Td align=center bgcolor=#CCCCCC>&nbsp;</Td>";
 
 for (i=1; i<=Month_Day; i++)
 {
  if ((The_Year==today.getYear()) && (The_Month==today.getMonth()+1) && (i==today.getDate()))
   bgColor = "#FFCCCC";
  else
   bgColor = "#CCCCCC";
  
  if (The_Day==i) bgColor = "#FFFFCC";
  showstr += "<td align=center bgcolor=" + bgColor + " style='cursor:hand' onclick=chooseday(" + The_Year + "," + The_Month + "," + i + ")>" + i + "</td>";
  Firstday = (Firstday + 1)%7;
  if ((Firstday==0) && (i!=Month_Day)) showstr += "</tr><tr>";
 }
 if (Firstday!=0) 
 {
  for (i=Firstday; i<7; i++)
   showstr += "<td align=center bgcolor=#CCCCCC>&nbsp;</td>";
  showstr += "</tr>";
 }
  
 showstr += "</tr></table></td></tr></table>";
 cc.innerHTML = showstr;  
 

}


</script>

<script language="JavaScript">

 var The_Year,The_Day,The_Month;
 var today;
 var Firstday;
 today = new Date();
 The_Year = today.getYear();
 The_Month = today.getMonth() + 1;
 The_Day = today.getDate();
 Firstday = GetWeekday(The_Year,The_Month);
 ShowCalender(The_Year,The_Month,The_Day,Firstday);
</script>
<div id=showdate></div>
</html>

php日历

| No Comments | No TrackBacks

1.
<?php
$mnow=(isset($HTTP_GET_VARS['month']) && intval($HTTP_GET_VARS['month'])>0 && intval($HTTP_GET_VARS['month'])<13)?intval($HTTP_GET_VARS['month']):date("m");
$ynow=(isset($HTTP_GET_VARS['year']) && intval($HTTP_GET_VARS['year'])>1969 && intval($HTTP_GET_VARS['year'])<2038)?intval($HTTP_GET_VARS['year']):date("Y");
$mtime=mktime(0,0,0,$mnow,date("d"),$ynow);
$f=date("w",mktime(0,0,0,$mnow,1,$ynow))-1;
echo "<table id=\"calendar\" border=\"0\" cellpadding=\"2\" cellspacing=\"1\">";
echo "<tr><td colspan=\"4\" align=\"center\" class=\"calendartitle\"><a href=\"?".($mnow!=date("m")?"month=".intval($mnow)."&":"")."year=".(intval($ynow)==1970?"1970":intval($ynow)-1)."\">&lt;</a>".$ynow."<a href=\"?".($mnow!=date("m")?"month=".intval($mnow)."&":"")."year=".(intval($ynow)==2037?"2037":intval($ynow)+1)."\">&gt;</a></td><td colspan=\"3\" align=\"center\" class=\"calendartitle\"><a href=\"?month=".(intval($mnow)==1?"12":intval($mnow)-1).($ynow!=date("Y")?"&year=".intval($ynow):"")."\">&lt;</a>".date("M",$mtime)."<a href=\"?month=".(intval($mnow)==12?"1":intval($mnow)+1).($ynow!=date("Y")?"&year=".intval($ynow):"")."\">&gt;</a></td></tr>";
echo "<tr><td class=\"calendartop\">S</td><td class=\"calendartop\">M</td><td class=\"calendartop\">T</td><td class=\"calendartop\">W</td><td class=\"calendartop\">T</td><td class=\"calendartop\">F</td><td class=\"calendartop\">S</td></tr>";
for($i=0;$i<date("t",$mtime)+$f+1;$i++){
if($i%7==0)echo "<tr>";
echo "<td".(($i-$f==intval(date("d")) && $mnow==date("m") && $ynow==date("Y"))?" id=\"calendartoday\"":"").(($i%7==0 || $i%7==6)?" class=\"calendarw\"":"").">";
if($i>$f)echo $i-$f;
echo "</td>";
if($i%7==6)echo "</tr>";
}
if($i%7<6 && $i%7>0)echo "<td colspan=\"".(7-$i%7)."\"></td></tr>";
if($i%7==6)echo "<td></td></tr>";
echo "</table>";
?>

用PHP实现WEB动态网页静态化

| No Comments | No TrackBacks

在最近几年,万维网(也称环球信息网,即WWW)不断改变信息处理技术的面貌。WEB已经快速地成为一种有效的媒介,并适合人们和商业沟通和协作。几乎所有的信息技术领域都普遍受到WEB的影响。Web访问带来更多用户和更多数据,这意味着给服务器和数据库更多压力和最终用户得到越来越慢的响应速度。与不断靠增加CPU,磁盘驱动器及内存来跟上这种增长的需求相比, WEB动态网页面静态化应该是一个更实用,更经济的选择。

用PHP实现WEB动态网页静态化的具体实现函数如function gen_static_file()所示












  Code:   







function gen_static_file($program, $filename)
{
$program 1= "/usr/local/apache/htdocs/php/" . $program;
$filename1 = "/usr/local/apache/htdocs/ static_html/" . $filename;
$cmd_str = "/usr/local/php4/bin/php " . $program1 . " } " . $filename1 . " ";
system($cmd_str);
echo $filename . " generated.〈br〉";
}



这 个函数是实现静态化的关键,即PHP动态页面程序不是被送到浏览器中,而是输入到名为$filename的文件中去(如图2)。两个参数中$ program是PHP动态页面程序,$filename是生成的静态页面的名字(可根据需要自己制定命名规则,这一点很重要,见下文), /usr/local/php4/bin/php是PHP中具有把程序输入文件功能的部分,System是PHP中执行外部命令的函数。我们还可以看出所 有生成动态页面的php程序需放在/php/目录下,所有新产生的静态页面则会出现在/static_html/目录下(这些路径可以根据具体需要设 置)。

下面让我们举个具体例子,看一下college_static.php的静态页面是怎样生成的。












  Code:   







function gen_college_static ()
{
for ($i = 0; $i 〈= 32; $i++〉
{
putenv("province_id=" . $i); //*.php文件从数据库取数据时要用到。
$filename = " college_static". $i . ".html";
gen_static_file("college_static.php", $filename);
}



从 这个函数我们可以看到通过调用函数gen_static_file(), college_static.php经过静态化,变成了33个静态页面 college.static0.html~college.static33.html,其中$filename会随着$I的变化而变化。当然也可以从数据库中直接取值,来控制生成的静态页面的个数和名字,其他程序对生成的静态页面的调用应和静态页面的命名规则一致。

目录遍历的类

| 2 Comments | No TrackBacks

<?
/************************************
    Name: ListDir
    Author: Riyao

//This class is to list all file & directory follow a directory
//Parameter:$strdir ,which directory you want list; $del_url,the manage URL,


*********************************/
class ListDir{

 var $dir;
 var $edit_url="";
 var $del_url="";
 
 var $num = 0;

 function ListDir($strdir,$del_url="",$edit_url="")
 {
  $this->dir = $strdir;
  $this->del_url = $del_url;
  $this->edit_url = $edit_url;
  }
 
 function MakeDir($StrDir)
 {
 //global $num;
 if (is_dir($StrDir)) {
      if ($dh = @opendir($StrDir)) {
          while (($file = readdir($dh)) !== false) {
          
           $newdir = $StrDir.$file;
           if($file == "." || $file == "..")
               {
                continue;
               }
              
               $this->num = $this->num + 1;
               print str_repeat("&nbsp;",$this->num);
              
               if(filetype($newdir)=="dir")
               {
                print "<br/>";
                print "$file  [目录]<br/>\n";
               }
               else
               {
                 
                print "<a href='".$this->del_url."?file=".$newdir."'>EDIT</a> <a href='".$newdir."'>$file</a>  <br/>\n";
    }
               if(is_dir($newdir))
               {
                $this->MakeDir($newdir."/");
                }
               
               $this->num = $this->num - 1;
          }
         print "<br/>";
      closedir($dh);
      }
 }

 }
 
 function ShowDir()
 {
  $this->MakeDir($this->dir);
  }
}

/*
exemple

include_once("./class.dir.php");
$dir = new ListDir("c:/","http://127.0.0.1/index.php");
$dir->ShowDir();

*/
?>

rome的一个小例子,读取rss数据

| No Comments | No TrackBacks

用了rome 0,8的jar包,代码大部分来自于rome-samples-0.7 。其中加入了一个设置代理的代码,因为本机的环境需要设置代理才行,呵呵,等以后加强功能的时候这个设置还是挺有用的东西

对了,放个rome的链接Rome's Home,可以直接去下载

import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;

import java.net.*;
import java.util.Properties;


/**
 * @author dozhan
 *
 */


public class Writer {
 
    public static void main(String[] args){
        System.out.println("Start...");
        String str ="http://blog.csdn.net/zdsdiablo/Rss.aspx";
        Properties prop = System.getProperties();
        prop.put("http.proxyHost","192.168.0.1");    //这里填写代理的ip
        prop.put("http.proxyPort","8080");

        boolean ok = false;
        try {         

            URL feedUrl = new URL(str);

            SyndFeedInput input = new SyndFeedInput();

            SyndFeed feed = input.build(new XmlReader(feedUrl));

            System.out.println(feed);

            ok = true;
        }
        catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("ERROR: "+ex.getMessage());
        }


        if (!ok) {
            System.out.println();
            System.out.println("FeedReader reads and prints any RSS/Atom feed type.");
            System.out.println("The first parameter must be the URL of the feed to read.");
            System.out.println();
        }
       
    }
}

 

Start...
SyndFeedImpl.contributors=null
SyndFeedImpl.title=十分钟年华老去
SyndFeedImpl.categories=[]
SyndFeedImpl.link=http://blog.csdn.net/zdsdiablo/
SyndFeedImpl.publishedDate=null
SyndFeedImpl.entries[0].updatedDate=null
SyndFeedImpl.entries[0].contributors=null
SyndFeedImpl.entries[0].title=Java API文档中文版
SyndFeedImpl.entries[0].categories=[]
SyndFeedImpl.entries[0].link=http://blog.csdn.net/zdsdiablo/archive/2006/06/09/782902.aspx
SyndFeedImpl.entries[0].publishedDate=Fri Jun 09 22:35:00 GMT+08:00 2006
SyndFeedImpl.entries[0].authors=null

用JSP实现基于Web的RSS阅读器

| No Comments | No TrackBacks
一: RSS介绍

   根据维基百科(http://zh.wikipedia.org/wiki/RSS)的定义,“RSS是一种用于共享新闻和其他Web内容的数据交换规范 ”,它是一系列的规范的组合,采用XML格式。目前国内RSS应用最多的是在新闻网站和博客网站上。

   许多网站可以用RSS阅读器来个性化自己的网页,比如显示最新的新浪新闻,显示自己好朋友最新的博客文章,显示最新的Google论坛内容。除此之外,利用RSS阅读器还可以实现其它用途,比如:

  • 获得天气预报

  • 接收邮件,比如Gmail就提供RSS feed

  • 获取最新股票行情

  • 获取音乐,电台节目和视频剪辑等等

     

二:Rome介绍

   这篇文章采用Rome这个开源工具来实现RSS阅读器。Rome支持的格式很多,有RSS 0.90, RSS 0.91 Netscape, RSS 0.91 Userland, RSS 0.92, RSS 0.93, RSS 0.94, RSS 1.0, RSS 2.0, Atom 0.3, Atom 1.0 等等,几乎囊括了目前所有的RSS atom版本。最新的Rome版本可以从http://wiki.java.net/bin/view/Javawsxml/Rome上得到。

下面是在 blog-mover 中实现的一个类,直接贴源码吧(代码中可能存在的Bug,对您造成的误解,我不负责哟,要查看全部源码请访问 http://code.google.com/p/blog-mover),关于 Rome 的更多信息参见 http://rome.dev.java.net. Rome 可是出自 Sun 之手。有着这样的 package name:com.sun.syndication。



/**
 * Created on 2006-9-10 上午02:32:57
 */
package com.redv.blogmover.feed;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;

import com.redv.blogmover.Attachment;
import com.redv.blogmover.BlogMoverException;
import com.redv.blogmover.Comment;
import com.redv.blogmover.WebLog;
import com.redv.blogmover.impl.AbstractBlogWriter;
import com.redv.blogmover.web.DownloadFileServlet;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedOutput;

/**
 * 使用 <a href="https://rome.dev.java.net/">Rome</a> 将日志导出成下列格式:RSS 0.90, RSS
 * 0.91 Netscape, RSS 0.91 Userland, RSS 0.92, RSS 0.93, RSS 0.94, RSS 1.0, RSS
 * 2.0, Atom 0.3, and Atom 1.0。
 *
 * @author <a href="mailto:zhoushuqun@gmail.com">Shutra Zhou</a>
 *
 */
public class RomeWriter extends AbstractBlogWriter {
    private final Pattern pattern = DownloadFileServlet.TEMP_FILE_NAME_PATTERN;

    private final String encoding = "UTF-8";

    private SyndFeed feed;

    private List<SyndEntry> entries;

    private File outputFile;

    private String feedType;

    private String title;

    private String link;

    private String description;

    private String language;

    private String copyright;

    private String author;

    /**
     * @return the outputFile
     */
    public File getOutputFile() {
        return outputFile;
    }

    /**
     * @param outputFile
     *            the outputFile to set
     */
    public void setOutputFile(File outputFile) {
        this.outputFile = outputFile;
    }

    /**
     *
     * @param filePath
     *            the outputFile's name to set
     */
    public void setFilename(String filename) throws BlogMoverException {
        if (!pattern.matcher(filename).matches()) {
            throw new BlogMoverException("Parameter filename is not matched "
                    + this.pattern.pattern() + ".");
        }

        File tmpdir = new File(SystemUtils.JAVA_IO_TMPDIR);
        this.outputFile = new File(tmpdir, filename);
    }

    /**
     * @param author
     *            the author to set
     */
    public void setAuthor(String author) {
        this.author = author;
    }

    /**
     * @param copyright
     *            the copyright to set
     */
    public void setCopyright(String copyright) {
        this.copyright = copyright;
    }

    /**
     * @param description
     *            the description to set
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * @param feedType
     *            the feedType to set
     */
    public void setFeedType(String feedType) {
        this.feedType = feedType;
    }

    /**
     * @param language
     *            the language to set
     */
    public void setLanguage(String language) {
        this.language = StringUtils.replace(language, "_", "-");
    }

    /**
     * @param link
     *            the link to set
     */
    public void setLink(String link) {
        this.link = link;
    }

    /**
     * @param title
     *            the title to set
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /*
     * (non-Javadoc)
     *
     * @see com.redv.blogmover.impl.AbstractBlogWriter#begin()
     */
    @Override
    protected void begin() throws BlogMoverException {
        this.feed = new SyndFeedImpl();
        this.feed.setEncoding(this.encoding);
        this.feed.setFeedType(this.feedType);
        this.feed.setTitle(this.title);
        this.feed.setLink(this.link);
        this.feed.setDescription(this.description);
        this.feed.setLanguage(this.language);
        this.feed.setCopyright(this.copyright);
        this.feed.setAuthor(this.author);
        this.entries = new ArrayList<SyndEntry>();
        this.feed.setEntries(this.entries);
    }

    /*
     * (non-Javadoc)
     *
     * @see com.redv.blogmover.impl.AbstractBlogWriter#end()
     */
    @Override
    protected void end() throws BlogMoverException {
        SyndFeedOutput output = new SyndFeedOutput();
        OutputStream outputStream = null;
        Writer writer = null;
        try {
            outputStream = new FileOutputStream(this.outputFile);
            writer = new OutputStreamWriter(outputStream, this.encoding);
            output.output(feed, writer);
        } catch (IOException e) {
            throw new BlogMoverException(e);
        } catch (FeedException e) {
            throw new BlogMoverException(e);
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    log.warn(e);
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    log.warn(e);
                }
            }
        }
    }

    /*
     * (non-Javadoc)
     *
     * @see com.redv.blogmover.impl.AbstractBlogWriter#writeAttachment(com.redv.blogmover.Attachment)
     */
    @Override
    protected String writeAttachment(Attachment att) {
        return null;
    }

    /*
     * (non-Javadoc)
     *
     * @see com.redv.blogmover.impl.AbstractBlogWriter#writeBlog(com.redv.blogmover.WebLog,
     *      java.util.Map)
     */
    @Override
    protected void writeBlog(WebLog webLog, Map<Attachment, String> attachments)
            throws BlogMoverException {
        // 注意:格式 RSS 0.90, RSS 0.91 Netscape, RSS 0.91 Userland 的日志数量只能在1~15之间。
        if ((this.feedType.equals("rss_0.9")
                || this.feedType.equals("rss_0.91N") || this.feedType
                .equals("rss_0.91U"))
                && this.entries.size() >= 15) {
            return;
        }
        SyndEntry entry = new SyndEntryImpl();
        entry.setAuthor(this.author);
        entry.setTitle(webLog.getTitle());
        entry.setLink(webLog.getUrl());
        entry.setPublishedDate(webLog.getPublishedDate());
        entry.setUri(webLog.getUrl());

        if (webLog.getExcerpt() != null) {
            SyndContent description = new SyndContentImpl();
            description.setType("text/html");
            description.setValue(webLog.getExcerpt());
            entry.setDescription(description);
        } else if (this.feedType.equals("rss_2.0")) {
            SyndContent description = new SyndContentImpl();
            description.setType("text/html");
            description.setValue("");
            entry.setDescription(description);
        } else {
            // Do nothing.
        }

        List<SyndContent> contents = new ArrayList<SyndContent>();
        SyndContentImpl sc = new SyndContentImpl();
        sc.setType("text/html");
        sc.setValue(webLog.getBody());
        contents.add(sc);
        entry.setContents(contents);

        this.entries.add(entry);
    }

    /*
     * (non-Javadoc)
     *
     * @see com.redv.blogmover.impl.AbstractBlogWriter#writeComment(com.redv.blogmover.Comment)
     */
    @Override
    protected void writeComment(Comment comment) throws BlogMoverException {

    }

    public static void main(String[] args) throws IOException, FeedException {
        SyndFeedImpl feed = new SyndFeedImpl();
        feed.setFeedType("rss_0.90");
        feed.setTitle("site title");
        feed.setLink("http://shutra.xpert.cn");
        feed.setDescription("site description");
        feed.setLanguage("zh-CN");
        feed.setCopyright("copyright");
        feed.setAuthor("author");

        List<SyndEntry> entries = new ArrayList<SyndEntry>();
        feed.setEntries(entries);
        for (int i = 0; i < 2; i++) {
            SyndEntry entry = new SyndEntryImpl();
            entry.setAuthor("author");
            entry.setTitle("title");
            entry.setLink("http://xpert.cn/" + i);

            List contents = new ArrayList();
            entry.setContents(contents);
            entries.add(entry);
        }

        SyndFeedOutput output = new SyndFeedOutput();
        List l = feed.getSupportedFeedTypes();
        for (Object s : l) {
            feed.setFeedType(s.toString());
            try {
                output.output(feed, new File("C:\\tmp\\t_" + s + ".xml"));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}

by Shutra

使用WebWork和Rome轻松暴露RSS

| No Comments | No TrackBacks

WebWork的result实现非常实用,它很好的解决了View渲染的灵活性问题。这才是MVC模式的优势所在,而像JSF那样帮定JSP的MVC就吃不到这个甜头了。说WebWork2是Model 2 MVC的巅峰就在这些灵活的地方。
闲扯这个不是主要目的。现在Rome是Java下最常用的RSS包,最近消息似乎要转入Apache的Abdera合并变成更强大的聚合引擎。用 Rome生成和解析RSS都很方便。今天讨论一下使用ROME给网站生成RSS,并通过WebWork2的Result机制渲染。
最初是从WebWork的Cookbook上看到的RomeResult的文章,一看就会,我这里其实不过是举个详细点的例子,注意我使用的是WebWork 2.2.2Rome 0.8
http://wiki.opensymphony.com/display/WW/RomeResult
参考了和东的这篇Blog,利用rome写rss feed生成程序:
http://hedong.3322.org/newblog/archives/000051.html

首先创建RomeResult类:

代码
  1. /** 
  2.  *  
  3.  */  
  4. package com.goldnet.framework.webwork.result;  
  5.   
  6. import java.io.Writer;  
  7.   
  8. import org.apache.log4j.Logger;  
  9.   
  10. import com.opensymphony.webwork.ServletActionContext;  
  11. import com.opensymphony.xwork.ActionInvocation;  
  12. import com.opensymphony.xwork.Result;  
  13. import com.sun.syndication.feed.synd.SyndFeed;  
  14. import com.sun.syndication.io.SyndFeedOutput;  
  15.   
  16. /** 
  17.  * A simple Result to output a Rome SyndFeed object into a newsfeed. 
  18.  * @author Philip Luppens 
  19.  *  
  20.  */  
  21. public class RomeResult implements Result {  
  22.     private static final long serialVersionUID = -6089389751322858939L;  
  23.   
  24.     private String feedName;  
  25.   
  26.     private String feedType;  
  27.   
  28.     private final static Logger logger = Logger.getLogger(RomeResult.class);  
  29.   
  30.     /* 
  31.      * (non-Javadoc) 
  32.      *  
  33.      * @see com.opensymphony.xwork.Result#execute(com.opensymphony.xwork.ActionInvocation) 
  34.      */  
  35.     public void execute(ActionInvocation ai) throws Exception {  
  36.         if (feedName == null) {  
  37.             // ack, we need this to find the feed on the stack  
  38.             logger  
  39.    &nbs