之前还在纠结的问题就是,网上找到的资料太简单都不知道是什么,然后自己在公司的框架下成功跑起来一个导出txt文本文件的功能,趁着今天有点时间而且书忘记带,写下来。
当然我的方法也不过只是其中一个的方法,肯定有其他方法,而且我的也不一定通用。仅供学习之用。
首先创建两个关于导入txt文本文件的类,这两个类也是我模仿框架里写了Excel的模块写的。
首先创建类BaseTxtView注意这个类继承Spring的AbstractView
import java.io.BufferedOutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.servlet.view.AbstractView;
public abstract class BaseTxtView extends AbstractView
{
private static Logger log = LogManager.getLogger(BaseTxtView.class);
private static final String CONTENT_TYPE = "text/plain";
private static final String EXTENSION = ".txt";
private String url;
private String txtName;
public BaseTxtView(String txtName)
{
this.txtName = txtName;
setContentType(CONTENT_TYPE);
}
public void setUrl(String url)
{
this.url = url;
}
@Override
protected boolean generatesDownloadContent()
{
return true;
}
public final void renderMergedOutputModel(ArrayList<String> errorStrs,HttpServletRequest request, HttpServletResponse response) throws Exception {
buildTxtDocument(request, response);
// Set the content type.
response.setContentType(getContentType());
response.setHeader("Content-Disposition", "attachment; filename="
+ URLEncoder.encode(txtName, "UTF-8")+EXTENSION);
// Should we set the content length here?
// response.setContentLength(workbook.getBytes().length);
BufferedOutputStream buff = null;
StringBuffer write = new StringBuffer();
String enter = "\r\n";
// Flush byte array to servlet output stream.
ServletOutputStream out = response.getOutputStream();
buff = new BufferedOutputStream(out);
for(int i = 0;i < errorStrs.size();i++)
{
write.append(errorStrs.get(i));
write.append(enter);
}
buff.write(write.toString().getBytes("UTF-8"));
buff.flush();
buff.close();
out.flush();
out.close();
}
protected abstract void buildTxtDocument(HttpServletRequest request, HttpServletResponse response)
throws Exception;
public void setTxtName(String txtName) {
this.txtName = txtName;
}
public String getTxtName() {
return txtName;
}
}
再创建类ReportTxtView继承上面的类
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ReportTxtView extends BaseTxtView{
public ReportTxtView(String txtName) {
super(txtName);
}
@Override
protected void buildTxtDocument(HttpServletRequest request, HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
}
}
然后在Controller里面引用类和类中的导入方法,注意ModelAndView这个类的使用。
@Controller
@RequestMapping("/export")
public class CommonController extends {
@RequestMapping("/exportTxt")
public ModelAndView exportErrTxt(String[] errStr,HttpServletRequest request,HttpServletResponse response){
ReportTxtView reportTxtView = new ReportTxtView(errStr[errStr.length-2]+errStr[errStr.length-1]);
ArrayList<String> errLst = new ArrayList<String>();
for(int i = 0; i < errStr.length-2; i++){
errLst.add(errStr[i]);
}
try {
reportTxtView.renderMergedOutputModel(errLst, request, response);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new ModelAndView(reportTxtView);
}
}
最后在jsp页面调用Controller中的方法,页面这个目录可能存在问题,总之大概是这个意思。
function export() {
window.location.href = PATH+"hr/common/exportErrTxt.do?errStr="+result.backParam;
}
当然这里面很多地方我没有注释,因为很多Spring下面的类我也没有搞明白,总之需要继续学习。学习进度本身落后的情况下,更不能停滞不前。