最近与木木一起做毕设。作为一个新手,在这里总结开发项目时的一些经验。供诸君参考。
关于Struts
- <url-pattern></url-pattern>:经常用到的是两种地址格式,即/*和*.action,/*包括*.action。 也就是当服务器接收地址的格式,是以"/"(斜杠)分割的格式,还是以".action"为后缀的格式。一般设置为/*就好了,如果设置为*.action,那么进入主页都需要使用action来触发。
- xxxxx.action is not available:当出现login.action不能被触发时,通常是有以下几个原因:
- structs.xml中真的没有定义login.action,或者你粗心大意地写成了logim.action;
- login.action所在的pakage没有被structs.xml引入或者包名不正确;
- action标签中的类名或方法名有误。
- 要想对表格中的一行进行表单提交,可以直接用<form>标签将<tr>包含即可,MyEclipse会提示警告,但确实可以提交。
- 男女搭配,干活不累。
关于Hibernate
- 在对类进行查询时,也可以获取类的对象成员的数据,可以通过类的Set、List成员获取相应的其它类成员集。后者经常是数据库上就是两个表的主外键关系。通过在Hibernate配置文件中设置这些数据成员的Lazy属性,可以立即或延迟加载它们。
- 当Lazy属性为True时,类的对象成员和Set(或List)成员会直到使用它们的时候才会加载它们,也就是不为空指针。但是如果Session已经关闭,那么就无法延迟加载了。
关于iReport
- Error Evaluating Expression: Source Text: new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{XXX})
看了网上的一个可能的解决办法:Bruce Phillips Blog on Java, ColdFusion, Flex and Spry: Using The JasperReports Struts2 Plugin, A Main Report, And A Subreport
- 使用iText和Struts2.x在服务器临时生成PDF供下载:
页面链接 index.jsp
<a href="downloadPDF.action">下载PDF文件</a>
action设置
<package name="DownloadManager" extends="struts-default">
<action name="downloadPDF" class="com.demo.action.PDFDownloadAction">
<result name="success" type="stream">
<param name="contentType">application/pdf</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">attachment;filename="${reportName}.pdf"</param>
<param name="bufferSize">4096</param>
</result>
</action>
</package>
Java Action类代码
package com.demo.action;
import org.apache.struts2.ServletActionContext;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfDocument;
import com.itextpdf.text.pdf.PdfWriter;
import com.opensymphony.xwork2.ActionSupport;
public class PDFDownloadAction extends ActionSupport
{
private String inputPath;
private String reportName="foodTrace";
public String getInputPath() {
return inputPath;
}
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
/**
* 设置生成PDF报告的中文名称
*/
public String getReportName() {
try {
reportName=new String("华丽的逆转".getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return reportName;
}
public void setReportName(String reportName) {
this.reportName = reportName;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
public InputStream getTargetFile()
{
// System.out.println(inputPath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayInputStream bais=null;
// 建立PDF文档
Document document = new Document(PageSize.A4);
try {
/*文档与输出流建立连接*/
PdfWriter.getInstance(document, baos);
/*打开文档*/
document.open();
/*设置中文字体*/
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);
/*添加PDF段落*/
Paragraph paragraph=new Paragraph("这种华丽的逆转", FontChinese);
paragraph.add(new Paragraph("Hello iText!"));
document.add(paragraph);
/*关闭文档*/
document.close();
/*得到输入流*/
bais = new ByteArrayInputStream(baos.toByteArray());
baos.close();
} catch (Exception e) {
e.printStackTrace();
}
return bais;
// 本地文件下载时使用
// return ServletActionContext.getServletContext()
// .getResourceAsStream(inputPath);
}
}
生成的PDF
还不错吧!