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
這樣一個驗證框架就配置好了!
讀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());
Workbook wb = Workbook.getWorkbook(new File(path));
WritableCellFormat wcf = new WritableCellFormat();
book = Workbook.createWorkbook(new File(path, wb);
sheet = book.getSheet(0);
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對象。
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起的作用了
我對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類得到我們要的數據。
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目錄下。
最近開發個后臺系統,使用到了eWebEditor,原先并沒有使用過相關方面的在線編輯器。所以一用起來問題一大堆!都不知道用什么編輯器好,研究了FCKEditor等一些國外的編輯器后還是覺得應該支持國貨!
選頂了編輯器后之后還算順利,但是沒過多久就出現了另外一個問題,使用eWebEditor編輯后并保存到數據庫中的字符串是以HTML源碼的形式!這樣上傳和前臺顯示是都沒有問題的。但是后臺中有個修改新聞的功能,當我將HTML形式的代碼傳遞給eWebEditor的時候,驚喜就出現了??!編輯器顯然不買我的帳~~~沒反應???
下面的就是調用編輯器的JS代碼,其中value中的content值代表Html源碼!!然后eWebEditor就不能顯示出來,也不報錯,就是在頁面中空了一塊,哪位仁兄知道解決辦法,麻煩告訴一下,Thanks!!!!!!