JAVA通过poi对Excel数据在(jsp+ssh)环境下导入导出
POI的下载与安装
请到网站http://www.apache.org/dyn/closer.cgi/poi/右击超链接2.5.1.zip下载压缩包poi-bin-2.5.1-final-20040804.zip(或下载最新的这种压缩包),解压缩后得到如图2.1所示的目录结构。我们主要用到poi-2.5.1-final-20040804.jar这个库文件。请把poi-2.5.1-final-20040804.jar这个文件的路径添加到系统环境变量classpath中,否则无法编译下面的示例程序。
1. 首先搭建ssh框架(这儿不做介绍);
2. 导入jar包(如下):
3. 导出:(下面以一个例子的形式)
1. 新创建一个jsp页面如(export.jsp),在页面上添加如下代码:
<a href="<%=path %>/indexAction!export.action">导出数据到excel</a>
2. 进入indexAction.java文件,编写export方法由于要用到一个STUDENT类,就先编写STUDENT类,Student类代码如下:
public class Student {
private String studentId;
private String studentName;
private String studentSex;
private String studentDormitory;
private String studentSept;
public String getStudentId() {
return studentId;
}
public void setStudentId(String studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentSex() {
return studentSex;
}
public void setStudentSex(String studentSex) {
this.studentSex = studentSex;
}
public String getStudentDormitory() {
return studentDormitory;
}
public void setStudentDormitory(String studentDormitory) {
this.studentDormitory = studentDormitory;
}
public String getStudentSept() {
return studentSept;
}
public void setStudentSept(String studentSept) {
this.studentSept = studentSept;
} }
编写export方法:代码如下
此类中需要导入的jar包如下:
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFHeader;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext; public String export()throws Exception
{ List studentList=new ArrayList<Student>();//学生LIst for(int i=0;i<10;i++)
{ Student student=new Student();//学生对象
student.setStudentId("200908110"+i);
student.setStudentName("杨波"+i);
student.setStudentSex("男");
student.setStudentDormitory("14-20"+i);
student.setStudentSept("软件工程系");
studentList.add(student);
} String []tableHeader={"学号","姓名","性别","寝室号","所在系"}; short cellNumber=(short)tableHeader.length;//表的列数
HSSFWorkbook workbook = new HSSFWorkbook(); //创建一个excel
HSSFCell cell = null; //Excel的列
HSSFRow row = null; //Excel的行
HSSFCellStyle style = workbook.createCellStyle(); //设置表头的类型
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFCellStyle style1 = workbook.createCellStyle(); //设置数据类型
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
HSSFFont font = workbook.createFont(); //设置字体
HSSFSheet sheet = workbook.createSheet("sheet1"); //创建一个sheet
HSSFHeader header = sheet.getHeader();//设置sheet的头
try {
if(studentList.size() < 1 ){
header.setCenter("查无资料");
}else{
header.setCenter("学生表");
row = sheet.createRow(0);
row.setHeight((short)400);
for(int k = 0;k < cellNumber;k++){
cell = row.createCell(k);//创建第0行第k列
cell.setCellValue(tableHeader[k]);//设置第0行第k列的值
sheet.setColumnWidth(k,8000);//设置列的宽度
font.setColor(HSSFFont.COLOR_NORMAL); // 设置单元格字体的颜色.
font.setFontHeight((short)350); //设置单元字体高度
style1.setFont(font);//设置字体风格
cell.setCellStyle(style1);
} for(int i = 0 ;i < studentList.size() ;i++){
Student student1 = (Student)studentList.get(i);//获取student对象
row = sheet.createRow((short) (i + 1));//创建第i+1行
row.setHeight((short)400);//设置行高 if(student1.getStudentId() != null){
cell = row.createCell(0);//创建第i+1行第0列
cell.setCellValue(student1.getStudentId());//设置第i+1行第0列的值
cell.setCellStyle(style);//设置风格
}
if(student1.getStudentName() != null){
cell = row.createCell(1); //创建第i+1行第1列 cell.setCellValue(student1.getStudentName());//设置第i+1行第1列的值 cell.setCellStyle(style); //设置风格
}
//由于下面的和上面的基本相同,就不加注释了
if(student1.getStudentSex() != null){
cell = row.createCell(2);
cell.setCellValue(student1.getStudentSex());
cell.setCellStyle(style);
}
if(student1.getStudentDormitory()!= null){
cell = row.createCell(3);
cell.setCellValue(student1.getStudentDormitory());
cell.setCellStyle(style);
}
if(student1.getStudentSept() != null){
cell = row.createCell(4);
cell.setCellValue(student1.getStudentSept());
cell.setCellStyle(style);
} } } } catch (Exception e) {
e.printStackTrace();
} HttpServletResponse response = null;//创建一个HttpServletResponse对象
OutputStream out = null;//创建一个输出流对象
try {
response = ServletActionContext.getResponse();//初始化HttpServletResponse对象
out = response.getOutputStream();// StringheaderStr ="student学生";
headerStr =new String(headerStr.getBytes("gb2312"), "ISO8859-1");//headerString为中文时转码
response.setHeader("Content-disposition","attachment; filename="+ headerStr+".xls");//filename是下载的xls的名,建议最好用英文
response.setContentType("application/msexcel;charset=UTF-8");//设置类型
response.setHeader("Pragma","No-cache");//设置头
response.setHeader("Cache-Control","no-cache");//设置头
response.setDateHeader("Expires", 0);//设置日期头
workbook.write(out);
out.flush();
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}finally{
try{ if(out!=null){
out.close();
} }catch(IOException e){
e.printStackTrace();
} } return null;
}
注:最好返回null,否则有可能报错。
4.数据的导入(以例子的形式展示)
1.jsp页面的编写:在页面上添加如下代码
其中action可以自己编写,table标签的内容可以不要。(DEMO页面添加TABLE标签主要是展示导入效果)
<s:form action="indexAction!importExcel.action" method="post" enctype="multipart/form-data" theme="simple"> <td>
<s:file name="excelFile" id="excelFile" cssStyle="width:160px"></s:file>//选择导入的文件
</td>
<td>
<input type="submit" value="导入学生数据"/>
</td>
</s:form>
//下面是展示导入效果
<table>
<th>学号</th><th>姓名</th><th>性别</th><th>寝室号</th><th>所在系</th>
<s:iterator value="stuList">
<tr>
<td>
<s:property value="studentId"/>
</td>
<td>
<s:property value="studentName"/>
</td>
<td>
<s:property value="studentSex"/>
</td>
<td>
<s:property value="studentDormitory"/>
</td>
<td>
<s:property value="studentSept"/>
</td>
</tr>
</s:iterator>
</table>
2.strus.xml编写(如果要展示效果,DEMo就编写的返回的页面如下)
<action name="indexAction" class="com.dev.iex.action.IndexAction">
<result name="SUCCESS">/index.jsp</result>
</action>
3. java代码如下
在indexAction中添加
Import的类:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFHeader;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import com.dev.iex.po.Student;
定义的的变量:
private File excelFile;//File对象,目的是获取页面上传的文件
private List<Student> stuList=new ArrayList<Student>();
定义的方法:
public File getExcelFile() {
return excelFile;
}
public void setExcelFile(File excelFile) {
this.excelFile = excelFile;
}
public List<Student> getStuList() {
return stuList;
}
public void setStuList(List<Student> stuList) {
this.stuList = stuList;
} 主要编写的是importExcel方法,如下:
@SuppressWarnings("finally")
public String importExcel()throws Exception
{ String id=null;
String name=null;
String sex=null;
String Dormitory=null;
String Sept=null; Workbook workbook = null;
int k=0;
int flag = 0; //指示指针所访问的位置
if(excelFile!=null)
{
String path=excelFile.getAbsolutePath();//获取文件的路径
try {
workbook = new XSSFWorkbook(path);//初始化workbook对象
for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) { //读取每一个sheet
System.out.println("2007版进入读取sheet的循环");
if (null != workbook.getSheetAt(numSheets)) {
XSSFSheet aSheet = (XSSFSheet)workbook.getSheetAt(numSheets);//定义Sheet对象
for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) {
//进入当前sheet的行的循环
if (null != aSheet.getRow(rowNumOfSheet)) {
XSSFRow aRow = aSheet.getRow(rowNumOfSheet); //定义行,并赋值
for (int cellNumOfRow = 0; cellNumOfRow <= aRow.getLastCellNum(); cellNumOfRow++)
{ //读取rowNumOfSheet值所对应行的数据
XSSFCell xCell = aRow.getCell(cellNumOfRow); //获得行的列数 //获得列值
//System.out.println("type="+xCell.getCellType());
if (null != aRow.getCell(cellNumOfRow))
{ if(rowNumOfSheet == 0)
{ // 如果rowNumOfSheet的值为0,则读取表头,判断excel的格式和预定格式是否相符
if(xCell.getCellType() == XSSFCell .CELL_TYPE_NUMERIC)
{ }else if(xCell.getCellType() == XSSFCell .CELL_TYPE_BOOLEAN)
{ }else if(xCell.getCellType() == XSSFCell .CELL_TYPE_STRING)
{
if(cellNumOfRow == 0)
{
if(xCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim().equals("学号"))
{
flag++;
}else{
System.out.println("错误:第一行的学号不符合约定格式");
}
}else if(cellNumOfRow == 1)
{
if(xCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim().equals("姓名"))
{
flag++;
}else{
System.out.println("错误:第一行的姓名不符合约定格式");
}
}else if(cellNumOfRow == 2)
{
if(xCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim().equals("性别")){
flag++; }else{
System.out.println("第一行的性别不符合约定格式");
} }else if (cellNumOfRow == 3) {
if(xCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim().equals("寝室号"))
{
flag++;
System.out.println("=========flag:" + flag);
}else{
System.out.println("第一行的寝室号不符合约定格式");
} }else if (cellNumOfRow == 4)
{
if(xCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim().equals("所在系")){
flag++;
System.out.println("=========flag:" + flag);
}else{
System.out.println("第一行的所在系不符合约定格式");
}
}
}
}
else { //rowNumOfSheet != 0 即开始打印内容 if(id != null && name != null && sex != null && Dormitory != null && Sept != null ){
Student stu=new Student();
stu.setStudentId(id);
stu.setStudentName(name);
stu.setStudentSept(Sept);
stu.setStudentSex(sex);
stu.setStudentDormitory(Dormitory);
stuList.add(stu);
k++;
}
} //获得一行,即读取每一行
}
//读取每一个sheet }
}catch (Exception e) {
/******************************************** 下面使用的是2003除了workbook的赋值不同其它与2007基本相同,就不作介绍了
*********************************************
InputStream is = new FileInputStream(path);
workbook = new HSSFWorkbook(is);
try {
for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) { //读取每一个sheet
System.out.println("2003版进入读取sheet的循环");
if (null != workbook.getSheetAt(numSheets)) {
HSSFSheet aSheet = (HSSFSheet)workbook.getSheetAt(numSheets);
for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) { //获得一行 if (null != aSheet.getRow(rowNumOfSheet)) {
HSSFRow aRow = aSheet.getRow(rowNumOfSheet);
for (int cellNumOfRow = 0; cellNumOfRow <= aRow.getLastCellNum(); cellNumOfRow++) { //读取rowNumOfSheet值所对应行的数据
HSSFCell aCell = aRow.getCell(cellNumOfRow); //获得列值 if (null != aRow.getCell(cellNumOfRow)){
if(rowNumOfSheet == 0){ // 如果rowNumOfSheet的值为0,则读取表头,判断excel的格式和预定格式是否相符
if(aCell.getCellType() == HSSFCell .CELL_TYPE_NUMERIC){
}else if(aCell.getCellType() == HSSFCell .CELL_TYPE_BOOLEAN){
}else if(aCell.getCellType() == HSSFCell .CELL_TYPE_STRING){
if(cellNumOfRow == 0){
if(aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim().equals("学号")){
flag++;
System.out.println("=========flag:" + flag);
}else{
System.out.println("错误:第一行的学号不符合约定格式");
}
}else if(cellNumOfRow == 1){
if(aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim().equals("姓名")){
flag++;
System.out.println("=========flag:" + flag);
}else{
System.out.println("错误:第一行的姓名不符合约定格式");
}
}else if(cellNumOfRow == 2){
if(aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim().equals("性别")){
flag++;
System.out.println("=========flag:" + flag);
}else{
System.out.println("第一行的性别不符合约定格式");
} }else if (cellNumOfRow == 3){
if(aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim().equals("寝室号")){
flag++;
System.out.println("=========flag:" + flag);
}else{
System.out.println("第一行的寝室号不符合约定格式");
} }else if (cellNumOfRow == 4){
if(aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim().equals("所在系")){
flag++;
System.out.println("=========flag:" + flag);
}else{
System.out.println("第一行的所在系不符合约定格式");
}
}
}
}
else {
if(aCell.getCellType() == HSSFCell .CELL_TYPE_NUMERIC){ //为数值型
System.out.println("======进入XSSFCell .CELL_TYPE_NUMERIC模块==========");
if(cellNumOfRow == 0){
id = String.valueOf(aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim());
if(id == null){
System.out.println("错误:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的学号不能为空");
}
}else if(cellNumOfRow == 1){
name = String.valueOf(aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim());
if(name == null){
System.out.println("错误:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的姓名不能为空");
}
}else if(cellNumOfRow == 2){
sex = String.valueOf(aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim());
if(sex == null){
System.out.println("错误:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的性别不能为空");
}
}else if (cellNumOfRow == 3){ Dormitory = String.valueOf(aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim());
if(Dormitory == null){
System.out.println("错误:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的寝室号不能为空");
}
}else if (cellNumOfRow == 4){ Sept = String.valueOf(aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim());
if(Sept == null){
System.out.println("错误:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的所在系不能为空");
} }
}else if(aCell.getCellType() == HSSFCell .CELL_TYPE_STRING){ //为字符串型
System.out.print("===============进入XSSFCell .CELL_TYPE_STRING模块============");
if(cellNumOfRow == 0){
id = aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim();
if(id == null){
System.out.println("错误:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的学号不能为空");
}
}else if(cellNumOfRow == 1){
name = aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim();
if(name == null){
System.out.println("错误:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的姓名不能为空");
}
}else if(cellNumOfRow == 2){
sex = aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim();
if(sex == null){
System.out.println("错误:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的性别不能为空");
}
}else if (cellNumOfRow == 3){
Dormitory =aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim();
if(Dormitory == null){
System.out.println("错误:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的寝室号不能为空");
}
}else if (cellNumOfRow == 4){ Sept =aCell.getStringCellValue().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim();
if(Sept == null){
System.out.println("错误:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的所在系不能为空");
}
} }else if (aCell.getCellType() == HSSFCell .CELL_TYPE_BLANK) {
System.out.println("提示:在Sheet"+(numSheets+1)+"中的第"+(rowNumOfSheet+1)+"行的第"+(cellNumOfRow+1)+"列的值为空,请查看核对是否符合约定要求".toString());
}
}
}
} if (flag!=5){
System.out.println("请核对后重试"); }
} if(id != null && name != null && sex != null && Dormitory != null && Sept != null ){
Student stu=new Student();
stu.setStudentId(id);
stu.setStudentName(name);
stu.setStudentSept(Sept);
stu.setStudentSex(sex);
stu.setStudentDormitory(Dormitory);
stuList.add(stu);
k++;
} }
if(k!=0){
System.out.println("提示:您导入的数据已存在于数据库,请核对!k 为:" + k);
}else{
System.out.println("提示:成功导入了"+k+"条数据");
}
}
} } catch (Exception ex) {
ex.printStackTrace();
}finally{
try {
if(is!=null)
is.close();
}catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
return "SUCCESS"; }
JAVA通过poi对Excel数据在(jsp+ssh)环境下导入导出的更多相关文章
- java 使用POI读取excel数据
原文:http://doc.okbase.net/0201zcr/archive/161440.html 一.定义 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Ja ...
- Java使用poi生成Excel,生成两种表格下拉框
想要使用POI操作以xsl结尾的Excel,首先要下载poi相关的jar包,用到的jar有: poi-3.9.jar poi-ooxml-3.9.jar poi-ooxml-schemas-3.9.j ...
- Java Struts2 POI创建Excel文件并实现文件下载
Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...
- JAVA使用POI读取EXCEL文件的简单model
一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...
- JAVA使用POI获取Excel的列数与行数
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...
- java使用POI实现excel文件的读取,兼容后缀名xls和xlsx
需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&g ...
- Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决
Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决 引言: 在Java中 ...
- java里poi操作excel的工具类(兼容各版本)
转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...
- java通过poi编写excel文件
public String writeExcel(List<MedicalWhiteList> MedicalWhiteList) { if(MedicalWhiteList == nul ...
随机推荐
- openssh-server 安装
sudo apt-get update sudo apt-get install openssh-server 1:ssh-keygen -t rsa -f ~/.ssh/id_rsa 这里会提示输入 ...
- 利用堆排序找出数组中前n大的元素
#include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <time.h> ...
- java的Random
首先,Point类 public class Point { int x, y; public Point(int x, int y) { this.x = x; this.y = y; } bool ...
- [LeetCode]题解(python):079 Word Search
题目来源 https://leetcode.com/problems/word-search/ Given a 2D board and a word, find if the word exists ...
- SQL语句里怎么获得当前年份(MySQL数据库)
使用函数Year及CurDate的组合: Year(CurDate()) select date_format(min(date),'%Y-%m-%d') as mindate, date_forma ...
- 异步刷新tableView
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self.tableView rel ...
- LeetCode Expression Add Operators
原题链接在这里:https://leetcode.com/problems/expression-add-operators/ 题目: Given a string that contains onl ...
- Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称
Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称 这个图片好可爱,它是LSB组织的图标.你肯定会问:“图标这么设计一定有说 ...
- 30天,O2O速成攻略【7.18广州站】
活动概况 时间:2015年07月18日13:30-16:30 地点:贝塔咖啡(新港中路TIT创意园内创意西路07号楼) 主办:APICloud.七牛.洪海网络 网址:www.apicloud.com ...
- [转载]快速搭建Spring MVC 4开发环境
(一)工作环境准备: JDK 1.7 Eclipse Kepler Apache Tomcat 8.0 (二)在Eclipse中新建Maven工程,在Archetype类型中,选择“maven-arc ...