最近公司让我实现一个利用原有word模板,导出word文档的功能模块,发现docx4j是个很不错的工具,但是之前从来没有用过,对此并不了解,于是上网查找相关资料,也是非常少之,于是便自己开始摸索。
1、原有word模板内容如下:
2、在想要插入数据的地方,插入书签,之后会在代码中获取书签并遍历插入内容。
3、直接上代码。
(1)首先我将word模板文件路径配置在config.properties文件中
soil_word_template=/template/soil-report.docx
soil_word_filename=soil-report.docx
(2)然后是controller层
/**
* 根据表名统计土壤墒情数据并导出word文档
*
* @param table
* 表名
* @param cropDate
* 监测日期
* @param file
* BASE64编码的图片文件
* @param request
* @param response
* @return
*/
@ApiOperation("根据表名统计土壤墒情数据并导出word文档")
@RequestMapping(value = "/exportWordReport", method = RequestMethod.POST)
@ApiImplicitParams({ @ApiImplicitParam(name = "table", value = "表名",required=false,dataType="query"), @ApiImplicitParam(name="cropDate",value="监测日期",required=false,dataType="query"),
@ApiImplicitParam(name = "file", value = "BASE64编码的图片字符",required=false,dataType="query")})
public void exportWordReport(String table, String cropDate, String file, HttpServletRequest request,
HttpServletResponse response) {
// soil_word_template=/template/soil-report.docx
// soil_word_filename=soil-report.docx
ServletOutputStream out = null;
InputStream in = null;
File resultFile = null;
try {
// 土壤墒情word文档模板路径
String path = request.getServletContext().getRealPath("") + PropertyUtil.get("soil_word_template");
String tempPath = request.getServletContext().getRealPath("");
WordprocessingMLPackage wPackage = soilService.exportWordReport(table, cropDate, file, path);
// 设置文件属性
// wPackage.save(new File("C:\\Users\\admin\\Desktop\\" +
// PropertyUtil.get("soil_word_filename")));
String fileName = PropertyUtil.get("soil_word_filename");
String msg = new String((fileName).getBytes("UTF-8"), "ISO8859-1");
response.setContentType("application/msword");
response.addHeader("Content-Disposition", "attachment;filename=" + msg);
// response.setContentType("application/octet-stream");
// response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("UTF-8");
// response.addHeader("result", "ok");
// response.setContentType("multipart/form-data");
out = response.getOutputStream();
String strDate = DateUtil.date2String(new Date(), DateUtil.DATE_FORMAT2);
resultFile = new File(tempPath + "/tempfile", "soil-report(" + strDate + ").docx");
wPackage.save(resultFile);
in = new FileInputStream(resultFile);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
// wPackage.save(out);
// wPackage.save(new File("C:\\Users\\admin\\Desktop\\",
// "dddd1111.docx"));
} catch (Exception e) {
Log.error(e);
} finally {
try {
if (out != null) {
out.flush();
out.close();
}
if (in != null) {
in.close();
if (resultFile != null && resultFile.exists() && resultFile.isFile()) {
resultFile.delete();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
controller 层中需要注意的地方的是,最开始我用
wPackage.save(out);//直接输出到response的ServletOutPutStream流中,但是这种方式会报错,好像是socket异常之类的问题。
后来改成了代码中的方式,先将文件导出到项目src的webapp文件夹的tempfile文件夹中,然后再从此文件夹中读取该文件,并用out.write()方式输出便能成功执行导出word,前端紧接着下载该word即可。
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
(3)service层以及serviceImpl层代码
首先来看看咱们需要
是SoilService层代码:
/**SoilService层
* 根据表名进行统计并导出word报告文档
*
* @param tableName 表名
* @param cropDate 监测日期
* @param file base64编码的图片文件字符串
* @param path word模板文件路径
* @return Map
*/
WordprocessingMLPackage exportWordReport(String tableName, String cropDate, String file, String path);
然后贴上SoilServiceImpl代码:
/**
* 根据表名进行统计并导出word报告文档
*
* @param tableName
* @param where
* @param file
* @return Map
*/
@Override
public WordprocessingMLPackage exportWordReport(String tableName, String cropDate, String file, String path) {
// TODO Auto-generated method stub
Map resultMap = new HashMap();
// DecimalFormat decimalFormat = new DecimalFormat("0.00");
// 此处可能添加过滤非监测区的条件
String where = " \"GRIDCODE\"<8 ";
resultMap = findStatisticsDateByTableName(tableName, where);
JSONArray jsonArray = (JSONArray) resultMap.get("data1");
double totalArea = 0.0; // 有效监测区面积
double tooMuchArea = 0.0; // 过多面积1
double suitableArea = 0.0;// 适宜面积2
double notEnoughArea = 0.0;// 不足面积3
double lightDroughtArea = 0.0;// 轻旱面积4
double middleDroughtArea = 0.0;// 中旱面积5
double heavyDroughtArea = 0.0;// 重旱面积6
double extremeDroughtArea = 0.0;// 极旱面积7
// double notMonitorArea =0.0; //非监测区8
double tooMuchRate = 0.0; // 过多面积占比1
double suitableRate = 0.0;// 适宜面积2
double notEnoughRate = 0.0;// 不足面积3
double lightDroughtRate = 0.0;// 轻旱面积4
double middleDroughtRate = 0.0;// 中旱面积5
double heavyDroughtRate = 0.0;// 重旱面积6
double extremeDroughtRate = 0.0;// 极旱面积7
// double notMonitorRate =0.0; //非监测区8
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
String gridcode = jsonObject.getString("gridcode");
double area = jsonObject.getDoubleValue("area");
if ("1".equals(gridcode)) {
tooMuchArea = area * Constant.I;
} else if ("2".equals(gridcode)) {
suitableArea = area * Constant.I;
} else if ("3".equals(gridcode)) {
notEnoughArea = area * Constant.I;
} else if ("4".equals(gridcode)) {
lightDroughtArea = area * Constant.I;
} else if ("5".equals(gridcode)) {
middleDroughtArea = area * Constant.I;
} else if ("6".equals(gridcode)) {
heavyDroughtArea = area * Constant.I;
} else if ("7".equals(gridcode)) {
extremeDroughtArea = area * Constant.I;
}
// }else if("8".equals(gridcode)){
// notMonitorArea =area;
// }
totalArea += area * Constant.I;
}
if (totalArea != 0.0) {
tooMuchRate = Double.valueOf(DECIMAL_FORMAT.format((tooMuchArea / totalArea) * 100));
suitableRate = Double.valueOf(DECIMAL_FORMAT.format((suitableArea / totalArea) * 100));
notEnoughRate = Double.valueOf(DECIMAL_FORMAT.format((notEnoughArea / totalArea) * 100));
lightDroughtRate = Double.valueOf(DECIMAL_FORMAT.format((lightDroughtArea / totalArea) * 100));
middleDroughtRate = Double.valueOf(DECIMAL_FORMAT.format((middleDroughtArea / totalArea) * 100));
heavyDroughtRate = Double.valueOf(DECIMAL_FORMAT.format((heavyDroughtArea / totalArea) * 100));
extremeDroughtRate = Double.valueOf(DECIMAL_FORMAT.format((extremeDroughtArea / totalArea) * 100));
}
Map map = new HashMap();
map.put("cropDate", cropDate);
map.put("totalArea", DECIMAL_FORMAT.format(totalArea));
map.put("mTotalArea", DECIMAL_FORMAT.format(totalArea / Constant.I * Constant.M));
map.put("tooMuchArea", DECIMAL_FORMAT.format(tooMuchArea));
map.put("suitableArea", DECIMAL_FORMAT.format(suitableArea));
map.put("notEnoughArea", DECIMAL_FORMAT.format(notEnoughArea));
map.put("lightDroughtArea", DECIMAL_FORMAT.format(lightDroughtArea));
map.put("middleDroughtArea", DECIMAL_FORMAT.format(middleDroughtArea));
map.put("heavyDroughtArea", DECIMAL_FORMAT.format(heavyDroughtArea));
map.put("extremeDroughtArea", DECIMAL_FORMAT.format(extremeDroughtArea));
map.put("tooMuchAreaM", DECIMAL_FORMAT.format(tooMuchArea/ Constant.I * Constant.M));
map.put("suitableAreaM", DECIMAL_FORMAT.format(suitableArea/ Constant.I * Constant.M));
map.put("notEnoughAreaM", DECIMAL_FORMAT.format(notEnoughArea/ Constant.I * Constant.M));
map.put("lightDroughtAreaM", DECIMAL_FORMAT.format(lightDroughtArea/ Constant.I * Constant.M));
map.put("middleDroughtAreaM", DECIMAL_FORMAT.format(middleDroughtArea/ Constant.I * Constant.M));
map.put("heavyDroughtAreaM", DECIMAL_FORMAT.format(heavyDroughtArea/ Constant.I * Constant.M));
map.put("extremeDroughtAreaM", DECIMAL_FORMAT.format(extremeDroughtArea/ Constant.I * Constant.M));
map.put("tooMuchRate", tooMuchRate);
map.put("suitableRate", suitableRate);
map.put("notEnoughRate", notEnoughRate);
map.put("lightDroughtRate", lightDroughtRate);
map.put("middleDroughtRate", middleDroughtRate);
map.put("heavyDroughtRate", heavyDroughtRate);
map.put("extremeDroughtRate", extremeDroughtRate);
String sql = "SELECT * from (SELECT \"PROVINCE\",\"CITY\",\"COUNTY\",\"TOWN\",\"CROPTYPE\",\"GRIDCODE\",SUM(\"AREA\") \"AREA\" FROM \""
+ tableName
+ "\" WHERE \"GRIDCODE\"<8 AND \"GRIDCODE\" IS NOT NULL group by \"PROVINCE\",\"CITY\",\"COUNTY\",\"TOWN\",\"CROPTYPE\",\"GRIDCODE\") A "
+ "WHERE A.\"AREA\"!=0 AND A.\"AREA\" IS NOT NULL";
String totalAreaSql = "SELECT SUM(\"AREA\") \"TOTALAREA\" from (SELECT \"PROVINCE\",\"CITY\",\"COUNTY\",\"TOWN\",\"CROPTYPE\",\"GRIDCODE\",SUM(\"AREA\") \"AREA\" FROM \""
+ tableName
+ "\" WHERE \"GRIDCODE\"<8 AND \"GRIDCODE\" IS NOT NULL group by \"PROVINCE\",\"CITY\",\"COUNTY\",\"TOWN\",\"CROPTYPE\",\"GRIDCODE\") A "
+ "WHERE A.\"AREA\"!=0 AND A.\"AREA\" IS NOT NULL";
List list = getBySql(sql, null);
double soilTotalArea = Double.valueOf(Objects.toString(getBySql(totalAreaSql, null).get(0), "0.0"))
* Constant.M;
List soilList = list.parallelStream().map(x -> coverProperty(x, soilTotalArea))
.collect(Collectors.toList());
map.put("table", soilList);
// map.put("soilTotalArea", soilTotalArea);
map.put("img", file);
try {
WordprocessingMLPackage wPackage = WordprocessingMLPackage.load(new FileInputStream(path));
replaceContentByBookmark(wPackage, map);
// wPackage.save(new File("C:\\Users\\admin\\Desktop\\" +
// PropertyUtil.get("soil_word_filename")));
return wPackage;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Docx4JException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 根据多个标签替换段落中的内容
*
* @param map
*/
public void replaceContentByBookmark(WordprocessingMLPackage wPackage, Map map) {
// 载入模板文件
try {
// 提取正文
MainDocumentPart main = wPackage.getMainDocumentPart();
Document doc = main.getContents();
Body body = doc.getBody();
// ObjectFactory factory = Context.getWmlObjectFactory();
// 获取段落
List paragraphs = body.getContent();
// 提取书签并创建书签的游标
RangeFinder rt = new RangeFinder("CTBookmark", "CTMarkupRange");
new TraversalUtil(paragraphs, rt);
// 遍历书签(在书签处插入文本内容和书签)
for (CTBookmark bm : rt.getStarts()) {
// 这儿可以对单个书签进行操作,也可以用一个map对所有的书签进行处理
if (!bm.getName().equals(DocUtil.tableName)) {
if (bm.getName().equals(DocUtil.imageBookMarkName)) { // 图片
String file = (String) map.get(bm.getName());
if (StringUtils.isNotBlank(file)) {
// InputStream inputStream =file.getInputStream();
DocUtil.addImage(wPackage, bm, file);
}
} else {
DocUtil.replaceText(bm, map.get(bm.getName()));
}
} else { // 表格
List list = (List) map.get(bm.getName());
// 创建表格
int rowIndex = 2; // 从第三行开始写起(表格从0开始)
Tbl tbl = Doc4JUtil.createTable(wPackage, list.size() + rowIndex, 6);
Doc4JUtil.mergeCellsHorizontal(tbl, 0, 0, 5);
// 设置表格大标题
P p = Doc4JUtil.createP("农作物墒情统计列表", "36");
Doc4JUtil.setTcValue(tbl, 0, 0, p);
// 设置表格副标题
Doc4JUtil.setTcValue(tbl, 1, 0, "县区");
Doc4JUtil.setTcValue(tbl, 1, 1, "乡镇");
Doc4JUtil.setTcValue(tbl, 1, 2, "作物");
Doc4JUtil.setTcValue(tbl, 1, 3, "墒情等级");
Doc4JUtil.setTcValue(tbl, 1, 4, "面积(亩)");
Doc4JUtil.setTcValue(tbl, 1, 5, "占比");
Map> provinceCollect = list.stream()
.collect(Collectors.groupingBy(x -> x.getProvince() == null ? "" : x.getProvince()));
for (Entry> proEntry : provinceCollect.entrySet()) {
Map> cityCollect = proEntry.getValue().stream()
.collect(Collectors.groupingBy(x -> x.getCity() == null ? "" : x.getCity()));
for (Entry> cityEntry : cityCollect.entrySet()) {
Map> countyCollect = cityEntry.getValue().stream()
.collect(Collectors.groupingBy(x -> x.getCounty() == null ? "" : x.getCounty()));
for (Entry> countyEntry : countyCollect.entrySet()) {
operateCounty(countyEntry, rowIndex, tbl);
rowIndex += countyEntry.getValue().size();
}
}
}
Doc4JUtil.setTblAllJcAlign(tbl, JcEnumeration.CENTER);
Doc4JUtil.setTblAllVAlign(tbl, STVerticalJc.CENTER);
wPackage.getMainDocumentPart().addObject(tbl);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 写入县区数据
*
* @param countyEntry
* @param rowIndex
* @param tbl
*/
private void operateCounty(Entry> countyEntry, int rowIndex, Tbl tbl) {
// TODO Auto-generated method stub
// 获取每个entry的记录条数
int beginRow = rowIndex;
int size = countyEntry.getValue().size();
// 处理县区
// 合并单元格
Doc4JUtil.mergeCellsVertically(tbl, 0, beginRow, beginRow + size);
Doc4JUtil.setTcValue(tbl, beginRow, 0, countyEntry.getKey());
// 处理镇
Map> townCollect = countyEntry.getValue().stream()
.collect(Collectors.groupingBy(x -> x.getTown() == null ? "" : x.getTown()));
for (Entry> townEntry : townCollect.entrySet()) {
operateTown(townEntry, beginRow, tbl);
beginRow += townEntry.getValue().size();
}
}
/**
* 写入镇数据
*
* @param townEntry
* @param rowIndex
* @param tbl
*/
private void operateTown(Entry> townEntry, int rowIndex, Tbl tbl) {
// TODO Auto-generated method stub
// 获取每个entry的记录条数
int beginRow = rowIndex;
int size = townEntry.getValue().size();
// 处理县区
// 合并单元格
Doc4JUtil.mergeCellsVertically(tbl, 1, beginRow, beginRow + size);
Doc4JUtil.setTcValue(tbl, beginRow, 1, townEntry.getKey());
Map> cropCollect = townEntry.getValue().stream().sorted((x, j) -> {
return (int) (x.getGridcode() - j.getGridcode());
}).collect(Collectors.groupingBy(x -> x.getCroptype() == null ? "" : x.getCroptype()));
for (Entry> cropEntry : cropCollect.entrySet()) {
operateCropType(cropEntry, beginRow, tbl);
beginRow += cropEntry.getValue().size();
}
}
/**
* 写入种植类型、土壤墒情等级,面积,占比
*
* @param cropEntry
* @param rowIndex
* @param tbl
*/
private void operateCropType(Entry> cropEntry, int rowIndex, Tbl tbl) {
// TODO Auto-generated method stub
int beginRow = rowIndex;
int size = cropEntry.getValue().size();
// 处理县区
// 合并单元格
Doc4JUtil.mergeCellsVertically(tbl, 2, beginRow, beginRow + size);
Doc4JUtil.setTcValue(tbl, beginRow, 2, cropEntry.getKey());
List soilList = cropEntry.getValue();
for (int i = 0; i < size; i++) {
Doc4JUtil.setTcValue(tbl, beginRow + i, 3, gridCodeMap.get(soilList.get(i).getGridcode()));
Doc4JUtil.setTcValue(tbl, beginRow + i, 4, String.valueOf(soilList.get(i).getArea()));
Doc4JUtil.setTcValue(tbl, beginRow + i, 5, soilList.get(i).getRate());
}
}
public SoilDtoEntityRate coverProperty(Object[] x, double totalSoilArea) {
String rate = "0.00%";
double area = Double.valueOf(Objects.toString(x[6], "0")) * Constant.M;
area = Double.valueOf(DECIMAL_FORMAT.format(area));
if (totalSoilArea != 0) {
rate = DECIMAL_FORMAT.format((area / totalSoilArea) * 100) + "%";
}
return new SoilDtoEntityRate(Objects.toString(x[0], ""), Objects.toString(x[1], ""), Objects.toString(x[2], ""),
Objects.toString(x[3], ""), Objects.toString(x[4], ""), Double.valueOf(Objects.toString(x[5], "0")),
area, rate);
}
接下来是以上业务代码中用到的工具类中的方法:
/**
* @Description:创建表格(默认水平居中,垂直居中)
*/
public static Tbl createTable(WordprocessingMLPackage wordPackage, int rowNum,
int colsNum) throws Exception {
colsNum = Math.max(1, colsNum);
rowNum = Math.max(1, rowNum);
int widthTwips = getWritableWidth(wordPackage);
int colWidth = widthTwips / colsNum;
int[] widthArr = new int[colsNum];
for (int i = 0; i < colsNum; i++) {
widthArr[i] = colWidth;
}
return createTable(rowNum, colsNum, widthArr);
}
/**
* @Description:创建表格(默认水平居中,垂直居中)
*/
public static Tbl createTable(int rowNum, int colsNum, int[] widthArr)
throws Exception {
colsNum = Math.max(1, Math.min(colsNum, widthArr.length));
rowNum = Math.max(1, rowNum);
Tbl tbl = new Tbl();
StringBuffer tblSb = new StringBuffer();
tblSb.append("");
tblSb.append("");
tblSb.append("");
// 上边框
tblSb.append("");
tblSb.append("");
// 左边框
tblSb.append("");
// 下边框
tblSb.append("");
// 右边框
tblSb.append("");
tblSb.append("");
tblSb.append("");
tblSb.append(" ");
tblSb.append(" ");
TblPr tblPr = null;
tblPr = (TblPr) XmlUtils.unmarshalString(tblSb.toString());
Jc jc = new Jc();
// 单元格居中对齐
jc.setVal(JcEnumeration.CENTER);
tblPr.setJc(jc);
tbl.setTblPr(tblPr);
// 设定各单元格宽度
TblGrid tblGrid = new TblGrid();
tbl.setTblGrid(tblGrid);
for (int i = 0; i < colsNum; i++) {
TblGridCol gridCol = new TblGridCol();
gridCol.setW(BigInteger.valueOf(widthArr[i]));
tblGrid.getGridCol().add(gridCol);
}
// 新增行
for (int j = 0; j < rowNum; j++) {
Tr tr = new Tr();
tbl.getContent().add(tr);
// 列
for (int i = 0; i < colsNum; i++) {
Tc tc = new Tc();
tr.getContent().add(tc);
TcPr tcPr = new TcPr();
TblWidth cellWidth = new TblWidth();
cellWidth.setType("dxa");
cellWidth.setW(BigInteger.valueOf(widthArr[i]));
tcPr.setTcW(cellWidth);
tc.setTcPr(tcPr);
// 垂直居中
setTcVAlign(tc, STVerticalJc.CENTER);
P p = new P();
PPr pPr = new PPr();
pPr.setJc(jc);
p.setPPr(pPr);
R run = new R();
p.getContent().add(run);
tc.getContent().add(p);
}
}
return tbl;
}
/**
* @Description: 跨列合并
*/
public static void mergeCellsHorizontal(Tbl tbl, int row, int fromCell, int toCell) {
if (row < 0 || fromCell < 0 || toCell < 0) {
return;
}
List trList = getTblAllTr(tbl);
if (row > trList.size()) {
return;
}
Tr tr = trList.get(row);
List tcList = getTrAllCell(tr);
for (int cellIndex = fromCell, len = Math
.min(tcList.size() - 1, toCell); cellIndex <= len; cellIndex++) {
Tc tc = tcList.get(cellIndex);
TcPr tcPr = getTcPr(tc);
HMerge hMerge = tcPr.getHMerge();
if (hMerge == null) {
hMerge = new HMerge();
tcPr.setHMerge(hMerge);
}
if (cellIndex == fromCell) {
hMerge.setVal("restart");
} else {
hMerge.setVal("continue");
}
}
}
/**
* 插入图片
* @param wPackage
* @param bm
* @param file
*/
public static void addImage(WordprocessingMLPackage wPackage, CTBookmark bm, String file) {
try {
// 这儿可以对单个书签进行操作,也可以用一个map对所有的书签进行处理
// 获取该书签的父级段落
P p = (P) (bm.getParent());
// R对象是匿名的复杂类型,然而我并不知道具体啥意思,估计这个要好好去看看ooxml才知道
R run = factory.createR();
// 读入图片并转化为字节数组,因为docx4j只能字节数组的方式插入图片
byte[] bytes = FileUtil.getByteFormBase64DataByImage(file);
// InputStream is = new FileInputStream;
// byte[] bytes = IOUtils.toByteArray(inputStream);
// byte[] bytes = FileUtil.getByteFormBase64DataByImage("");
// 开始创建一个行内图片
BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wPackage, bytes);
// createImageInline函数的前四个参数我都没有找到具体啥意思,,,,
// 最有一个是限制图片的宽度,缩放的依据
Inline inline = imagePart.createImageInline(null, null, 0, 1, false, 0);
// 获取该书签的父级段落
// drawing理解为画布?
Drawing drawing = factory.createDrawing();
drawing.getAnchorOrInline().add(inline);
run.getContent().add(drawing);
p.getContent().add(run);
} catch (Exception e) {
// TODO: handle exception
Log.error(e);
}
}
/**
* 在标签处插入内容
*
* @param bm
* @param wPackage
* @param object
* @throws Exception
*/
public static void replaceText(CTBookmark bm, Object object) throws Exception {
if (object == null) {
return;
}
// do we have data for this one?
if (bm.getName() == null)
return;
String value = object.toString();
Log.info("标签名称:"+bm.getName());
try {
// Can't just remove the object from the parent,
// since in the parent, it may be wrapped in a JAXBElement
List theList = null;
ParaRPr rpr = null;
if (bm.getParent() instanceof P) {
PPr pprTemp = ((P) (bm.getParent())).getPPr();
if (pprTemp == null) {
rpr = null;
} else {
rpr = ((P) (bm.getParent())).getPPr().getRPr();
}
theList = ((ContentAccessor) (bm.getParent())).getContent();
} else {
return;
}
int rangeStart = -1;
int rangeEnd = -1;
int i = 0;
for (Object ox : theList) {
Object listEntry = XmlUtils.unwrap(ox);
if (listEntry.equals(bm)) {
if (((CTBookmark) listEntry).getName() != null) {
rangeStart = i + 1;
}
} else if (listEntry instanceof CTMarkupRange) {
if (((CTMarkupRange) listEntry).getId().equals(bm.getId())) {
rangeEnd = i - 1;
break;
}
}
i++;
}
int x = i - 1;
//if (rangeStart > 0 && x >= rangeStart) {
// Delete the bookmark range
for (int j = x; j >= rangeStart; j--) {
theList.remove(j);
}
// now add a run
org.docx4j.wml.R run = factory.createR();
org.docx4j.wml.Text t = factory.createText();
// if (rpr != null)
// run.setRPr(paraRPr2RPr(rpr));
t.setValue(value);
run.getContent().add(t);
//t.setValue(value);
theList.add(rangeStart, run);
//}
} catch (ClassCastException cce) {
Log.error(cce);
}
}
/**
* @Description: 跨行合并
*/
public static void mergeCellsVertically(Tbl tbl, int col, int fromRow, int toRow) {
if (col < 0 || fromRow < 0 || toRow < 0) {
return;
}
for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
Tc tc = getTc(tbl, rowIndex, col);
if (tc == null) {
break;
}
TcPr tcPr = getTcPr(tc);
VMerge vMerge = tcPr.getVMerge();
if (vMerge == null) {
vMerge = new VMerge();
tcPr.setVMerge(vMerge);
}
if (rowIndex == fromRow) {
vMerge.setVal("restart");
} else {
vMerge.setVal("continue");
}
}
}
至此,大家就可以看到导出的word文档效果了,如下图:
最后,大家在遇到此类问题的时候也可参考本篇博客,同时本人初次发表博客,时间仓促,尚且还有不妥之处,欢迎指正!
你可能感兴趣的:(javaweb)
探索Zebra4J:构建高效企业级Web应用的微服务框架
叶准鑫Natalie
探索Zebra4J:构建高效企业级Web应用的微服务框架ZebraZebra4J/Zebra4Js基于SpringBoot的JavaWeb/Nodejs框架项目地址:https://gitcode.com/gh_mirrors/zebra/Zebra项目介绍在当今快速发展的技术环境中,构建高效、可扩展的企业级Web应用是每个开发团队的追求。Zebra4J作为一款基于SpringBoot的全新微服务
基于JavaWeb开发的Java+SpringMvc+vue+element实现上海汽车博物馆平台
网顺技术团队
成品程序项目 java vue.js 汽车 课程设计 spring boot
基于JavaWeb开发的Java+SpringMvc+vue+element实现上海汽车博物馆平台作者主页网顺技术团队欢迎点赞收藏⭐留言文末获取源码联系方式查看下方微信号获取联系方式承接各种定制系统精彩系列推荐精彩专栏推荐订阅不然下次找不到哟Java毕设项目精品实战案例《1000套》感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人文章目录基
5-【JavaWeb】JUnit 单元测试及JUL 日志系统
weixin_44329069
JavaWeb junit 单元测试
1.使用JUnit进行单元测试JUnit是Java中非常流行的单元测试框架,MyBatis与JUnit可以很好地结合,来测试持久层代码的正确性。1.1添加JUnit依赖在使用JUnit之前,需要在pom.xml中引入JUnit依赖。junitjunit4.13.2test1.2单元测试基本结构假设我们要测试UserMapper中的getUserById方法,测试代码如下:importorg.apa
10- 【JavaWeb】Tomcat、Servlet基础
weixin_44329069
JavaWeb tomcat servlet java
1.MacOS配置Tomcat服务器教程MacOS配置Tomcat服务器教程2.Servlet基础1.创建ServletServlet是一个扩展服务器功能的Java类,主要用于处理HTTP请求。以下是一个简单的Servlet示例:importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.an
【免费】springboot项目申报管理系统|毕业设计|Javaweb项目
计算机学姐来啦
springboot ssm java spring boot 课程设计 后端 毕设 毕业设计 java-ee
收藏点赞不迷路关注作者有好处编号:springboot375springboot项目申报管理系统开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis工具:IDEA/Ecilpse、Navicat、Maven1.万字文档展示(部分)2.系统图片展示第5章系统详细设计5.1管理员功能模块的实现5.1.1项目列表如图5.1显示的就是项目列表页面,此页面提供给管理员的
idea 启动tomcat 工程_使用IDEA创建JavaWeb项目 部署本地tomcat并运行
心在天上脚在地上
idea 启动tomcat 工程
一、下载商业版IDEA二、新建JavaWeb项目1、在菜单栏找到File>>New>>Project2、在弹出的窗口中找到JavaEnterPrise>>WebApplication,点击Next3、填写项目名称,选择项目位置,然后Finish4、在左侧窗口可以看到IDEA创建JavaWeb工程的目录结构,在src中写java代码,在web目录下放jsp页面。三、下载tomacat下载完成后,解压
javaweb基于ssm框架学生信息管理(成绩)系统设计与实现
ancen_73bd
开发平台、开发工具、应用服务器的介绍开发平台:Windows开发工具:idea+mySql应用服务器:ApacheTomcat8.0学生成绩管理系统主要用于学校学生成绩信息管理,能实现学生、老师、院系、班级、课程的增删改查操作,同时学生能进行选课和退课操作,老师能对学生的成绩录入和修改操作。系统流程图功能结构图部分截图免费源码获得:扫码关注微信公众号:ancenok,然后回复:013
Servlet 文件上传
lly202406
开发语言
Servlet文件上传在JavaWeb开发中,文件上传是一个常见的需求。Servlet作为一种服务器端的技术,可以轻松实现文件上传功能。本文将详细介绍如何在Servlet中处理文件上传,包括环境配置、代码实现以及常见问题的解决方案。环境配置1.添加依赖在项目的pom.xml文件中,添加ApacheCommonsFileUpload库的依赖。这个库提供了易于使用的API来处理文件上传。commons
Django+Vue基于OpenCV的人脸识别系统的设计与实现
赵广陆
project django vue.js opencv
目录1项目介绍2项目截图3核心代码3.1需要的环境3.2Django接口层3.3实体类3.4config.ini3.5启动类3.5Vue4数据库表设计5文档参考6计算机毕设选题推荐7源码获取1项目介绍博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+粉丝,超300w访问量,专注于大学生项目实战开发、讲解和答疑辅导,对于专业性数据证明一切!主要项目:javaweb、
8- 【JavaWeb】用HTML和CSS来创建一个简洁的登录界面
weixin_44329069
JavaWeb css html css3
我们将使用HTML和CSS来创建一个简洁、现代的登录界面。1.HTML结构首先,我们需要一个基本的HTML结构来容纳登录表单。保存为index.html文件:登录页面登录2.CSS样式接下来,我们将编写CSS样式来美化登录界面。保存为styles.css文件:/*Resetsomedefaultstyles*//*Resetsomedefaultstyles*/body,html{margin:0
9- 【JavaWeb】JavaScript 基础
weixin_44329069
JavaWeb javascript 开发语言 ecmascript
1.基本语法变量声明JavaScript中可以使用var、let和const来声明变量。var是旧的方式,let和const是较新的方式,通常推荐使用let和const。//使用let声明的变量可以被重新赋值letname="Alice";name="Bob";//使用const声明的变量不能被重新赋值constage=25;//age=30;//这将导致错误console.log(name);/
11- 【JavaWeb】Cookie 、Session、Filter、Listener
weixin_44329069
JavaWeb hive python hadoop
了解Cookie、Session、Filter和Listener是JavaWeb开发中非常重要的部分。1.CookieCookie是服务器在客户端浏览器上存储的小数据片段,用于在不同请求之间保持状态。Cookie通常用于保存用户信息、跟踪会话、保存用户偏好等。示例:创建和读取Cookie设置Cookie(在Servlet中):@WebServlet("/setCookie")publicclass
Spring MVC 执行流程详解
胡耀超
Spring java面试常见问题 spring mvc java Spring MVC
SpringMVC是一个典型的基于MVC设计模式的框架,它用于开发JavaWeb应用程序。在SpringMVC中,每个请求都要经历一系列的步骤,从客户端请求到服务器返回响应。下面的执行流程图很好地描述了SpringMVC的执行流程,从请求发起到最后返回数据。接下来,我将全面、深入地讲解SpringMVC的执行流程。SpringMVC执行流程图:+---------++---------------
Java Web安全与Spring Config对象实战
福建低调
本文还有配套的精品资源,点击获取简介:本课程深入探讨JavaWeb开发中的安全实践,包括认证与授权、输入验证、CSRF和XSS防护以及SQL注入防御等关键安全措施。同时,介绍SpringSecurity框架的应用,以及Config对象在Spring配置管理中的作用,包括依赖注入和外部化配置。课程还包括实战演练,通过设置安全环境和安全漏洞模拟,帮助开发者提升应用的安全性和故障排查能力。1.Web安全
python实验过程心得体会_web实训心得体会
weixin_39814378
python实验过程心得体会
篇一:JAVAWEB实训心得体会jsp+servlet+mysql论坛项目实训总结实训人:程路峰学号:11103303通过为期10天的实训,我学习了很多关于javaweb的知识。在老师的正确指导下,顺利的完成了我的实训内容。在此,也有同学的帮助,在他们的帮助下我也受益匪浅。最终,能顺利完成实训的任务也很高兴。在实训生活中,我了解开发项目的需求、设计、实现、确认以及维护等活动整个过程,让自己开始懂得
Javaweb项目-调用接口-如何在服务器端跳转网页后显示并弹出对话框代码
海海不掉头发
Java面试 习题 Java基础 java
Webapp项目中在java包下新建一个服务端类使用JOptionPane框架组件调用showMessageDialog的方法实现四个参数null,"这是一个信息对话框","信息",JOptionPane.INFORMATION_MESSAGE还有确认对话框的代码showConfirmDialogpackageservlet;importjavafx.scene.control.Alert;imp
项目架构设计
先熬半个月
架构概述:架构共分为5层,访问层,接入层,网关层,服务层,数据层服务架构涉及26个技术点,部署架构7个技术点服务架构1.LVS:四层负载均衡,将用户分发到不同Nginx服务器上2.Nginx:是一个高性能的HTTP和反向代理的web服务器,用于部署前端应用3.Keepalived:高可用,此处指的是集群4.JWT:全称:JavaWebToken,用户身份校验,鉴权5.SpringCloudGetw
JavaWeb后端分层
灵佑666
Java
1.Dao层:全称DataAccessObject。Dao层比较底层,负责与数据库打交道具体到对某个表、某个实体的增删改查2.Service层:又叫服务层或业务层,封装Dao层的操作,使一个方法对外表现为实现一种功能,例如:网购生成订单时,不仅要插入订单信息记录,还要查询商品库存是否充足,购买是否超过限制等等。3.Controller层:业务控制层,负责接收数据和请求,并且调用Service层实现
JavaWeb笔记整理14——公共字段自动填充技术实现
mikey棒棒棒
笔记 反射 Spring AOP 公共字段自动填充 JavaWeb 面向切面编程 Aspect
目录为什么需要公共字段自动填充?步骤1自定义注解AutoFill步骤2自定义切面AutoFillAspect步骤3在Mapper接口的方法上加入AutoFill注解@Before("autoFillPointCut()")JoinPoint你能通过JoinPoint获取哪些信息?例子中的JoinPoint获取方法签名和注解获取被拦截方法的参数反射什么是反射获取Class对象获取Method对象动态
@Slf4j注解 - javaweb日志记录
需要重新演唱
web web 日志 注解
1.引言在现代的JavaWeb开发中,日志记录是一个非常重要的组成部分。良好的日志记录可以帮助开发者快速定位问题、监控系统运行状态以及进行性能调优。@Slf4j注解是Lombok库提供的一个便捷工具,用于简化日志记录的代码编写。本文将详细讲解@Slf4j注解的相关内容,包括其概念、使用方法以及一些最佳实践。2.什么是Lombok?Lombok是一个Java库,它通过注解的方式帮助开发者减少样板代码
JavaWeb - Spring Boot - 请求参数
湫湫玺云台
后端 JavaWeb spring boot java 后端
@RequestMapping从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。SpringMVC接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。@RequestMapping标识一个类:设置映射请求的请求路径的初始信息@RequestMapping标识一个方法:设置映射请求请求路径的具体信息@Cont
在 Linux 上部署javaWeb项目+图文详解_java web项目部署到linux服务器
2401_85154737
服务器 linux java
-f:force强制的意思,如果目标文件已经存在,不会询问直接覆盖-i:若目标已经存在,就会询问是否覆盖-u:若目标文件已经存在,且比目标文件新,才会更新#该命令可以把多个文件一次移动到一个文件夹中,但是最后的一个目标文件一要是“目录”。例如:mvfile1file2file3dir#把多个文件移动到dir目录中mvfile1file2#把file重命名为file26、rm命令该命令用于删除文件或
构建可扩展的Java Web应用架构
微赚淘客系统开发者
java 前端 架构
构建可扩展的JavaWeb应用架构大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在现代软件开发中,可扩展性是一个至关重要的概念。构建一个可扩展的JavaWeb应用架构,不仅能提升应用的性能和可靠性,还能为未来的功能扩展和维护提供坚实的基础。本文将介绍如何构建一个可扩展的JavaWeb应用架构,并提供相应的代码示例。1.选择合适的技
Web+Tomcat+Servlet+MySQL实现登录页面【JavaWeb笔记一】
YuBooy
JavaWeb学习笔记 java jdbc javaweb
目录功能描述:实现框图:具体实现过程一、环境搭建服务器环境搭建:页面部分环境搭建:数据库部分环境搭建:二、代码实现过程1、创建一个带表单提交的html页面(login.html)2、在web.xml文件下绑定Servlet的对象类3、创建java(LoginServer.java)类来执行Servlet操作4、jdbc完成数据库部分操作(Demo.java)5、通过测试@Test完成数据库的连接测
【计算机毕业设计项目推荐】计算机毕业设计项目推荐(源码+论文+PPT)
易开科技_Wx:JavaRui666
课程设计 java 开发语言
2023年最新计算机毕业设计,本科,项目汇总!哈喽,大家好,大四的同学马上要开始做毕业设计了,大家做好准备了吗?博主给大家详细整理了计算机毕业设计最新项目,对项目有任何疑问,都可以问博主哦~一、JavaWeb管理系统毕设项目这些系统很不错,建议把管理系统作为毕业设计。学籍管理系统设计与实现教务管理系统设计与实现网上考试系统设计与实现在线考试系统设计与实现题库(及试卷)管理系统设计与实现网络远程作业
Web开发中的“返回上一页”
Java搬砖组长
前端
在JavaWeb应用程序中(如使用Servlet、JSP、Spring等框架),实现“返回上一页”通常是在前端通过JavaScript来完成的。例如,用户点击“返回”按钮时,浏览器会返回到上一个页面。在JSP页面中,可以使用以下代码实现“返回上一页”功能:返回上一页或者通过Servlet设置“Referer”来实现返回上一页://获取上一个页面的URLStringreferer=request.g
过滤器与拦截器的区别与应用
黄尚圈圈
java tomcat spring spring boot
在JavaWeb开发中,过滤器(Filter)和拦截器(Interceptor)是两种常见的用于处理请求和响应的组件,它们在功能上有一定的重叠,但在使用场景、实现方式和作用范围上存在显著的差异。本文将深入探讨过滤器与拦截器的区别,以及它们在实际项目中的应用。1.定义与概念过滤器(Filter)过滤器是Servlet规范中的一部分,它允许你对请求(Request)和响应(Response)进行预处理
文件上传和下载
提笔忘字_波
一、概论在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileuplo
#Cookie、Session#JavaWeb学习笔记(2020/3/2)
RinP
一、会话技术客户端之间的通话:Cookie技术服务器端会话技术:Session技术目的是在一次会话中共享数据。1、Cookie技术使用Cookie的步骤:1.一个Servlet中、创建一个Cookie对象,存入键值对信息Cookiecookie=newCookie("msg","こんにちは");2.使用response对象的voidaddCookie(Cookievar1);方法添加Cookie到
基于JavaWeb开发的JavaSpringboot+Vue实现前后端分离房屋租赁系统
网顺技术团队
成品程序项目 vue.js 前端 javascript 课程设计 前端框架 java spring boot
基于JavaWeb开发的JavaSpringboot+Vue实现前后端分离房屋租赁系统作者主页网顺技术团队欢迎点赞收藏⭐留言文末获取源码联系方式查看下方微信号获取联系方式承接各种定制系统精彩系列推荐精彩专栏推荐订阅不然下次找不到哟Java毕设项目精品实战案例《1000套》感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人文章目录基于JavaW
java杨辉三角
3213213333332132
java基础
package com.algorithm;
/**
* @Description 杨辉三角
* @author FuJianyong
* 2015-1-22上午10:10:59
*/
public class YangHui {
public static void main(String[] args) {
//初始化二维数组长度
int[][] y
《大话重构》之大布局的辛酸历史
白糖_
重构
《大话重构》中提到“大布局你伤不起”,如果企图重构一个陈旧的大型系统是有非常大的风险,重构不是想象中那么简单。我目前所在公司正好对产品做了一次“大布局重构”,下面我就分享这个“大布局”项目经验给大家。
背景
公司专注于企业级管理产品软件,企业有大中小之分,在2000年初公司用JSP/Servlet开发了一套针对中
电驴链接在线视频播放源码
dubinwei
源码 电驴 播放器 视频 ed2k
本项目是个搜索电驴(ed2k)链接的应用,借助于磁力视频播放器(官网:
http://loveandroid.duapp.com/ 开放平台),可以实现在线播放视频,也可以用迅雷或者其他下载工具下载。
项目源码:
http://git.oschina.net/svo/Emule,动态更新。也可从附件中下载。
项目源码依赖于两个库项目,库项目一链接:
http://git.oschina.
Javascript中函数的toString()方法
周凡杨
JavaScript js toString function object
简述
The toString() method returns a string representing the source code of the function.
简译之,Javascript的toString()方法返回一个代表函数源代码的字符串。
句法
function.
struts处理自定义异常
g21121
struts
很多时候我们会用到自定义异常来表示特定的错误情况,自定义异常比较简单,只要分清是运行时异常还是非运行时异常即可,运行时异常不需要捕获,继承自RuntimeException,是由容器自己抛出,例如空指针异常。
非运行时异常继承自Exception,在抛出后需要捕获,例如文件未找到异常。
此处我们用的是非运行时异常,首先定义一个异常LoginException:
/**
* 类描述:登录相
Linux中find常见用法示例
510888780
linux
Linux中find常见用法示例
·find path -option [ -print ] [ -exec -ok command ] {} \;
find命令的参数;
SpringMVC的各种参数绑定方式
Harry642
springMVC 绑定 表单
1. 基本数据类型(以int为例,其他类似):
Controller代码:
@RequestMapping("saysth.do")
public void test(int count) {
}
表单代码:
<form action="saysth.do" method="post&q
Java 获取Oracle ROWID
aijuans
java oracle
A ROWID is an identification tag unique for each row of an Oracle Database table. The ROWID can be thought of as a virtual column, containing the ID for each row.
The oracle.sql.ROWID class i
java获取方法的参数名
antlove
java jdk parameter method reflect
reflect.ClassInformationUtil.java
package reflect;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAtt
JAVA正则表达式匹配 查找 替换 提取操作
百合不是茶
java 正则表达式 替换 提取 查找
正则表达式的查找;主要是用到String类中的split();
String str;
str.split();方法中传入按照什么规则截取,返回一个String数组
常见的截取规则:
str.split("\\.")按照.来截取
str.
Java中equals()与hashCode()方法详解
bijian1013
java set equals() hashCode()
一.equals()方法详解
equals()方法在object类中定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、I
精通Oracle10编程SQL(4)使用SQL语句
bijian1013
oracle 数据库 plsql
--工资级别表
create table SALGRADE
(
GRADE NUMBER(10),
LOSAL NUMBER(10,2),
HISAL NUMBER(10,2)
)
insert into SALGRADE values(1,0,100);
insert into SALGRADE values(2,100,200);
inser
【Nginx二】Nginx作为静态文件HTTP服务器
bit1129
HTTP服务器
Nginx作为静态文件HTTP服务器
在本地系统中创建/data/www目录,存放html文件(包括index.html)
创建/data/images目录,存放imags图片
在主配置文件中添加http指令
http {
server {
listen 80;
server_name
kafka获得最新partition offset
blackproof
kafka partition offset 最新
kafka获得partition下标,需要用到kafka的simpleconsumer
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.
centos 7安装docker两种方式
ronin47
第一种是采用yum 方式
yum install -y docker
 
java-60-在O(1)时间删除链表结点
bylijinnan
java
public class DeleteNode_O1_Time {
/**
* Q 60 在O(1)时间删除链表结点
* 给定链表的头指针和一个结点指针(!!),在O(1)时间删除该结点
*
* Assume the list is:
* head->...->nodeToDelete->mNode->nNode->..
nginx利用proxy_cache来缓存文件
cfyme
cache
user zhangy users;
worker_processes 10;
error_log /var/vlogs/nginx_error.log crit;
pid /var/vlogs/nginx.pid;
#Specifies the value for ma
[JWFD开源工作流]JWFD嵌入式语法分析器负号的使用问题
comsci
嵌入式
假如我们需要用JWFD的语法分析模块定义一个带负号的方程式,直接在方程式之前添加负号是不正确的,而必须这样做:
string str01 = "a=3.14;b=2.71;c=0;c-((a*a)+(b*b))"
定义一个0整数c,然后用这个整数c去
如何集成支付宝官方文档
dai_lm
android
官方文档下载地址
https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash
集成的必要条件
1. 需要有自己的Server接收支付宝的消息
2. 需要先制作app,然后提交支付宝审核,通过后才能集成
调试的时候估计会真的扣款,请注意
应该在什么时候使用Hadoop
datamachine
hadoop
原帖地址:http://blog.chinaunix.net/uid-301743-id-3925358.html
存档,某些观点与我不谋而合,过度技术化不可取,且hadoop并非万能。
--------------------------------------------万能的分割线--------------------------------
有人问我,“你在大数据和Hado
在GridView中对于有外键的字段使用关联模型进行搜索和排序
dcj3sjt126com
yii
在GridView中使用关联模型进行搜索和排序
首先我们有两个模型它们直接有关联:
class Author extends CActiveRecord {
...
}
class Post extends CActiveRecord {
...
function relations() {
return array(
'
使用NSString 的格式化大全
dcj3sjt126com
Objective-C
格式定义The format specifiers supported by the NSString formatting methods and CFString formatting functions follow the IEEE printf specification; the specifiers are summarized in Table 1. Note that you c
使用activeX插件对象object滚动有重影
蕃薯耀
activeX插件 滚动有重影
使用activeX插件对象object滚动有重影 <object style="width:0;" id="abc" classid="CLSID:D3E3970F-2927-9680-BBB4-5D0889909DF6" codebase="activex/OAX339.CAB#
SpringMVC4零配置
hanqunfeng
springmvc4
基于Servlet3.0规范和SpringMVC4注解式配置方式,实现零xml配置,弄了个小demo,供交流讨论。
项目说明如下:
1.db.sql是项目中用到的表,数据库使用的是oracle11g
2.该项目使用mvn进行管理,私服为自搭建nexus,项目只用到一个第三方 jar,就是oracle的驱动;
3.默认项目为零配置启动,如果需要更改启动方式,请
《开源框架那点事儿16》:缓存相关代码的演变
j2eetop
开源框架
问题引入
上次我参与某个大型项目的优化工作,由于系统要求有比较高的TPS,因此就免不了要使用缓冲。
该项目中用的缓冲比较多,有MemCache,有Redis,有的还需要提供二级缓冲,也就是说应用服务器这层也可以设置一些缓冲。
当然去看相关实现代代码的时候,大致是下面的样子。
[java]
view plain
copy
print
?
public vo
AngularJS浅析
kvhur
JavaScript
概念
AngularJS is a structural framework for dynamic web apps.
了解更多详情请见原文链接:http://www.gbtags.com/gb/share/5726.htm
Directive
扩展html,给html添加声明语句,以便实现自己的需求。对于页面中html元素以ng为前缀的属性名称,ng是angular的命名空间
架构师之jdk的bug排查(一)---------------split的点号陷阱
nannan408
split
1.前言.
jdk1.6的lang包的split方法是有bug的,它不能有效识别A.b.c这种类型,导致截取长度始终是0.而对于其他字符,则无此问题.不知道官方有没有修复这个bug.
2.代码
String[] paths = "object.object2.prop11".split("'");
System.ou
如何对10亿数据量级的mongoDB作高效的全表扫描
quentinXXZ
mongodb
本文链接:
http://quentinXXZ.iteye.com/blog/2149440
一、正常情况下,不应该有这种需求
首先,大家应该有个概念,标题中的这个问题,在大多情况下是一个伪命题,不应该被提出来。要知道,对于一般较大数据量的数据库,全表查询,这种操作一般情况下是不应该出现的,在做正常查询的时候,如果是范围查询,你至少应该要加上limit。
说一下,
C语言算法之水仙花数
qiufeihu
c 算法
/**
* 水仙花数
*/
#include <stdio.h>
#define N 10
int main()
{
int x,y,z;
for(x=1;x<=N;x++)
for(y=0;y<=N;y++)
for(z=0;z<=N;z++)
if(x*100+y*10+z == x*x*x
JSP指令
wyzuomumu
jsp
jsp指令的一般语法格式: <%@ 指令名 属性 =”值 ” %>
常用的三种指令: page,include,taglib
page指令语法形式: <%@ page 属性 1=”值 1” 属性 2=”值 2”%>
include指令语法形式: <%@include file=”relative url”%> (jsp可以通过 include