??xml version="1.0" encoding="utf-8" standalone="yes"?>
内容+模板=昄Q这里是Q?br />内容+模板-->昄?rn)态html
内容用FCK来编辑,模板也同L(fng)FCK~辑Q这里用freemarker无疑是一个好的选择。这里是个最单的例子?br />首先定义一个最单的模板content.ftl<html>
$
{content}
</html>
Configuration cfg = new Configuration();
//模板存储的目?/span>
cfg.setDirectoryForTemplateLoading(Path.getTemplateDirectory());
//默认
cfg.setObjectWrapper(new DefaultObjectWrapper());
//填充数据
Map root = new HashMap();
root.put("content", c.getPageContent());
Template temp = cfg.getTemplate("content.ftl");
//发布日期
String date=c.getActivedate();
String filename = c.getId()+".html";
//创徏目录
Path.createFold(Path.getWebCmsHtmlDirPath(),date);
Writer out = new OutputStreamWriter(new FileOutputStream(Path.getWebCmsHtmlDirPath()+"/"+date+"/"+filename));
temp.process(root, out);
out.flush();
]]>
<%@ taglib prefix="authz" uri="但记得自己没有在web.xml中声明这个标{,咋就跑v来了(jin)呢?google一下,原来authz.tld被打入jar包的META-INF?br />呵呵Q记录一?img src ="http://www.aygfsteel.com/RongHao/aggbug/74798.html" width = "1" height = "1" />
]]>
开发中遇到q么一个要求,用户USERq个PO里需要保存用L(fng)照片。一般情况下有两U处理方法:(x)一是直接保存图片到数据库;二是保存囄到服务器端,PO字段保存一个联接。考虑到用L(fng)片一般较?yu),采用W一U方法?br />
面里面Q直接用webwork的FileUploadInterceptor拦截
xwork.xml里的配置
引用默认的拦截器栈,栈里已经包含FileUploadInterceptor拦截Q这里配|FileUploadInterceptor拦截的参敎ͼ讑֮上传的文件ؓ(f)囄
格式
Actionc?br />
q样O(jin)K?jin),考虑一个问题,是action 必须要指定一个result Q实际这里的囄昄仅仅是要一个输出流
而我的配|里面是
不知道这?x)不会(x)有什么媄(jing)响。或者这P
在tomcat的server.xml里加入描q?BR> <Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/databaseName"
connectionName=yourname connectionPassword=yourpassword
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
在自己应用程序的web.xml里加入描qͼZ表单Q?/STRONG>
<security-constraint>
<web-resource-collection>
<web-resource-name>My Test</web-resource-name>
<url-pattern>/get.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name> //能够讉K的角Ԍ可以多个
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>My Test</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/fail_login.html</form-error-page> //认证p|后蟩转的面
</form-login-config>
</login-config>
d表单必须包含输入用户姓名和口令的字段Q它们必被分别命名为j_username和j_passwordQ表单将q二个值发送给j_security_check逻辑名字?/STRONG>
下面是一个该表单如何在HTML|页中实现的例子Q?BR><form method="POST" action="j_security_check">
<input type="text" name="j_username">
<input type="password" name="j_password">
<input type="submit" value="定"/>
</form>
q样当对get.jspq行讉KӞtomcat׃(x)自动转到l(f)ogin.jsp面实现认证。对于简单的认证Q小型系l,采用Tomcat实现容器内认证是方便的?/P>
七、对email和url地址的直接连?/STRONG>
<display:table name="test" >
<display:column property="id" title="ID" />
<display:column property="email" autolink="true" />
<display:column property="url" autolink="true" />
</display:table>
如果要显C的对象里包含email和url地址Q则可以在display:column里直接设定autolink="true"来直接连?BR>
八、用装饰模式{换数据显C(写自q decorator Q?/STRONG>
A、对整个表格应用decorator
<display:table name="test" decorator="org.displaytag.sample.Wrapper" >
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
<display:column property="date" />
<display:column property="money" />
</display:table>
org.displaytag.sample.Wrapper卌己写的decoratorQ它要承TableDecoratorc,看看它的一个方法:(x)
public String getMoney()
{
return this.moneyFormat.format(((ListObject) this.getCurrentRowObject()).getMoney());
}
很明显,它通过父类的getCurrentRowObject()Ҏ(gu)获得当前对象Q然后对其getMoney()Ҏ(gu)q行‘a(b)漆?BR> B、对单独的column应用decorator
<display:table name="test">
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
<display:column property="date" decorator="org.displaytag.sample.LongDateWrapper" />
</display:table>
org.displaytag.sample.LongDateWrapper要实现ColumnDecorator接口Q它的方法:(x)
public final String decorate(Object columnValue)
{
Date date = (Date) columnValue;
return this.dateFormat.format(date);
}
昄Q它获得不了(jin)当前对象Q因为它实现的是接口Q,仅仅是获得该对象的columnValueQ然后‘a(b)漆?BR>
?ji)、创建动态连?BR> 有两U方法创建动态连接:(x)
A、在<display:column/>里通过增加href、paramId、paramName、paramScope、paramProperty属?BR> href 基本的URL 地址
paramId 加在URL 地址后的参数名称
paramName 数据bean的名Uͼ一般ؓ(f)nullQ即使用当前List里的对象Q?BR> paramScope 数据bean的范_(d)一般ؓ(f)null
paramProperty 数据bean的属性名Uͼ用来填充URL 地址后的参数?BR><display:table name="sessionScope.details">
<display:column property="id" title="ID" href="details.jsp" paramId="id" />
<display:column property="email" href="details.jsp" paramId="action" paramName="testparam" paramScope="request" />
<display:column property="status" href="details.jsp" paramId="id" paramProperty="id" />
</display:table>
q种Ҏ(gu)便直接,但缺Ҏ(gu)无法产生cMdetails.jsp?id=xx&action=xx的复合URL
B、应用decorator 创徏动态连接:(x)
<display:table name="sessionScope.details" decorator="org.displaytag.sample.Wrapper" >
<display:column property="link1" title="ID" />
<display:column property="email" />
<display:column property="link2" title="Actions" />
</display:table>
org.displaytag.sample.Wrapper里的Ҏ(gu)Q?BR> public String getLink1()
{
ListObject lObject= (ListObject)getCurrentRowObject();
int lIndex= getListIndex();
return "<a href=\"details.jsp?index=" + lIndex + "\">" + lObject.getId() + "</a>";
}
public String getLink2()
{
ListObject lObject= (ListObject)getCurrentRowObject();
int lId= lObject.getId();
return "<a href=\"details.jsp?id=" + lId
+ "&action=view\">View</a> | "
+ "<a href=\"details.jsp?id=" + lId
+ "&action=edit\">Edit</a> | "
+ "<a href=\"details.jsp?id=" + lId
+ "&action=delete\">Delete</a>";
}
十、分?BR> 实现分页非常的简单,增加一个pagesize属性指定一ơ想昄的行数即?BR><display:table name="sessionScope.test" pagesize="10">
<display:column property="id" title="ID" />
<display:column property="name" />
<display:column property="email" />
<display:column property="status" />
</display:table>
十一、排?BR> 排序实现也是很简单,在需要排序的column里增加sortable="true"属性,headerClass="sortable"仅仅?BR> 指定昄的样式。column里的属性对象要实现Comparable接口Q如果没有的话可以应用decorator
defaultsort="1" 默认W一个column排序
defaultorder="descending" 默认递减排序
<display:table name="sessionScope.stest" defaultsort="1" defaultorder="descending">
<display:column property="id" title="ID" sortable="true" headerClass="sortable" />
<display:column property="name" sortable="true" headerClass="sortable"/>
<display:column property="email" />
<display:column property="status" sortable="true" headerClass="sortable"/>
</display:table>
注意的是Q当同时存在分页时排序仅仅针对的是当前页面,而不是整个List都进行排?BR>
十二、column 分组
分组只是需要在column里增加group属?BR><display:table name="test" class="simple">
<display:column property="city" title="CITY" group="1"/>
<display:column property="project" title="PROJECT" group="2"/>
<display:column property="amount" title="HOURS"/>
<display:column property="task" title="TASK"/>
</display:table>
十三、导出数据到其他格式Q页面溢出filter??Q?/STRONG>
?lt;display:table/>里设定export="true"
?lt;display:column/>里设定media="csv excel xml pdf" 军_该字D在导出到其他格式时被包不包含,不设定则都包?BR> <display:setProperty name="export.csv" value="false" />
军_该种格式能不能在面中导?BR><display:table name="test" export="true" id="currentRowObject">
<display:column property="id" title="ID"/>
<display:column property="email" />
<display:column property="status" />
<display:column property="longDescription" media="csv excel xml pdf" title="Not On HTML"/>
<display:column media="csv excel" title="URL" property="url"/>
<display:setProperty name="export.pdf" value="true" />
<display:setProperty name="export.csv" value="false" />
</display:table>
十四、配|属性,覆盖默认
两种Ҏ(gu)Q?BR> A、在E序classpath下新建displaytag.properties文g
B、对于单个表|应用<display:setProperty>标签
具体可配|的属性:(x)http://displaytag.sourceforge.net/configuration.html
十五、一个完整的例子
<display:table name="test" export="true" sort="list" pagesize="8">
<display:column property="city" title="CITY" group="1" sortable="true" headerClass="sortable"/>
<display:column property="project" title="PROJECT" group="2" sortable="true" headerClass="sortable"/>
<display:column property="amount" title="HOURS"/>
<display:column property="task" title="TASK"/>
</display:table>
sort="list" Ҏ(gu)个listq行排序
导出数据到其他格式时Qgroup无效