项目开发中遇到的问题和解决方式
1. Easyui属性,事件和方法的使用方式,使用中遇到的问题和解决方法.........................2
1.1属性,事件和方法的使用..................................................................................2
1.1.1 属性:$(“jq选择器语法”).插件({属性:’属性值根据属性值类型决定是否待单引号或双引号’}); 2
1.1.2事件的使用................................................................................................2
1.1.3方法的使用................................................................................................3
1.2遇到的问题和解决方法.........................................................................................3
1.2.1 datagrid问题......................................................................................3
1.2.1.1如何在行里增加html标签或者对某列数据进行处理......................3
使用列属性中的formatter事件function(此行此列的值,此行的数据对象,此行的索引) 3
1.2.1.2点击某一行禁止选中........................................................................3
1.2.1.3在有复选框datagrid中,出现使用 load刷新事件和选中一个点击分页,全选的情况。 4
1.2.1.4获取选中复选框的数据....................................................................4
1.2.2 combobox支持模糊查询............................................................................4
1.2.3消息定位问题............................................................................................4
2.Oracle 存储过程遇到的问题和解决方法......................................................................5
2.1编写存储过程.......................................................................................................5
2.2 存储过程使用到的功能..................................................................................5
2.2.1循环一个数据集........................................................................................5
2.2.2根据某字符分割字符串循环分割的数据.....................................................6
2.2.3存储过程返回数据集.................................................................................6
3.Javaee jsp网站开发中使用的问题..................................................................................8
3.1页面网站目录问题...............................................................................................8
3.2在页面上调用类文件...........................................................................................8
3.3获取配置文件信息 配置文件 booksetpro.properties的配置数据........................8
3.4创建一个类网站启动时就执行,此类的生命周期和网站生命周期是一致的。.....9
3.5 struts2中控制器的配置......................................................................................10
3.6 mybatis调用存储过程返回数据集......................................................................10
3.6 mybatis如何使用 in()........................................................................................11
3.7 struts2 无jsp页面返回 json数据......................................................................12
使用 Easyui 建议使用js注册的方式使用,这样html代码比较整洁,使用也灵活。
以datagrid为列,引用js最好放到页面最下方,因为js文件顺序加载,放到顶部会拖慢页面渲染速度.
如:$('#dg').datagrid({
url:'datagrid_data.json',
columns:[[
{field:'code',title:'Code',width:100},
{field:'name',title:'Name',width:100},
{field:'price',title:'Price',width:100,align:'right'}
]]
});
$(“jq选择器语法”).插件({事件名称:function(参数,参数){}});
如:$("#list_data").datagrid({onLoadSuccess:function () {
}});
$(“jq选择器语法”).插件(“方法名称”,参数,参数);
如: $("#list_data").datagrid('unselectRow', 1);
使用 列属性中的formatter 事件 function(此行此列的值,此行的数据对象,此行的索引)
{field:'BR_USERID',title:'借阅人',width:100,sortable:true,hidden:true},
{field:'borrow',title: '图书借阅',align: 'center',width:120,
formatter:function(value,rowData,rowIndex){
return "
rowData 是行对象 rowData.BR_USERID 就可以获取到BR_USERID 的值。
这样就可以在行里增加html标签了,如果想使用easyui的按钮在onLoadSuccess的事件中注册就可以使用了
onLoadSuccess: function () {
$('.sqjy').linkbutton({
text: '图书借阅',
onClick:function(){ }
});
}
onClickRow: function (rowIndex, rowData) {
$(this).datagrid('unselectRow', rowIndex);
}
数据加载完 执行全部撤销选中的方法
onLoadSuccess: function() { $(this).datagrid('unselectAll');}
复选框列属性
{field:'sqcheck',title:'图书编号',width:80,checkbox:true},
{field:'BK_ID',title:'图书id',width:40},
var ldar= $("#list_data").datagrid("getRows");//获取所有行
//sqcheck就是field的值
$("input[name='sqcheck']:checked").each(function(i,n){
var sqindex= $(this).index("input[name='sqcheck']");//获取行索引
plsqid+=ldar[sqindex].BK_ID+",";//获取行中某个列的值
});
使用 filter 过滤器事件
filter: function(q, row){
var opts = $(this).combobox('options');
return row[opts.textField].indexOf(q)!=-1;//q 输入的值是否在 某一个项中存在,存在返回true 否则false
}
使用中发现alert,confirm 定位是获取整个body 高度居中定位,如果页面有滚动条会出现出窗定位太往下或向下。
修改了easyui 的min 的js
1.中顶部增加 var hg=($(window).height()/2)-120;
2.在 function _278(_279,_27a) 增加 opts.top=hg;
具体位置
opts.top=hg;
if(_27a){
_26f(_279);}
2. function _26f(_270,_271) 增加
//修改浮动属性
setTimeout(function(){
$(".messager-window,.window-shadow,.window").css({"position":"fixed"});
},100);
字符集程序和数据编码要保持一致
create orreplace procedure 存储过程名称(参数名称in number,参数名称out number)
Is
--存储过程内部变量
变量名1 number:=1;
变量名2 number:=1;
begin
--存储过程业务
--存储过程业务语句 使用 “;”分号结尾,分号后必须换行
commit;
end 存储过程名称;
for 数据集变量in(select语句获取数据集)
loop
--循环操作的业务
end loop;
如:
for bkidl in (selectba_bkidfrom (
select ba_bkid,count(1)baycountfrom book_borrowapply bay
inner join book_makeappointment bmonbm.mp_bkid=bay.ba_bkidandbm.Mp_Status=0
wherebay.ba_status=2andBA_RDATETIME<=sysdategroup bybay.ba_bkid) yqtbwherebaycount>maxjy)
loop
--修改图书状态
update book_main setbk_status=10wherebk_id=bkidl.ba_bkid;
end loop;
declareTag varchar(1000);
spLength int:=0;
BMIDs Varchar2(5000);--原字符,用某种符号分割的字符串
spnext INT:=1;
splitchar varchar(10);--分割的符号
begin
BMIDs :='2121$54$98$63';
splitchar:='$';
spLength :=(length(BMIDs)-length(replace(BMIDs,splitchar,''))+1);--计算分组后的长度
whilespnext<=spLength
loop
if(spnext=spLength)then --最后一次直接使用原字符
Tag:=BMIDs;
else
Tag := substr(BMIDs,0,instr(BMIDs,splitchar)-1);--截取字符
BMIDs:=replace(BMIDs,Tag||splitchar,'');--从元字符串中删除已经截取的字符串
endif;
dbms_output.put_line(Tag);
spnext:=spnext+1;
endloop;
end;
返回数据集需要定义out的sys_refcursor的变量
如:
create orreplace procedurebook_getyugh(yqbooklistout sys_refcursor,ghbooklistoutsys_refcursor) is
begin
--提前两天提前逾期领书信息
openyqbooklist for select max(zhmc)zhmc,max(txt)txtfrom book_borrowapply bkr
inner joinxtgl_zhxx zx on zx.ryid=bkr.ba_userid
where Ba_status=2andBA_RDATETIME<=sysdate+2group byzx.ryid;
--提前五天开始提醒归还图书
open ghbooklist for select max(zhmc)zhmc,max(txt)txtfrom Book_borrow bkr
inner joinxtgl_zhxx zx on zx.ryid=bkr.Br_userid
whereBr_status=0andBr_prereturntime<=sysdate+5group byzx.ryid;
endbook_getyugh;
2.2.4 项目中遇到的问题
(1)数据库时间类型数据,查询出来数据不是字符串
解决方法:to_char(br_time,'YYYY-MM-DD HH24:mi:ss')
(2)数据库当前时间sysdate
(3)获取影响行数 rowback:=sql%rowcount;
(4)执行拼接的sql语句
upxsql:='updatebook_borrowapply set ba_status=2,Ba_varuserid='||operuserid||',Ba_vertime=sysdate,Ba_rdatetime=(sysdate+'||yqmaxday||'),Ba_verremark='''||operremark||'''where ba_id in(select min(ba_id) from book_borrowapply where ba_bkid in('||bk_idlist||')group by ba_bkid)';
execute immediate upxsql;--执行sql语句
(5) 逻辑控制语法
If 条件 then
--符合条件
Else
--不符合条件
End if;
(6) 批量插入数据的时候异常:此处不能使用序列
此种情况必须再套用一个select才可以,是序列一个使用限制
insert intoBook_borrowapply(Ba_id,Ba_userid,Ba_apptime,Ba_appremark,Ba_status,Ba_bkid,BA_MPID)
selectbook_borrowapply_seq.nextval,a,b,c,d,e,ffrom (
selectMp_userid a,sysdate b,'预约申请' c,0 d,Mp_bkide,mp_id ffromBook_makeappointment
whereMp_bkid=bkidandMp_status=0andrownum<=maxbkjyorder bymp_id asc );
(7)创建索引
Asc,desc索引排序的方式
create index 索引名称on 表名(列名 asc,列名 desc)
创建索引后可以在 PL/SQL 表-->编辑-->索引和Indexes 找到创建的索引
(8)update 语句中加入 case when
update book_main setbk_status=casewhen 1=1then 2 else 3 end where bk_status=5;
开发中和部署后的网站根目录会有所不同,需要用程序获取网站根目录
<%
String path = request.getContextPath();%>
<scripttype="text/javascript"src="<%=path%>/resource/js/jquery.min.js">script>
<script type="text/javascript"src="<%=path%>/resource/js/jquery.easyui.min.js">script>
<%@pageimport="tsgl.common.MyDES"%>
就可以使用MyDES myd=newMyDES();
配置内容 rtxlog=C\:\\bookweb\\log
Getconfig(“rtxlog”);
//传入配置的key
public Stringgetconfig(String key)throws IOException
{
String cpath= this.getClass().getResource("/").getPath();
Properties pro=new Properties();
FileInputStreamfileconfig= newFileInputStream(cpath+"booksetpro.properties");
pro.load(fileconfig);
String logpath= pro.get(key).toString();
return logpath;
}
在 web.xml 增加
<listener>
<listener-class>tsgl.common.ContextListenerlistener-class>
listener>
类中需要实现ServletContextListener
实例源码是做一个定时器,每天的10点去执行操作
public class ContextListener implementsServletContextListener {
private static Timer timer=null;
private static String timeday="";//每天只执行一次,用来记录时间
@Override
public voidcontextDestroyed(ServletContextEvent event) {
// TODO Auto-generated methodstub
if(timer!=null)
{
timer.cancel();
}
}
//启动就执行方法
@Override
public voidcontextInitialized(ServletContextEvent event) {
// TODO Auto-generatedmethod stub
timer=new Timer(true);
/**
* 定时器到指定的时间时,执行某个操作(如某个类,或方法)
*/
//后边最后一个参数代表监视器的监视周期,现在为一小时
timer.schedule(new MyTask(event.getServletContext()), 0, 60 * 60 *1000);
}
public class MyTask extends TimerTask{
/** 这个代表10点钟的时候执行任务 */
private static final int C_SCHEDULE_HOUR = 10;
private boolean isRunning = false;
public MyTask(ServletContextcontext) {
this.context = context;
}
@Override
public void run() {
Calendar cal =Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR ==cal.get(Calendar.HOUR_OF_DAY)&&!(ContextListener.timeday.equals(new SimpleDateFormat("yyyyMMdd").format(new Date())))) {
ContextListener.timeday=(new SimpleDateFormat("yyyyMMdd").format(new Date()));
isRunning =true;
//执行的操作
isRunning =false;
}
}
}
}
}
一个控制器有多个 action, struts.xml配置为
<actionname="puboper_*"class="bk_pubAction"method="{1}">action>
在 bk_pubAction 中有一个action 名字为 bkinfo
Url请求为 puboper_bkinfo.action 就进入 bkinfo。
.action 是web.xml struts2配置拦截器为 *.action 所以使用struts2 时需要后边带着.action
resultMap是返回的数据集的个数据属性,使用中发现result 不用和返回的数据集必须一致,但是必须指定resultMap
parameterType参数类型是map,statementType="CALLABLE"使用存储过程必须定义此属性
<mappernamespace="sqlmap.book.jieyue">
<resultMaptype ="java.util.HashMap"id= "cursorMapyqgh">
<resultcolumn="ZHMC"property="ZHMC"/>
<resultcolumn="TXT"property="TXT"/>
resultMap><selectid="bookyqghmeg"parameterType="map"statementType="CALLABLE">
{call book_getyugh(
#{yqbooklist,jdbcType=CURSOR,mode=OUT,resultMap=cursorMapyqgh},
#{ghbooklist,jdbcType=CURSOR,mode=OUT,resultMap=cursorMapyqgh}
)}
select>
mapper>
java代码调用:
publicList>>getlsgh(){
List>> llbk=new ArrayList
>>();
Map
hm.put("yqbooklist",new ArrayList
hm.put("ghbooklist",new ArrayList
this.session.selectOne("sqlmap.book.jieyue.bookyqghmeg",hm);
List
List
llbk.add(yqbooklist);
llbk.add(ghbooklist);
return llbk;
}
普通赋值方法都是 #{map的key值},使用in的时候必须使用 ${map的key值},#会对数据进行处理放置,$ 我们传入的字符串为 1,2,3就会直接拼接上。
<selectid="sendjieyuserinfo"resultType="map"parameterType="map">
select xx.txt,ba_statusfrom book_borrowapply ba
inner join xtgl_zhxx xx onxx.ryid=ba.ba_userid
where ba.ba_id in(${baid})group by xx.id,xx.txt,ba_status
select>
<actionname="bkcommentjson"class="bk_pubAction"method="getbkcomjson">action>
Java代码
int count=(Integer) hm.get("p_Outrecordcount");
List
JSONArray jay= new JSONArray().fromObject(list);
HttpServletResponse res= getResponse();
res.getWriter().write("{\"total\":"+count+",\"rows\":"+jay.toString()+"}");