前言:过程中,希望各位看看语言方面的内容.呵呵,不管什么方式也好,总算是一字一句的想出来和敲打出来的吧....希望不浪费各位时间的前提下,就给大家列出了主要的.其实说实话,很多都是昨天已经写好了的,之所以没有昨天传上来,因为程序没有完成,所以今天都做好了,就传上来吧.给大家分享一下自己的一点点看法.
说实话,这次做得并不好,因为要求(其实是自我想法.)导入的时候,只是不上传,直接本地导入到远程数据库就可以了,可是后来还是做成了先上传,再导入.所以不那么尽如人意.不过在这个不如人意的过程中,还是收获不少了一点点,学习总是有过程的.希望大家也不断的学习进步.......
这个也是适应项目的需求,如果要是说有多大的价值,我想,就是自己对于这个项目的一点总结,算不上其他的推广运用.因为究竟能够除了这个之外,还有多少运用,这个不好说.不过,导入,上传,还是会用到的,其实这个很简单,网上一大片,哪里都有相当多的例子,不管是怎么样的.
不过说实话,很难找到你所需要的,就算是我这个写出来了,你也不一定能用上.因为这个针对EXT的,就算是提供一个思想吧.其实方式很多,这里就是一个普通的方法.还是来介绍一下整体吧,(纯EXT.MySQL数据库(说实话,这里就是为了实现.如果是实际项目,我想数据库方面大家不用考虑,直接save方法就可以了.或许用Oracle(我的这个项目当然是用Oracle)或者MSSQL之类的.)后台用servlet来处理)这里就这样就可以完成了,其实思路十分清晰.就跟大家做每一件事情一样!页面(显示数据)--->点击导入--->选择文件--->后台处理(先上传,然后读取文件写入数据库)--->页面自动刷新显示所有数据.
这里也是为了适应上一个的JXL的Excel操作,因为当时以为就是直接的导入就可以了,原来自己忽略了还有远程的效果,所以方法根本行不通.所以在接下来的写JXL针对Excel操作的时候,都是针对远程(当然,本地就自然而然了).这里只是先写下自己在EXT里面操作的过程吧.具体的一些语言解释,这里就不会这样详尽了,具体的可以去参看API.不过还是很多地方.我都会给予注释的.
好了,说了这么多,还是开始工程吧.(MyEclipse下建立)又需要源文件的.留下邮箱,可执行文件可以传给你.
准本好包(commons-fileupload-1.2.1,commons-io-1.4),其实就是用谁的上传处理而已,这个因人而异,随你喜好,不过我说的不是这里,而是在程序中出现的request得不到的问题,具体的,还请接着看.
准备好EXT的插件.要包含多少,自己定,不过这里的上传控件,我是用的EXT2.2的那个来处理的,你可以用,可以不用,随便你了.
接下来就是程序了,
先建立jsp文件.放到upload目录下,然后就是upload.jsp.里面包含了所有的内容.
针对用EXTJS所有的内容,里面只是包含了那么一点点.
这里说一句,贴出来的只是针对上传部分的,完整的代码可以留言,或者是留下邮箱,整体可运行的传给你.这里的部分没有运行过,我想也肯定运行不出来,呵呵,不过里面的代码是有用的,特别是针对Excel操作的servlet部分,里面的大家可以借鉴一下,接下来还要写针对JXL的一些内容
这里是jsp部分,其实都是纯EXT写的.
<mce:script type="text/javascript" src="<%=webapp%><!--
/ext/js/ext-base.js">
// --></mce:script>
<mce:script type="text/javascript" src="<%=webapp%><!--
/ext/js/ext-all.js">
// --></mce:script>
<mce:script type="text/javascript" src="<%=webapp%><!--
/inc/function.js">
// --></mce:script>
<mce:script type="text/javascript" src="<%=webapp%><!--
/ext/js/ext-lang-zh_CN.js">
// --></mce:script>
<!-- 上传 -->
<link rel="stylesheet" type="text/css" href="<%=webapp%>/css/file-upload.css">
<mce:script type="text/javascript" src="<%=webapp%><!--
/ext/upload/FileUploadField.js">
// --></mce:script>
<!-- <mce:script type="text/javascript" src="<%=webapp%><!--
/ext/upload/file-upload.js">
// --></mce:script> -->
<mce:script language="JavaScript"><!--
Ext.BLANK_IMAGE_URL = '<%=webapp%>/ext/resources/images/default/s.gif';
var ds, sm, cm, menubar, pagingbar, grid, form, gridhead, gridfoot, rightclickmenu, panel,editForm,addForm,formWindow,selectedRow;
var toolbar, paging;
var filterbtn,menu;
var filters;
var addinstancedlg, updateinstancedlg;
var addform, editform, formwindow;
var name_tf, description_tf, name_show, description_show;
var updateid;
//列表字段
var id, name, address;
//上传文件
var excelFile;
//将编号设置为绿色,呵呵,只是为了好看而已,各位可以去掉.
function renderSex(value) {
return "<span style="color:green;font-weight:bold;" mce_style="color:green;font-weight:bold;">" + value + "</span>";
}
//字符长度
//
function stringLentest(value){
return getLength(value)>30 ? '服务器名称不能超过30个字节!' : true;
}
function init()
{
Ext.QuickTips.init();
ds = new Ext.data.GroupingStore({
proxy: new Ext.data.HttpProxy({url:'<%=webapp%>/servlet/Upload?action=query'}),
reader: new Ext.data.JsonReader({
totalProperty: 'totalProperty',
root: 'root',
Id:'Id'
}, Ext.data.Record.create([
{name: 'Id',type:'float'},
{name: 'name',type:'string'},
{name: 'address',type:'string'}
])),
remoteSort: false
});
ds.load({params:{start:0,limit:15,total:-1}});
ds.setDefaultSort('Id','asc');
sm = new Ext.grid.CheckboxSelectionModel();
cm = new Ext.grid.ColumnModel([
new Ext.grid.RowNumberer(),
sm,
{header:'用户编号',width:30,sortable: true,dataIndex:'Id',renderer:renderSex},
{header:'用户名称',width:40,sortable: true,dataIndex:'name'},
{header:'用户住址',width:30,sortable: true,dataIndex:'address'}
]);
cm.defaultSortable = true;
menubar = [{
text:'添加',
tooltip:'添加',
iconCls:'add',
handler: add
},'-',{
text:'删除',
tooltip:'删除选中行',
iconCls:'remove',
handler: remove
},'-',{
text:'导入',
tooltip:'导入EXCEL文件',
iconCls:'upload',
handler: upload
},'-',{
text:'导出',
tooltip:'导出EXCEL文件',
iconCls:'download',
handler: download
},'-',{
text:'下载模板',
tooltip:'导出EXCEL模板文件',
iconCls:'save',
handler: downloadModel
}];
pagingbar = new Ext.PagingToolbar({
pageSize: 15,
store: ds,
displayInfo: true,
displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
emptyMsg: "没有记录"
});
//创建编辑器表格
grid = new Ext.grid.GridPanel({
el: 'extGrid',
ds: ds,
cm: cm,
loadMask: {msg:'正在加载数据,请稍侯……'},
applyRowClass: function(record, rowIndex, p, ds) {
if (this.showPreview) {
var xf = Ext.util.Format;
p.body = '<p>' + xf.ellipsis(xf.stripTags(record.data.description), 10) + '</p>';
return 'x-grid3-row-expanded';
}
return 'x-grid3-row-collapsed';
},
viewConfig: {
forceFit:true,
enableRowBody:true,
showPreview:true,
getRowClass : this.applyRowClass
},
sm: sm,
title: '导入测试专栏',
autoHeight:true,
bodyStyle:'width:100%',
collapsible: true,
animCollapse: false,
resizable: true,
autoSizeColumns : true,
bbar: pagingbar,
tbar: menubar
});
grid.render();
grid.on('rowdblclick', onRowDbClick, this);
grid.getSelectionModel().selectFirstRow();
}
/*************************初始化表单*************************/
function initForm() {
//准备表单字段
Id = new Ext.form.TextField({
fieldLabel: '用户编号',
allowBlank: false,
maxLength: 6,
name: 'Id',
width: 160
});
name = new Ext.form.TextField({
fieldLabel: '用户名称',
allowBlank: false,
maxLength: 30,
name: 'name',
width: 160
});
address = new Ext.form.TextField({
fieldLabel: '用户住址',
allowBlank: false,
maxLength: 30,
name: 'address',
width: 160
});
}
/*************************表格双击行事件*************************/
function onRowDbClick(grid, rowIndex, e) {
selectedRow = grid.getSelectionModel().getSelected();//左键点选或勾选的行
edit();
}
/*************************form&action方式编辑*************************/
function edit() {
//初始化表单
initForm();
id.readOnly = true;
//生成editForm
editForm = new Ext.form.FormPanel({
waitMsgTarget: true,
baseCls: 'x-plain',
labelWidth: 80,
labelAlign: 'right',
url: '<%=webapp%>/servlet/Upload?action=update',
defaultType: 'textfield',
items: [Id,name,address]
});
//把选中行里面的值写入表单
editForm.items.get(0).value = selectedRow.get('id');
editForm.items.get(1).value = selectedRow.get('name');
editForm.items.get(2).value = selectedRow.get('address');
//另外用窗口来编辑,下面的添加,导入,同.
initWindow(editForm, '编辑已有的记录');
}
/*************************form&action方式编辑*************************/
/*************************form&action方式创建*************************/
function add() {
//初始化表单
initForm();
id.readOnly = false;
addForm = new Ext.form.FormPanel({
waitMsgTarget: true,
baseCls: 'x-plain',
labelWidth: 80,
labelAlign: 'right',
url: '<%=webapp%>/servlet/Upload?action=insert',
defaultType: 'textfield',
items: [Id,name,address]
});
//生成表单窗口
initWindow(addForm, '创建新记录');
}
/*************************form&action方式创建*************************/
/*************************ajax&action方式删除*************************/
function remove() {
//修订了删除框其它框还存在
if(formWindow != null){
formWindow.destroy();
}
var rows = grid.getSelections();
if (rows.length == 0 && selectedRow != null)
rows[0] = selectedRow;
//如果至少有一行被选中
if (rows.length > 0 && sm.getCount()!=0)
{
Ext.MessageBox.confirm('选择', '您确定要删除记录吗?',
function(btn) {
if (btn == 'yes') {
var ids = new Array();
for (var i = 0; i < rows.length; i++) {
//取得ID列。注意:这里取的是表格中列名为remark的列
ids[i] = rows[i].get('id');
}
Ext.Ajax.request({
//请求地址。注意:路径
url:'<%=webapp%>/servlet/Upload?action=delete&ids=' + ids,
//提交参数组//其实说实话,我更愿意用这里来传递参数,因为它肯定不会出现乱码,(当然,我没有试过其他什么编码乱转的情况,所以不要专牛角尖.)
//而你用上面的跟踪来传递参数,如果有中文,前台如果你不注意用不同的方式,会出现不管你怎么转,都转不过来的乱码.
params: {
},
//成功时回调
success: function(response, options) {
//获取响应的json字符串
var responseArray = Ext.util.JSON.decode(response.responseText);
if(responseArray.success==true){
Ext.Msg.alert('成功',responseArray.info);
ds.reload();
}else {
Ext.Msg.alert('失败',responseArray.errorInfo);
}
}
});
//这里的返回没有效果,所以出现了问题,
this.ds.reload();
}
}
);
}
else
{
Ext.MessageBox.alert('提示', '要执行删除操作, 请至少选择一条记录!');
}
ds.reload();
}
/*************************ajax&action方式删除*************************/
/*************************form&action提交成功事件*************************/
function onSuccess(form, action) {
formWindow.destroy();
Ext.MessageBox.alert('操作成功', action.result.info);
ds.reload();//事实上这里又按照原来的设置提交了一次
}
/*************************form&action提交成功事件*************************/
/*************************form&action提交失败事件*************************/
function onFailure(form, action) {
Ext.MessageBox.alert('操作失败', action.result.errorInfo);
}
/*************************form&action提交失败事件*************************/
/*************************ajax&action方式导入*************************/
//检查文件是否存在,如果下面的是readonly的话就不需要判断了,直接判断它是不是xls就可以了.
//这个普遍不是那么实用,因为他会提示用户一些安全信息,所以有些不必要,就跟提示你安装插件一样,不友好吧,所以废弃.还是放到后台处理吧.
function checkFile(fileVal){
var fso = new ActiveXObject("Scripting.FileSystemObject");
if(fso.FileExists(fileVal)){
return true;
}else{
return '导入失败', '此导入文件不存在,请检查!';
}
}
//检查是否是Excel文件
function isExcel(value){
var start = value.lastIndexOf('.');
var end = value.length;
var excelVal = value.substring((start+1),end);
if(excelVal=='xls'){
return true;
}else{
return '导入必须是Excel文件类型';
}
}
function upload(){
//initForm();
uploadForm = new Ext.form.FormPanel({
fileUpload : true,//这个必须有,就跟指定jsp的form的enctype类型一样,不然就会出现问题.
frame: true,
waitMsgTarget: true,
labelAlign: 'right',
baseCls: 'x-plain',
labelWidth: 145,
defaultType: 'textfield',
items: [
{
fieldLabel : '请选择导入文件(.xls类型)',
id : 'excelFile',
name : 'excelFile',
xtype: 'fileuploadfield',
readOnly : false,
validator : isExcel,
width : 300,
allowBlank : false
}
]
});
uploadWindow(uploadForm, '导入服务器配置信息');
}
//这里是选择文件,并且过滤掉其他文件类型.只能是Excel
function uploadWindow(formPanel, title){
//一次只能添加或者修改一条记录.
if(formWindow!=null){
formWindow.destroy();
}
formWindow = new Ext.Window({
title: title,
width: 500,
height: 105,
minWidth: 200,
minHeight: 200,
layout: 'fit',
plain:true,
bodyStyle:'padding:5px;',
buttonAlign:'center',
items: formPanel,
buttons: [{
text: '导入',
handler: function() {
var excelFile = Ext.get('excelFile').dom.value;
if (formPanel.form.isValid()) {
formPanel.form.submit({
url : '<%=webapp%>/servlet/Upload?action=upload',
//看到了吧,这里我就用这样的方式来传递上传文件路劲的参数,因为有乱码始终转换不过来,路径中也有中文,所以还是这样来得比较的方便.
//当然,这样也是为了规格化,上面的action也可以用这样的传递方式,不过这里主要不是说整体怎么样,先演示上传功能,其他的先放下.
params:{excelFile:excelFile},
failure: onFailure,
success: onSuccess
});
} else {
Ext.MessageBox.alert('提交失败', '输入的数据有误!请检查对应红色提示框!');
}
}
},{
text: '取消',
handler: function() {
formWindow.destroy();
}
}]
});
formWindow.show();
}
/*************************ajax&action方式导入*************************/
/*************************ajax&action方式导出*************************/
function download(){
var url = '<%=webapp%>/servlet/ServerAttrServlet?action=download';
window.location = url;
//window.location.href就可以直接导出?
}
/*************************ajax&action方式导出*************************/
/*************************ajax&action方式导出模板*************************/
function downloadModel(){
//这里就不用上传下载模板的那一块了,因为只是一个选取下载路劲,然后直接从你的路径下读取你所指定的某一个就行了.
//var url = '<%=webapp%>/servlet/DownLoadDemoXLS?FileName=demo7.xls&FilePath=D://upload.xls';
//window.location = url;
}
/*************************ajax&action方式导出模板*************************/
/*************************生成表单窗口*************************/
function initWindow(formPanel, title) {
if(formWindow!=null){
formWindow.destroy();
}
formWindow = new Ext.Window({
title: title,
width: 280,
height: 155,
minWidth: 200,
minHeight: 200,
layout: 'fit',
plain:true,
bodyStyle:'padding:5px;',
buttonAlign:'center',
items: formPanel,
buttons: [{
text: '确认',
handler: function() {
var svrIpaddrOne = Ext.get('svrIpaddr').dom.value;
var svrNameOne = Ext.get('svrName').dom.value;
if (formPanel.form.isValid()) {
formPanel.form.submit({
waitMsg:'数据处理中,请等待...',
failure: onFailure,
success: onSuccess
});
}
else {
Ext.MessageBox.alert('提交失败', '输入的数据有误!请检查对应红色提示框!');
}
}
},{
text: '取消',
handler: function() {
formWindow.destroy();
}
}]
});
formWindow.show();
}
/*************************生成表单窗口*************************/
Ext.onReady(init, true);
parent.document.getElementById("loading").style.display = "none";
// --></mce:script>
</head>
<body class="body_class">
<div id="extGrid" style="WIDTH:100%">
<div id="toolbar"> </div>
</div>
</body>
</html>
然后servlet部分.
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import java.sql.*;
import org.springframework.jdbc.core.JdbcTemplate;
import net.sf.json.JSONArray;
public class Upload extends HttpServlet {
/**
* author : lip(Lzg)
* 2009-01-14
*
*/
private JdbcTemplate jdbcTemplate;
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//第一:数据库操作.
//数据库读写操作.由于整个操作,我就列出了显示,导入,所以这里不需要其他的诸如添加,删除,修改操作的项目.那些又需要的就自行添加可以了.按钮已经给你安排好了.
Connection conn = null;
Statement stat = null;
ResultSet resl;
PreparedStatement prepare = null;
//这里的sql是为了下面导出应用,呵呵,说得似乎有些夸张,不过却是是这样,
StringBuffer sql;
try{
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://localhost:5885/excel","root","5885");
//一下提供两种方式.一种是ResultSet
stat = conn.createStatement();
//紧跟着就可以用resl来进行操作.
//第二种就是PreparedStatement进行操作
//语句见下
}catch(Exception e){
e.printStackTrace();
}
//(第一步完成.)
//第二:开始操作.
//获取前台的信息进行处理.
response.setContentType("text/json;charset=utf-8");
String flag="query";
flag=(String)request.getParameter("action");
//以下是返回到前台.
String json = "";
//查询列表
if(flag.equals("query")){
try{
sql = new StringBuffer("select * from upload");
resl = stat.executeQuery(sql.toString());
System.out.println(resl);
List list = toList(resl);
System.out.println(list);
String count = "select count(*) from upload";
int total = resl.getRow();
JSONArray jsonObj=null; //这里关于JSON的一些内容,请看最下面的解释(解释一:)
jsonObj = JSONArray.fromObject(list);
json = "{totalProperty:"+total+",root:"+jsonObj.toString()+"}";
}catch(Exception e){
json="{success:false,errorInfo:'导入练习表查询失败'}";
}
response.getWriter().write(json);
}
//导入
/*
* 说明:很多时候,本机上不用先上传,这个也是很多人就直接写JXL进行操作Excel的原因,其实大部分时候,是相当多的都是远程导入的,
* 这个时候,当然如果有更好的诸如利用缓存的时候,可以不用先上传,直接导入,为了说明,上传和导入全部,这里就用上传,然后导入.
*
*/
else if(flag.equals("upload")){
//说明:这里只是规格化导入,全部没有问题,有问题的只是做了简单的处理.所以根据需要改进.
json="{success:true,info:'服务器配置信息导入成功'}";
//先上传
final long MAX_SIZE = 20*1024*1024;//可以上传的文件最大限度
final String[] allowedExt = {"xls"};//这里之所以用数组,是因为,可以提供更多的机会,你可以直接不用这里,直接判断是否是这个格式.
// 设置字符编码,根据需要设置,
//response.setCharacterEncoding("");
//这一句必须要,否则就会出现问题,request得不到数据.一直是null.
response.setContentType("text/html");
//实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
DiskFileItemFactory dfif = new DiskFileItemFactory();
dfif.setSizeThreshold(32*1024);//设置上传文件时用于临时存放文件的内存大小,这里是512K.多于的部分将临时存在硬盘
dfif.setRepository(new File(request.getRealPath("/")+"UploadTemp"));//设置存放临时文件的目录,web根目录下的UploadTemp目录
//用以上工厂实例化上传组件
ServletFileUpload sfu = new ServletFileUpload(dfif);
sfu.setSizeMax(MAX_SIZE);//设置最大上传尺寸
try{
//从request得到 所有 上传域的列表
List fileList = sfu.parseRequest(request);
if(fileList==null || fileList.size()==0){
json="{success:false,errorInfo:'导入文件不存在!请检查'}";
}else{
Iterator fileIterator = fileList.iterator();//得到所有上传的文件
while(fileIterator.hasNext()){//循环处理所有文件
FileItem fileItem = (FileItem)fileIterator.next();//得到文件.
if(fileItem==null || fileItem.isFormField()){
continue;//忽略简单form字段而不是上传域的文件域(<input type="text" />等)其实这里不可能,
}
String path = fileItem.getName();//得到完整的上传路劲
long size = fileItem.getSize();//得到文件的大小.
if(path.equals("")||size==0){
json="{success:false,errorInfo:'导入文件不符!请检查'}";//同样,很多地方都可以不用,因为这里只是说明导入,
}else{
String t_name = path.substring(path.lastIndexOf("//")+1);//得到去除路径的文件名
String t_ext = t_name.substring(t_name.lastIndexOf(".")+1);//得到文件的扩展名(无扩展名时将得到全名)
//拒绝接受规定文件格式之外的文件类型
for(int allowFlag = 0;allowFlag<allowedExt.length;allowFlag++){
if(allowedExt[allowFlag].equals(t_ext)){
break;
}
}
//根据系统时间生成上传后保存的文件名
String prefix = String.valueOf(System.currentTimeMillis());
//保存的最终文件完整路径,保存在工程项目根目录下的Uploaded目录下
String u_name = request.getRealPath("/") + "Uploaded/" + prefix + "." + t_ext;
//开始保存文件了.
File uploadFile = new File(u_name);
//uploadFile.createNewFile();
fileItem.write(uploadFile);
//上传完成,那就开始导入吧.这里就是JXL操作了.
//这里的操作顺序就不用说了,因为前面关于JXL的执行顺序,导入导出都说得相当详细了.
Workbook wb = Workbook.getWorkbook(uploadFile);
String id = "";//这三个对应数据库的字段
String name = "";
String address = "";
Sheet sheet = wb.getSheet(0);//这里就不用数组了,因为只是第一页写数据就够了.
int rowNum = sheet.getRows();
for(int iRow = 0;iRow < rowNum;iRow++){
Cell[] cells = sheet.getRow(iRow);
if(cells!=null||cells.length>0){
id = cells[0].getContents();
name = cells[1].getContents();
address = cells[2].getContents();
System.out.println(id+"-----"+name+"----"+address);
/**这里注意,自己写在Excel里面的数据不要出错,因为id是主键,当然,你可以不设置主键,字符长度设为"无限",要不然就自己写判断语句.冲突的进行处理.*/
String insertSql = "insert into upload(id,name,address) values (?,?,?)";
prepare = conn.prepareStatement(insertSql);
prepare.setInt(1, Integer.parseInt(id));
prepare.setString(2, name);
prepare.setString(3, address);
prepare.executeUpdate();
System.out.println("---success---");
//stat.executeUpdate();
}
}
}
}
}
}catch(Exception e){
json="{success:false,errorInfo:'导入练习表查询失败'}";
}
response.getWriter().write(json);
}
//插入
else if(flag.equals("insert")){
}
//删除
else if(flag.equals("delete")){
}
//更新
else if(flag.equals("update")){
}
//导出
else if(flag.equals("download")){
}
}
//将result转换为list
public List toList(ResultSet rs)
{
try
{
List list = new ArrayList();
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
//Map rowData;
while (rs.next()) {
//rowData = new HashMap(columnCount);
Map rowData = new HashMap();
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
return list;
}
catch(Exception ex)
{
ex.printStackTrace();
return null;
}
}
//getter and setter
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
}
/** 解释一:
有相当的关于JSON的内容,它需要第三方的东西在里面,而且都是需要更新的东西,所以有时候运行有问题,就需要去看看是否缺少了什么东西,
这个是JSON官网上的内容,大家可以多关注一下其他的相关内容,这里所说的如果你运行JSON相关的时候,如果少了哪一个包,都会出现问题.
还有其他地方没有说到的地方,还请大家注意,包不一定要这个版本的,不过要的是能够运行出来,比如其中的很多包,我用过比较旧的,都可以运行.
Json-lib requires (at least) the following dependencies in your classpath:
jakarta commons-lang 2.4
jakarta commons-beanutils 1.7.0
jakarta commons-collections 3.2
jakarta commons-logging 1.1.1
ezmorph 1.0.6
所以有些包是必不可少的,是否需要这些包,其实如果其他包(比如低级的包)含有它需要的内容,他同样可以运转
有了所有的包之后,就可以运行了,可以全部显示出来.如果少了哪个,就会出现错误.
*/