1、 解决Action过多问题
通过DispatchAction的方式
建立一个继承自DispatchAction的Action
此类Action允许我们在表单中带有参数,根据参数执行Action中的不同方法,以此实现Action的多用
步骤
①     建立一个继承自DispatchAction的Action规定方法名称
②     在表单页面中添加一个隐藏域值,假设为codi   value=”insert”
③     在Struts-config.xml的相应Form中action项目中设置parameter参数值为codi
那么当表单提交的时候,Action中的insert()方法就会被执行,可以通过改隐藏域中的值的方式来改变Action要执行的方法
2、 解决ActionForm过多的问题
通过动态ActionForm的方式,即DynaActionForm
步骤
①     在Struts-config.xml
<form-beans>
 <form-bean name=”abcForm” type=”org.apache.struts.action.DynaActionForm”>
         <form-property name=”userid” type=”java.long.String”></form-property>              
</form-bean>
</form-beans>
②     在Struts-config.xml
更改相应的action中的attribute和name为abcForm
这样就配置好了一个动态的ActionForm
3、 解决动态ActionForm的验证问题
通过动态验证ActonForm的方式,即DynaValidatorForm
步骤
①     在Struts-config.xml
同2的第一步,但是type需要改成org.apache.struts.action.DynaValidatorForm
②     配置一个validation.xml文件
<form-validation>
    <formset>
        <form name="abcForm">
            <field property="userid" depends="required">
                <arg key="err.userid" resource="true"/>
            </field>
        </form>
    </formset>
</form-validation>
③    在Struts资源文件中配置err.userid、以及errors.required
④    在Struts-config.xml配置相应的action,添加validate=”true”添加验证支持
⑤    添加struts Plugin插件
设置plugin class为org.apache.struts.validator.ValidatorPlugIn
添加propertys
Propertyà pathnames
Valueà /WEB-INF/validator-rules.xml,/WEB-INF/validation.xml
这样一个验证框架就配置好了!
			posted @ 
2008-02-12 13:47 Dong 阅读(3508) | 
评论 (6) | 
编辑 收藏读Excel:
Workbook workbook = null;
  try
  {
      workbook = Workbook.getWorkbook(new File(path));
  }
  catch(Exception e)
  {
   System.out.println(e);
  }
Sheet sheet = workbook.getSheet(0);
Cell cell=sheet.getCell(i,j);//读第i列,第j行表格的值
System.out.println(cell.getContents());
对于循环读出可以使用
sheet.getRows();方法得到行数
sheet.getColumns();方法得到列数
写Excel:
Workbook wb = Workbook.getWorkbook(new File(path));
WritableCellFormat wcf = new WritableCellFormat();
book = Workbook.createWorkbook(new File(path, wb);
sheet = book.getSheet(0);
jxl.write.Label name = new jxl.write.Label(i,j,"abc",wcf);//在第i列,第j行写入"abc"值,风格为wcf,如果写入的是数字则使用jxl.write.Number
sheet.addCell(name);
try
   {
    book.write();
    book.close();
   }
   catch(WriteException e){}
   catch(IOException e){}
单元格风格:
设置边框—
WritableCellFormat wcf = new WritableCellFormat();
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
wcf.setBorder(Border.RIGHT,BorderLineStyle.THIN);
wcf.setBorder(Border.LEFT,BorderLineStyle.THIN);
wcf.setBorder(Border.BOTTOM,BorderLineStyle.THIN);
合并单元格-
sheet.mergeCells(0,1,0,2)
合并(0,1)、(0,2)两个单元格
设置字体-
WritableFont wf = new WritableFont(WritableFont.ARIAL,12, WritableFont.BOLD, false);
WritableCellFormat wcf = new WritableCellFormat(wf);
以及其它各种单元格样式,如设置背景颜色
都可以通过设置WritableCellFormat来设置
还有一点需要说明一下,JXL组件对于公式的支持似乎比Apache的poi好
			posted @ 
2008-02-01 16:16 Dong 阅读(4997) | 
评论 (2) | 
编辑 收藏
原因是,如果系统并不是苹果的系统就需要显示的加载JFrame和JDialog的样式
 
 System.setProperty("Quaqua.tabLayoutPolicy","wrap");
System.setProperty("Quaqua.tabLayoutPolicy","wrap");
 
          
 if(!System.getProperty("os.name").toLowerCase().startsWith("mac"))
        if(!System.getProperty("os.name").toLowerCase().startsWith("mac"))

 
         {
{
 try
            try

 
             {
{
 Methods.invokeStatic(JFrame.class, "setDefaultLookAndFeelDecorated", Boolean.TYPE, Boolean.TRUE);
                Methods.invokeStatic(JFrame.class, "setDefaultLookAndFeelDecorated", Boolean.TYPE, Boolean.TRUE);
 Methods.invokeStatic(JDialog.class, "setDefaultLookAndFeelDecorated", Boolean.TYPE, Boolean.TRUE);
                Methods.invokeStatic(JDialog.class, "setDefaultLookAndFeelDecorated", Boolean.TYPE, Boolean.TRUE);
 }
            }
 catch(NoSuchMethodException e)
            catch(NoSuchMethodException e)

 
             {
{
 e.printStackTrace();
                e.printStackTrace();
 }
            }
 }
        }
 try
        try 

 
         {
{
 UIManager.setLookAndFeel("ch.randelshofer.quaqua.QuaquaLookAndFeel");
            UIManager.setLookAndFeel("ch.randelshofer.quaqua.QuaquaLookAndFeel");
 }
        } 

 catch(Exception e)
        catch(Exception e) {}
{}posted @ 
2008-01-26 13:01 Dong 阅读(2967) | 
评论 (6) | 
编辑 收藏Junit主要是用来对我们的程序代码进行白盒测试的一个组件。
首先我们需要得到Junit.jar的包,可以到www.junit.org下载得到。
下载以后将我们的Junit.jar包添加到工程里面,那么OK,就可以开始对我们的程序进行测试了。
对一个文件进行测试的时候需要自己制作一个类并继承TestCase,如:
package cn.colorful.junit;
import junit.framework.Assert;
import junit.framework.TestCase;
import cn.colorful.sample.*;
public class TestSample extends TestCase {
 private Sample sam = null;
 protected void setUp() throws Exception {
  sam = new Sample();
 }
 protected void tearDown() throws Exception {
  sam = null;
 }
 public void testSample() {
  Assert.assertNotNull(sam);
  Assert.assertEquals("ab", sam.getName("a", "b"));
  Assert.assertEquals("dong", sam.getName("do", "ng"));
 }}
其中程序的运行过程是TestCase的构造方法、setUp方法(对程序中使用的一些资源进行分配)、运行测试、tearDown()(去处一些使用到的资源)
这样程序会自动判断Sample类中的getName方法返回的值是不是符合我们的要求,使用Junit测试的运行方式,程序会调用Assert类中的静态方法对测试程序的返回值和期望值等情况进行判断、还有一些判断对象是否为空的方法,当出现绿色的时候代表程序是正常运行的
当书写了很多测试类后,可以条使用TestSuite类对测试类进行打包测试,如:
package cn.colorful.junit;
import junit.framework.Test;
import junit.framework.TestSuite;
public class TestPackage{
 public static Test suite()
 {
  TestSuite tes = new TestSuite("Test for cn.colorful.sample");
  tes.addTestSuite(TestSample.class);
  tes.addTestSuite(TestSampleTwo.class);
  
  return tes ;
 }
}
程序需要实现suite()方法,并且返回出一个TestSuite对象。
			posted @ 
2007-12-25 16:12 Dong 阅读(1269) | 
评论 (2) | 
编辑 收藏1、实现自定义Taglib的类需要实现javax.servlet.jsp.tagext.IterationTag或者
javax.servlet.jsp.tagext.TagSupport、javax.servlet.jsp.tagext.BodyTag接口,目前J2EE提供了两
个分别实现了这两个接口的类,我们只需要直接继承就可以,它们分别为BodyTagSupport、TagSupport
继承两个类中的一个就可以完成一个属于自己的Taglib类
package cn.dong;
import java.io.IOException;
import cn.dong.Person ;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
public class TagServer extends TagSupport {
 
 String name ;
 public void setName(String name) {
  this.name = name;
 }
 public int doStartTag() throws JspException {
  Person per = new Person() ;
  try {
   pageContext.getOut().println("Userid:"+name) ;
  } catch (IOException e) {
   e.printStackTrace();
  }
  return SKIP_BODY ;
 }
}
2、写tld文件
tld文件本身是xml标准文档的一种,可以通过tld文件配置出Taglib的各种标记所对应的类实现
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" 
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
 <tlibversion>1.0</tlibversion>//标签描述
 <jspversion>1.1</jspversion>
 <shortname>mytag</shortname>
 <uri></uri>
 <tag>
  <name>hello</name>//标签方法名
  <tagclass>cn.dong.TagServer</tagclass>//指向的类
  <bodycontent>empty</bodycontent>
  <info>Tag with Parameter</info>
  <attribute>//定义传递的属性值
   <name>name</name>//属性名
   <required>true</required>//属性值是否必须传输
   <rtexprvalue>false</rtexprvalue>
  </attribute>
 </tag>
</taglib>
这样一个自定义标记就写好了,但是要使用它我们还需要在项目中配置
3、项目部署文件web.xml
<taglib>
 <taglib-uri>hello</taglib-uri>
 <taglib-location>/WEB-INF/Web.tld</taglib-location>
</taglib>
4、在JSP页面中调用Taglib
<%@ taglib uri="hello" prefix="show" %>
这样我们就完成了所有配置
在页面中使用类似<show:hello name="dong"/>就可以看到我们配置的Taglib起的作用了
			posted @ 
2007-12-19 11:07 Dong 阅读(1089) | 
评论 (3) | 
编辑 收藏我对DAO的理解就是对数据库的访问封装在一个接口里,当用户需要访问数据库的时候只需要简单的对调用接口,而不需要和数据库有直接的接触。
下面介绍一个简单的DAO对数据库访问的建立:
首先我们需要建立
1、一个DAO接口:UserDAO.java在里面定义数据库操作的所有方法
2、一个实现了DAO接口的类、UserDAOImpl.java,完成了对DAO的实现并且将取得的数据存放到VO类中。
3、一个数据库访问的基础类、DataBaseConnection.java里面封装了对数据库的连接Connection,外部访问这个类的方法可以返回一个Connection接口的实现
4、一个VO类,UserVO.java,里面包含了所有需要返回的出来的数据、利用set方法和get方法对类对象进行基本的设置
5、一个Factory类,封装了具体实现了UserDAO接口的UserDAOImpl类对象,调用Factory类的时候直接返回一个UserDAO的对象
这样的话一个DAO设计就完成了
这个时候当我们需要对数据库进行访问的时候只需要声明一个UserDAO接口然后实例化一个工厂类实现UserDAO接口,这样我们就可以遍历VO类得到我们要的数据。
			posted @ 
2007-12-16 16:30 Dong 阅读(1147) | 
评论 (1) | 
编辑 收藏Filter Servlet中传递的request和response对象分别是ServletRequest和ServletResponse接口的对象,而不是一般Servlet中的HttpServletRequest和HttpServletResponse接口的对象,ServletRequest是HttpServletRequest的父接口,很多方法是没有的,比如说request.getSession() ;所以如果想在Filter中读取session对象必须对request做一定的向下转型。
而实现HttpSessionListener 的Listener Servlet中的传递的对象是HttpSessionEvent的对象,想在其中实现对Application对象的访问的话:arg0.getSession().getServletContext().setAttribute();
另:今天把MySQL装到电脑上,利用Servlet连接了一下,老是报ClassNotFound的错误,原因是MySQL的JDBC驱动只有一个mysql-connector-java-5.0.8-bin.jar,另外一个不能够拷到lib目录下。
			posted @ 
2007-12-13 01:02 Dong 阅读(580) | 
评论 (0) | 
编辑 收藏
Action, 用来访问业务逻辑类。当 ActionServlet 从容器接收到一个请求,它使用URI (或者
路径“path”) 来决定那个Action 将用来处理请求。一个 Action可以校验输入,并且访问业务
层以从数据库或其他数据服务中检索信息。
为校验输入或者使用输入来更新数据库, Action 需要知道什么指被提交上来。并不是
强制每个Action 从请求中抓取这些值,而是由 ActionServlet 将输入绑定到JavaBean中。
输入 bean是Struts ActionForm c类的子类。ActionServlet 通过查找请求的路径可以决定使用
哪个ActionForm,Action 也是通过同样的方法选取的。ActionForm 扩展
org.apache.struts.action.ActionForm类。每个都必须以HTTP 响应进行应答。 通
常, Struts
Action 并不自行加工响应信息,而是将请求转发到其他资源,比如JSP 页面。Struts 提
供一个ActionForward 类,用来将一个页面的路径存储为逻辑名称。当完成业务逻辑后,
Action 选择并向Servlet返回一个ActionForward。Servlet 然后使用存储在ActionForward 对
象中的路径来调用页面完成响应。
Struts 将这些细节都绑定在一个ActionMapping 对象中。每个ActionMapping 相对于一
个特定的路径。当某个路径被请求时,Servlet 就查询ActionMapping 对象。ActionMapping
对象告诉servlet,哪个Actions, ActionForms, 和 ActionForwards 将被使用。
所有这些细节,关于Action, ActionForm, ActionForward, ActionMapping,以及其
他一些东西,都在struts-config.xml 文件中定义。 ActionServlet 在启动时读取这个配置文件,
并创建一个配置对象数据库。在运行时,Struts 应用根据文件创建的配置对象,而不是文件
本身
  
			posted @ 
2007-12-08 10:52 Dong 阅读(263) | 
评论 (0) | 
编辑 收藏 <head>
<head>
 <title>无标题文档</title>
<title>无标题文档</title>
 <style type="text/css">
<style type="text/css">
 <!--
<!--


 .hidecontent
.hidecontent  {display:none;}
{display:none;}
 -->
-->
 </style>
</style>
 <script language="javascript">
<script language="javascript">
 function switchTag(content)
function switchTag(content)


 {
{
 // alert(tag);
// alert(tag);
 // alert(content);
// alert(content);
 for(i=1; i <6; i++)
for(i=1; i <6; i++)


 {
{

 if ("content"+i==content)
if ("content"+i==content)


 {
{
 document.getElementById(content).className="";
document.getElementById(content).className="";

 }else
}else {
{
 document.getElementById("content"+i).className="hidecontent";
document.getElementById("content"+i).className="hidecontent";
 }
}
 document.getElementById("content").className=content;
document.getElementById("content").className=content;
 }
}
 }
}
 </script>
</script>
 </head>
</head>

 <body>
<body>
 <div id="container">
<div id="container">
 <ul>
<ul>
 <li><a href="#" onmouseover="switchTag('content1');this.blur();"><span>标题一</span></a></li>
<li><a href="#" onmouseover="switchTag('content1');this.blur();"><span>标题一</span></a></li>
 <li><a href="#" onmouseover="switchTag('content2');this.blur();"><span>标题二</span></a></li>
<li><a href="#" onmouseover="switchTag('content2');this.blur();"><span>标题二</span></a></li>
 <li><a href="#" onmouseover="switchTag('content3');this.blur();"><span>标题三</span></a></li>
<li><a href="#" onmouseover="switchTag('content3');this.blur();"><span>标题三</span></a></li>
 <li><a href="#" onmouseover="switchTag('content4');this.blur();"><span>标题四</span></a></li>
<li><a href="#" onmouseover="switchTag('content4');this.blur();"><span>标题四</span></a></li>
 <li><a href="#" onmouseover="switchTag('content5');this.blur();"><span>标题五</span></a></li>
<li><a href="#" onmouseover="switchTag('content5');this.blur();"><span>标题五</span></a></li>
 </ul>
</ul>
 </div>
</div>
 <div id="content" class="content1">
<div id="content" class="content1">

 <div id="content1" >标题一中的东西</div>
<div id="content1" >标题一中的东西</div>
 <div id="content2" class="hidecontent">标题二中的东西</div>
<div id="content2" class="hidecontent">标题二中的东西</div>
 <div id="content3" class="hidecontent">标题三中的东西</div>
<div id="content3" class="hidecontent">标题三中的东西</div>
 <div id="content4" class="hidecontent">标题四中的东西</div>
<div id="content4" class="hidecontent">标题四中的东西</div>
 <div id="content5" class="hidecontent">标题五中的东西</div>
<div id="content5" class="hidecontent">标题五中的东西</div>

 </div>
</div>
 </body>
</body>
 </html>
</html>

posted @ 
2007-11-11 11:39 Dong 阅读(1528) | 
评论 (4) | 
编辑 收藏        最近开发个后台系统,使用到了eWebEditor,原先并没有使用过相关方面的在线编辑器。所以一用起来问题一大堆!都不知道用什么编辑器好,研究了FCKEditor等一些国外的编辑器后还是觉得应该支持国货!
         选顶了编辑器后之后还算顺利,但是没过多久就出现了另外一个问题,使用eWebEditor编辑后并保存到数据库中的字符串是以HTML源码的形式!这样上传和前台显示是都没有问题的。但是后台中有个修改新闻的功能,当我将HTML形式的代码传递给eWebEditor的时候,惊喜就出现了!!编辑器显然不买我的帐~~~没反应???
        下面的就是调用编辑器的JS代码,其中value中的content值代表Html源码!!然后eWebEditor就不能显示出来,也不报错,就是在页面中空了一块,哪位仁兄知道解决办法,麻烦告诉一下,Thanks!!!!!!
 <script language=javascript>
<script language=javascript>

 document.write ("<INPUT type='hidden' name='content1' value='<%=content%>'>");
document.write ("<INPUT type='hidden' name='content1' value='<%=content%>'>");
 document.write ("<IFRAME ID='eWebEditor1' src='ewebeditor.htm?id=content1&style=" + URLParams["style"] + "' frameborder='0' scrolling='no' width='580' height='300'></IFRAME>");
document.write ("<IFRAME ID='eWebEditor1' src='ewebeditor.htm?id=content1&style=" + URLParams["style"] + "' frameborder='0' scrolling='no' width='580' height='300'></IFRAME>");

 setTimeout("setValue();",1000);
setTimeout("setValue();",1000);

 </script>
</script>
    1、讲content的内容进行Html编译,Server.HTMLEncode(content)
    2、第二个问题将隐藏的文本框改成文本域,就可以了
			posted @ 
2007-11-08 23:59 Dong 阅读(956) | 
评论 (2) | 
编辑 收藏