??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
1.满搜烦引擎的要?
2.隐藏技术实玎ͼ提高|站的移植?
3.满感的要?个h感觉q个用处太牵?
目部v
1.首先在http://tuckey.org/urlrewirte/下蝲urlrewirtefilter
2.解压所下蝲的文?把urlrewrite-2.6.0.jar复制到项目的WebRoot/WEB-INF/lib/目录?然后~译
3.把urlrewrite.xml复制到项目的WebRoot/WEB-INF/目录?
4.在web.xml文g中加入以?
type="redirect"
>/user/list.jsp</to> type="redirect"
>/user/view.jsp?cid=$1&cname=$2</to> 2、Foreach 和For一样?/p>
3、Hiddenlg L多余S的处?br /> <input jwcid="@Hidden" type="hidden" value="ognl:blahblah" encode="false"/>
4?Insert lg
e.g.
<input type="text" jwcid="name@Insert" value="ognl:user.name"/>
面表现?会到页面类中寻找getUser().getName()Ҏ获取初值ƈ输出
相当于在面上显C数?
5?TextField lg
e.g.
<input type="text" jwcid="username@TextField" value="ognl:username"/>
面表现?会到页面类中寻找getUsername()Ҏ获取初?
*如果是修改信息页?通常初始D在页面表C前由setUsername()手动讄从数据库中读取出来的?
表单提交?通过setUsername()写入新?即用戯入?,在类中通过getUsername()获取新?
相当于在修改个h信息?首先d用户名赋予文本框(用户?初?用户修改时填入新?后台获取?
*Hidden属性区分是普通文本输入框(默认false)和密码输入框(hidden="ognl:true")
readonly属性设|只?readonly="true"为只?后台可读?
*disabled属性设|是否可?diabled="true"Z可写(后台也不可读?
6?TextArea lg
e.g.
<textarea jwcid="content@TextArea" value="ognl:content" cols="40" rows="10"></textarea>
面表现?会到页面类中寻找getContent()Ҏ获取初?
工作原理同TextField
7?RadioGroup/Radio lg
e.g.
<span jwcid="headImage@RadioGroup" selected="ognl:headImage">
<input jwcid="@Radio" type="radio" value="1"/>头像1
<input jwcid="@Radio" type="radio" value="2"/>头像2
<input jwcid="@Radio" type="radio" value="3"/>头像3
<input jwcid="@Radio" type="radio" value="4"/>头像4
<input jwcid="@Radio" type="radio" value="5"/>头像5
<input jwcid="@Radio" type="radio" value="6"/>头像6
</span>
RadioGroup为每一个Radio提供一个唯一的ID。RadioGroup跟踪当前被选中的属性|q且只有一个Radio能够被选中.
面提交ӞRadioGrouplg利用OGNL表达式向headImage字段写入被选中的Radiolg的value参数?
面表现?修改面),会到页面类中寻找getHeadImage()Ҏ获取初?然后L@Radiolg中与其相同的lgq勾选上.
8?PropertySelection lg
使用PropertySelectionlg必须要构造一个类来实现IPropertySelectionModel接口Qƈ且重写该接口?个方?
public int getOptionCount() //提供下拉菜单的长?
public Object getOption(int index) //提供select标签的option
public String getLabel(int index) //提供select标签的Label|也就是下拉菜单显C的内容
public String getValue(int index) //提供select标签的value?
public Object translateValue(String value) //selected后的q回|value值未必就是我们需要的q回|可以在这个方法里面对q回的value做对应的转换或修?
e.g.1. 性别下拉?
<select jwcid="gender@ProPertySelection" name="genderSelect" value="ognl:gender" model="supportedGender">
<option selected>先生</option>
<option>奛_</option>
</select>
代码
GenderSelectionModel.java
public class GenderSelectionModel implements IPropertySelectionModel {
public static final String male = "先生";
public static final String female = "奛_";
public static final String[] genderOptions = { male, female };
public int getOptionCount() {
return genderOptions.length;
}
public Object getOption(int index) {
return this.translateValue(genderOptions[index]);
}
public String getLabel(int index) {
return genderOptions[index].toString();
}
public String getValue(int index) {
return genderOptions[index];
}
public Object translateValue(String value) {
if (value.equals("先生")) {
return "1";
} else {
return "0";
}
}
}
代码
ModUserInfo.java
public IPropertySelectionModel getSupportedGender() {
return new GenderSelectionModel();
}
存入数据库中"1"代表先生,"0"代表奛_,通过translateValue(String value)Ҏ转换
面表现?通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedGender().
然后通过getGender()Ҏ获取初?比如获取"0",则在面昄时寻找valuegؓ"0"的选项即ؓ"奛_",q择之作为初始选择?
e.g.2. 日志cd下拉?
<select jwcid="logType@PropertySelection" name="typeSelect" value="ognl:logType" model="supportedType">
<option>心情日记</option>
<option>情感天地</option>
<option>生活感触</option>
</select>
代码
TypeSelectionModel.java
public class TypeSelectionModel implements IPropertySelectionModel {
private List typeList = new ArrayList();
public TypeSelectionModel(List typeList) {
this.typeList = typeList;
}
public int getOptionCount() {
return typeList.size();
}
public Object getOption(int index) {
return ((LogType)typeList.get(index)).getValue();
}
public String getLabel(int index) {
return ((LogType) typeList.get(index)).getName();
}
public String getValue(int index) {
return ((LogType) typeList.get(index)).getValue();
}
public Object translateValue(String value) {
return value;
}
}
代码
ModLog.java
public IPropertySelectionModel getSupportedType() {
TypeSelectionModel typeSelectionModel =
new TypeSelectionModel(loadType(getUser().getUserId()));
return typeSelectionModel;
}
private List loadType(int userid) {
...//从数据库载入该用L日志cd列表
}
面表现?通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedType().
然后通过value属性给出的初始值即,getLogType()Ҏ获取初?比如获取"2",则在面昄时寻找valuegؓ"2"的选项即ؓ"生活感触",q择之作为初始选择?
9?Formlg
e.g.
<form jwcid="logForm@Form">
...
</form>
Form的监?listener)Ҏ可以有两U方?
1. 在Formlg中声?
<form jwcid="logForm@Form" listener="ognl:listener:onLogin">
...
</form>
2. 在submitcdlg中声?
<input type="submit" jwcid="onLogin@Submit" listener="listener:onLogin" value="发表"/>或?
<span jwcid="@ImageSubmit" image="..." listener="listener:onLogin"><img src="..." width="" height=""/></span>
前一U方式当Form中只要有submit׃触发监听Ҏ,后一U方式是Form中有多个submit,各自实现不同的监听方?
G) Foreach lg
e.g.
<span jwcid="@Foreach" source="ognl:logList" value="ognl:item">
循环lg,遍历source参数,在表现其内容前更新value参数,Foreachlg所包含的内定w复表?其中可以通过value参数获取所需昄内容.
本例?面表现旉过getLogList()Ҏ获取日志列表,循环取出其中数据更新item(日志对象)q予以显C?其中item需要在面规范(.page)文g中声?
<property name="item"/>
*class参数用来LcMCSS的文件对Foreachq行修饰.
Foreachlg: class="ognl:beans.evenOdd.next"
Page文g: <bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd"/>
CSS文g: tr.odd{background-color: #ffffff;}tr.even{background-color: #eeeeee;}
10?Conditional lg
e.g.
<span jwcid="@Conditional" condition='ognl:item.sex.equals("1")'>先生</span>
<span jwcid="@Conditional" condition='ognl:item.sex.equals("0")'>奛_</span>
conditional参数为true时运行Conditionallg中的HTML模板内容.
在Tapestry4.0以后׃支持该组件了, 可以使用其他lg来实?
1. Contrib:Choose和Contrib:When
<library id="contrib" specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/>(.application文g中引入Contribcd)
<span jwcid="@contrib:Choose">
<span jwcid="@contrib:When" condition='ognl:user.gender.equals("1")'>先生</span>
<span jwcid="@contrib:When" condition='ognl:user.gender.equals("0")'>奛_</span>
</span>
2. Iflg
<span jwcid="@If" condition='ognl:item.sex.equals("1")'>先生</span>
<span jwcid="@If" condition='ognl:item.sex.equals("0")'>奛_</span>
3. Elselg
<span jwcid="@Else">man</span>
?===========================ts的函数执行顺?=======================================?br />
对之前的该文章进行了一些修正,主要是针对finishLoad()Ҏ?
我觉得对初学者会有一些帮助?
下面q几个函数是我在使用的,它们的执行顺序依ơ从上到下?
1.protected void finishLoad() {} ***
2.public void pageValidate(PageEvent event) {}
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {}
4.public void pageBeginRender(PageEvent event) {}
// 如果有表单提交,则将form中的各字D늚Dl页面类
5. ...... 赋?
6.public void submit() // 表单提交{用listenter:调用的方?
7.protected void prepareForRender(IRequestCycle cycle) {}
----------------------------------------------------
1.protected void finishLoad() {}
q个函数最先执行,但是它实际上没有什么用处(我感觉)。因为:
q个函数只在面池中没有某一个页面类、需要生成一个新的页面对象时才调用。这里就有一个陷阱:如果你的tomcat启动时用了-Dorg.apache.tapestry.disable-caching=true(Z调试方便而设)Q那么你每次h面Ӟ它都会执行(因ؓ每个request都会新生成一个页面类对象Q,造成了它L执行的假象。在实际的部|时Q会使用cachingQ则q个函数执行的机会很。所以要注意?
初始化的代码攑֜4 pageBeginRender()?
2.public void pageValidate(PageEvent event) {}
如果实现了PageValidateListener接口Q则可以在这里进行验证,比如讉K权限{。执行完1后,它就开始执行?
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {}
如果实现了IExternalPage接口Q则可以从这里取得由外面传过来的参数。执?后,执行到这里。在q里可以把那些参数取出,赋给面cR?
4.public void pageBeginRender(PageEvent event) {}
执行?后,执行本函数。但是这时从客户端传q来的参数还没有被赋?如果提交了表单的?。这里可以进行一些初始化操作?
5.执行?后,如果有表单提交,在这里将会取出那些|赋给对应的字Dc?注意Q只是将表单中有的Dq来)
6.public void submit()
如果有表单提交的话,在这里将q行对应的操作。因为此时各字段已经取好gQ所以可以拿来直接用?
7.protected void prepareForRender(IRequestCycle cycle) {}
最后才执行q个Ҏ。我们可以在其中q行Z在页面上昄数据而进行的操作Q比如取得什么对象什么的Q因里页面类的属性赋值已l结束,可以直接拿来使用了?
注意Q如果执行了6Q则q要执行4Q再执行7。如果没?Q?完了q接是7?
以上是我所ȝ的执行顺序,不当之处h出?nbsp;
-----------------------------------------------------
最开始学tapestry的时候,觉得“怎么有这么多地方需要持久啊”。原来以前只知道pageBeginRenderq个函数Q什么初始化操作都放在它里面。可是它是在赋g前执行,所以拿到的字段多都是空的,却都以ؓ是没有持久化的缘故。所以在客户端里放了一大堆的@HiddenQ或者session中持久,非常ȝQ,Q对tapestry也生的怀疑。现在才知道那些需要取得客L传来的参数的代码Q最好放在prepareForRender里,很多不必要的持久都可以省掉了
package dom_xml;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Attribute;
import java.util.List;
import java.util.Iterator;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.*;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.dom4j.DocumentHelper;
public class XmlDom4J {
/**
* 生成xml文gQ?br />
*
*/
public void createXMLFile(){
//使用 DocumentHelper cdZ个文实例?DocumentHelper 是生?XML 文节点?dom4j API 工厂cR?br />
Document document=DocumentHelper.createDocument();
//使用 addElement() Ҏ创徏根元?catalog 。addElement() 用于?XML 文中增加元素?br />
Element catalogElement = document.addElement("catalog");
//?catalog 元素中?addComment() Ҏd注释“An XML catalog”?br />
catalogElement.addComment("An XML Catalog");
//?catalog 元素中?addProcessingInstruction() Ҏ增加一个处理指令?br />
catalogElement.addProcessingInstruction("target","text");
//?catalog 元素中?addElement() Ҏ增加 journal 元素?br />
Element journal=catalogElement.addElement("journal");
//使用 addAttribute() Ҏ?journal 元素d title ?publisher 属性?br />
journal.addAttribute("title", "XML Zone");
journal.addAttribute("publisher", "IBM Devoloperment");
//d节点journal的子节点article,q设|其属性;
Element articleElement=journal.addElement("article");
articleElement.addAttribute("level", "Intermediate");
articleElement.addAttribute("date", "December-2008");
//d节点articleElement的子l点title,q?setText() Ҏ讄其元素的文本?br />
Element titleElement=articleElement.addElement("title");
titleElement.setText("又是下雨?);
//d节点articleElement的子l点author.d子结点的子结点firstname、lastname,q设|其文gQ?br />
Element authorElement=articleElement.addElement("author");
Element firstNameElement=authorElement.addElement("firstname");
firstNameElement.setText("Marcello");
Element lastNameElement=authorElement.addElement("lastname");
lastNameElement.setText("Vitaletti");
//可以使用 addDocType() Ҏd文cd说明?br />
XMLWriter output;
try {
OutputFormat format=new OutputFormat();
format.setEncoding("gb2312");
output = new XMLWriter(
new FileWriter(new File("catalog.xml")),format);
output.write(document);
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 修改xml文g指定节点的属性;
* @param inputXml xml文g?br />
* @oldAttributeValue 原属性;
* @attributeValue 要修Ҏ的|
* @param XPath 要修改节点属性的表达式;如:"http://article/@level" 则表CZ改节点level(父节点ؓarticle)的属?br />
* 特别说明:@后面表示的是属?
*/
public Document modifyXMLNodeAttributeByName(File inputXml, String XPath,String oldAttributeValue,String attributeValue) {
if(XPath.indexOf("@")<0){
System.out.println("参数XPath无效,请在要修改的属性前加入'@'");
return null;
}
SAXReader saxReader = new SAXReader();
Document document=null;
try {
document = saxReader.read(inputXml);
List list = document.selectNodes(XPath);
Iterator iter = list.iterator();
while (iter.hasNext()) {
Attribute attribute = (Attribute) iter.next();
if (attribute.getValue().equals(oldAttributeValue))//把原属性修改ؓ新的属性;
attribute.setValue(attributeValue);
}
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
/**
* 修改指定节点的属性|
* @param inputXml xml文g?br />
* @param XPath 要修改节点属性的表达式;如:"http://article/@level" 则表CZ改节点level(父节点ؓarticle)的属?br />
* @param attributeValue 属性新|
*/
public Document modifyXMLNodeAttributeByName(File inputXml, String XPath,String attributeValue) {
if(XPath.indexOf("@")<0){
System.out.println("参数XPath无效,请在要修改的属性前加入'@'");
return null;
}
SAXReader saxReader = new SAXReader();
Document document=null;
try {
document = saxReader.read(inputXml);
List list = document.selectNodes(XPath);
Iterator iter = list.iterator();
while (iter.hasNext()) {
Attribute attribute = (Attribute) iter.next();
//把原属性修改ؓ新的属性;
attribute.setValue(attributeValue);
}
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
/**
* 获取某一节点的属性|
* @param inputxml xml文gQ?br />
* @param XPath
* @return
*/
public String[] getNodeAttributeValue(File inputxml,String XPath){
String nodeAttri="";//储存节点属性?
if(XPath.indexOf("@")<0){
return null;
}
SAXReader saxReader=new SAXReader();
Document document=null;
try{
document=saxReader.read(inputxml);
List list=document.selectNodes(XPath);
Iterator it=list.iterator();
while(it.hasNext()){
Attribute attri=(Attribute)it.next();
nodeAttri+=attri.getValue()+",";
}
}catch(Exception e){
e.printStackTrace();
}
if(nodeAttri.length()>0){
nodeAttri=nodeAttri.substring(0, nodeAttri.length()-1);
}
return nodeAttri.split(",");
}
/**
* 修改指定节点的文本|
* @param inputXml
* @param XPath 要修改节点属性的表达式;如:"http://article/@level" 则表Carticle节点下的所有level节点的文本;
* @param newText 新的文本|
*/
public Document modifyXMLNodeTextByName(File inputXml,String XPath,String newText){
if(XPath.indexOf("@")>=0){
System.out.println("参数XPath无效!");
return null;
}
SAXReader saxReader = new SAXReader();
Document document=null;
try {
document=saxReader.read(inputXml);
List list= document.selectNodes(XPath);
Iterator iter = list.iterator();
while(iter.hasNext()){
Element elementText=(Element)iter.next();
elementText.setText(newText);
}
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
/**
* 替换指定节点文本的倹{?br />
* @param inputXml xml文g?br />
* @param XPath 要修改节点属性的表达式;如:"http://article/level" 则表Carticle节点下的所有level节点的文本;
* @param oldText 原文?br />
* @param newText 新文本;
*/
public Document modifyXMLNodeTextByName(File inputXml,String XPath,String oldText,String newText){
if(XPath.indexOf("@")>=0){
System.out.println("参数XPath无效!");
return null;
}
SAXReader saxReader = new SAXReader();
Document document=null;
try {
document=saxReader.read(inputXml);
List list= document.selectNodes(XPath);
Iterator iter = list.iterator();
while(iter.hasNext()){
Element elementText=(Element)iter.next();
if(elementText.getText().equals(oldText))
elementText.setText(newText);
}
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
/**
* 获取某一节点的文本内容;
* @param inputxml xml文gQ?br />
* @param XPath
* @return
*/
public String[] getNodeTextValue(File inputxml,String XPath){
String nodeTextValue="";//储存节点属性?
if(XPath.indexOf("@")>=0){
return null;
}
SAXReader saxReader=new SAXReader();
Document document=null;
try{
document=saxReader.read(inputxml);
List list=document.selectNodes(XPath);
Iterator it=list.iterator();
while(it.hasNext()){
Element text=(Element)it.next();
nodeTextValue+=text.getText()+",";
}
}catch(Exception e){
e.printStackTrace();
}
if(nodeTextValue.length()>0){
nodeTextValue=nodeTextValue.substring(0, nodeTextValue.length()-1);
}
return nodeTextValue.split(",");
}
/**
* 保存xml文g;
* @param document xml文g?
* @param filePath 文g存储的全路径(包括文g?
* @code 储存的编?
*/
public void saveXmlFile(Document document,String filePath,String code){
if(document==null){
return ;
}
XMLWriter output;
try {
OutputFormat format=new OutputFormat();
format.setEncoding(code);
output = new XMLWriter(new FileWriter(new File(filePath)),format);
output.write( document );
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 试Q?br />
public static void main(String[] args){
XmlDom4J dom4jParser=new XmlDom4J();
//生成XML
//dom4jParser.createXMLFile();
File file=new File("D:/MyWork/operateXMLfile/catalog.xml");
//dom4jParser.saveXmlFile(document, "F://test.xml", "GBK");
/*String[] attrArray=dom4jParser.getNodeAttributeValue(file, "http://article/@level");
if(attrArray!=null){
for(int i=0;i<attrArray.length;i++){
System.out.println("Attribute is :"+attrArray[i]);
}
}*/
String[] nodeText=dom4jParser.getNodeTextValue(file, "http://article/title");
if(nodeText!=null){
for(int i=0;i<nodeText.length;i++){
System.out.println("NODE TEXT IS:"+nodeText[i]);
}
}
}
}
xml文g定义如下Q?
<?xml version="1.0" encoding="gb2312"?>
<catalog><!--An XML Catalog--><?target text?>
<journal title="XML Zone" publisher="IBM Devoloperment">
<article level="学四年U? date="December-2008"><title>又是下雨?lt;/title>
<author><firstname>Marcello</firstname><lastname>Vitaletti</lastname></author></article>
<article level="大学四年U? date="2008-04-01"><title>太阳出来?lt;/title>
<author><firstname>Marcello</firstname><lastname>Vitaletti</lastname></author></article>
</journal></catalog>
下面介绍几个Display最常用的功能,更多功能请参?a >http://displaytag.homeip.net/displaytag-examples-1.1/?br />
1. 分页
如果惛_代码分页Q只需在display:table标签中添加一pagesize="每页昄行数"Q如
<display:table name="test" pagesize="10"/>
2. 对列排序
display tag可对列进行排序,是点击列名Q对该列的数据进行排序。你只需Ҏ要排序的列添?sort="true" OKQ如下面的代码可对前三列q行排序。在display:table中添加defaultsort="列数"Q可默认Ҏ定的列排序?br />
<display:table name="test" styleClass="list" cellspacing="0" cellpadding="0" defaultsort="1">
<display:column property="id" title="ID" class="idcol" sort="true"/>
<display:column property="name" url="detail.jsp" paramId="id" paramProperty="id" sort="true"/>
<display:column property="email" autolink="true" sort="true"/>
<display:column property="description" title="Comments"/>
</display:table>
如果table有分,Display Tag默认只对当前进行排序,如果惛_整个list排序Q可以在display:table之间d一D代码:
<display:setProperty name="sort.amount" value="list"/>
3. 导出数据
在display:table中添加export="true"Q看看会出现什么!Display Tag默认会提供三U数据导出方式:CSV、Excel、XML ?br />
另外Display Tagq可以导ZؓPDF格式Q在http://prdownloads.sourceforge.net/itext/下蝲一个辅助包iText.jarQcopy到lib目录下,然后在display:table之间d一D代码:
<display:setProperty name="export.pdf" value="true"/>Q大功告成?/p>
4. Display Tag的属性设|?br />
前面所说的display:setProperty 是一U改变Display Tag属性的ҎQ但是在每个jsp中都要写太麻烦了?br />
Display Tag中设|了很多默认的属性,它有一个专门的属性文Ӟ是在它的jar包中的displaytag/properties/TableTag.properties
惌改变它的默认属性,我们可以在WEB-INF\classes下新Z个文件displaytag.propertiesQ仿照TableTag.properties中属性的格式讄需要修改的属性?br />
TableTag.properties中的# messages中设|的是显C在面上的提示信息。默认是英文的,我们可以把它改ؓ中文的。不q这里只能用unicodeQ就是说中文字符必须转换为unicode码,q个可以使用jdk自带的native2ascii.exeq行转换?/p>
5. 其它功能
DisplayTagq有一些很实用的小功能Q这里提两个。一个是Ҏ据的FormatQ这?.1版本d的新功能Q可以用标{方式格式化时间、数字、字W串。比如日期,在需要格式化的column标签中添加format="{0,date,yyyy-MM-dd}"Q第一个参Cؓ格式化的数据序号Q第二个参数是数据类型,数字为numberQ第三个参数为数据格式?br />
另外一个功能是对table数据的合计功能。在table标签中添?decorator="org.displaytag.decorator.TotalTableDecorator"Q然后在惌q行合计的数据列的column标签中添?total="true"Q该列就可以被计L了。但q个功能有个~点Q不能用在有分页的时候,它只能合计第一늚数据?br />
DisplayTag的不?br />
初次使用DisplayTag的h可能会觉得惊喜,但是用久了会发现很多问题Q最大的问题是对中文的支持不好,比如如果查询条g中有中文Q就无法页Q无法对中文排序Q将中文导出为指定文件时出现q{等。这些问题有时候会让h很郁P有时候逼得你要M改它的源代码。下面是对以上几个问题的解决ҎQ?br />
1. 对于中文无法页、排序,最单的办法是修改Tomcat下的server.xml文g。找到HTTP的Connector标签Q在里面d一URIEncoding="..."Q引号里面的内容取决于你的页面编码,比如可以是GBKQUTF8{。这样上面两个问题就可以解决了?br />
2. 导出为文Ӟ其实q个功能除了中文支持外还有很多其它问题,比如它会Html标签一起导出、只导出昄的内容,但如果对tableq行了decoratorQdecorator后的内容无法导出。如果想要将中文正确导出Q需要修改DisplayTag源代码?br />
下蝲相同版本的源代码Q在org.displaytag.export.ExcelView.java文g中找到getMimeType()ҎQ将此方法修改ؓ return "application/vnd.ms-excel;charset=GB2312";Q修改后导出数据的速度会慢很多Q不q将吧?br />
3. 新版的DisplayTag1.1d了对一ơ取部分数据的支持,相关的标{括partialList和sizeQ需要设|partialList="true"和size的大。具体怎么用偶q没研究?br />
q解决Q?/strong>
tomcat/jboss 修改server.xml
<Connector port="8001" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" /> |
<Connector port="8001" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" /> |
在其中添?strong style="color: black; background-color: #a0ffff">URIEncoding="GBK" Q或者是其他的编码方式,变成如下Q?/font>
<Connector port="8001" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" /> |
3、停止Tomcat服务Q重新启动Tomcat服务卛_?/font>
【另?strong style="color: black; background-color: #ffff66">Weblogic容器处理~码的方式?/font>
处理Weblogic容器的编码比较简单,只需要在站点的web.xml中配|一行如下的代码卛_?/font>
<context-param> <param-name>weblogic.httpd.inputCharset./*</param-name> <param-value>GBK</param-value> </context-param> |
【另附Tomcat处理POST提交q的方式?/font>
<filter> <filter-name>SetCharacterEncodingFilter</filter-name> <filter-class> cn.cublog.jedliu.SetCharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> |
<filter-mapping> <filter-name>SetCharacterEncodingFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> |
2、在cn.cublog.jedliu包中SetCharacterEncodingFilter是用于来实现~码的过滤器?/font>
|