posts - 42,  comments - 84,  trackbacks - 0
 
 

1、 解决Action过多问题

通过DispatchAction的方式

建立一个继承自DispatchActionAction

此类Action允许我们在表单中带有参数,根据参数执行Action中的不同方法,以此实现Action的多用

步骤

     建立一个继承自DispatchActionAction规定方法名称

     在表单页面中添加一个隐藏域值,假设为codi   value=”insert”

     Struts-config.xml的相应Formaction项目中设置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中的attributenameabcForm

这样就配置好了一个动态的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 阅读(3485) | 评论 (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 阅读(4977) | 评论 (2)编辑 收藏
原来弄过QuaQua的东西,但是一直不能把JFrame和JDialog变成Ox mac的样式
原因是,如果系统并不是苹果的系统就需要显示的加载JFrame和JDialog的样式



System.setProperty("Quaqua.tabLayoutPolicy","wrap");
          
        
if(!System.getProperty("os.name").toLowerCase().startsWith("mac"))
        
{
            
try
            
{
                Methods.invokeStatic(JFrame.
class"setDefaultLookAndFeelDecorated", Boolean.TYPE, Boolean.TRUE);
                Methods.invokeStatic(JDialog.
class"setDefaultLookAndFeelDecorated", Boolean.TYPE, Boolean.TRUE);
            }

            
catch(NoSuchMethodException e)
            
{
                e.printStackTrace();
            }

        }

        
try 
        
{
            UIManager.setLookAndFeel(
"ch.randelshofer.quaqua.QuaquaLookAndFeel");
        }
 
        
catch(Exception e){}
posted @ 2008-01-26 13:01 Dong 阅读(2960) | 评论 (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 阅读(1254) | 评论 (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 阅读(1081) | 评论 (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 阅读(1138) | 评论 (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 阅读(574) | 评论 (0)编辑 收藏
Struts 使用 Model 2 架构。Struts 的ActionServlet 控制导航流。其他Struts 类,比如
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 阅读(247) | 评论 (0)编辑 收藏
<head>
<title>无标题文档</title>
<style type="text/css">
<!--

.hidecontent 
{display:none;}
-->
</style>
<script language="javascript">
function switchTag(content)
{
// alert(tag);
//
 alert(content);
for(i=1; i <6; i++)
{

if ("content"+i==content)
{
document.getElementById(content).className
="";
}
else{
document.getElementById(
"content"+i).className="hidecontent";
}

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

}

</script>
</head>

<body>
<div id="container">
<ul>
<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('content3');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>
</ul>
</div>
<div id="content" class="content1">

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

</div>
</body>
</html>
只是一个简单的实现方法,具体的样式美观方面的东西可以自己修改。
posted @ 2007-11-11 11:39 Dong 阅读(1516) | 评论 (4)编辑 收藏

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

<script language=javascript>

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>");

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

</script>
    经过一夜奋战,以及对于问题的研究。终于找到解决方法了,步骤如下:
    1、讲content的内容进行Html编译,Server.HTMLEncode(content)
    2、第二个问题将隐藏的文本框改成文本域,就可以了
posted @ 2007-11-08 23:59 Dong 阅读(950) | 评论 (2)编辑 收藏
仅列出标题
共5页: 上一页 1 2 3 4 5 下一页