之前还在纠结的问题就是,网上找到的资料太简单都不知道是什么,然后自己在公司的框架下成功跑起来一个导出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下面的类我也没有搞明白,总之需要继续学习。学习进度本身落后的情况下,更不能停滞不前。