电脑反应速度慢怎么办-cad钢筋符号

2023年4月2日发(作者:推房神器登录)
详解JSP页⾯jsp:setProperty标签使⽤表达式赋值报500错误
的原因
错误⽰例:
<%@pagecontentType="text/html;charset=UTF-8"language="java"%>
<%
Stringvalue=ameter("timeValues");
n(value);
%>
这个JSP页⾯进⾏访问时会报500错误,注意访问链接上带上timeValues参数进⾏测试,我这⼉就不放测试结果了。⾄于有些说将value="
<%=value>"的双引号改成单引号,这种做法在这个⽰例⾥⾯没⽤,也许在其他某些情况下有⽤,等下我会说明原因。
现在我将
name="currentDate"property="time"value="123456789"/>直接对value进⾏赋值,按照上⾯的链接进⾏访问测试,结果访问成功,
没报500错误。产⽣这种差异的原因最后在看JSP转换成的源代码时才发现。因为这2种⽅式产⽣的源代码调⽤了不⼀样的接⼝
1.第⼀种情况:
Stringvalue=ameter("timeValues");
n(value);
('r');
('n');
SetProperty
(_jspx_page_tribute("currentDate"),"time",value);
('r');
('n');
(ng(((()_jspx_page_tribute("currentDate")).getTime())));
从代码⽚段可以看到,调⽤了⼀个handleSetProperty的⽅法进⾏赋值,这个接⼝的完整⽅法如下:
publicstaticvoidhandleSetProperty(Objectbean,Stringprop,Objectvalue)throwsJasperException{
try{
Methodmethod=getWriteMethod(ss(),prop);
(bean,value);
}catch(Exceptionvar5){
Throwablethr=InvocationTargetException(var5);
Throwable(thr);
thrownewJasperException(var5);
}
}
现在详解这3个参数的作⽤。:这个参数是上例中的currentDate对象,这个对象在这个例⼦中是类型的;:这个
参数是属性名称,在这⼉是time;:本例中ameter("timeValues")的结果,也就是我们要设置的属性值。
到这⼉疑问就来了,从代码看起来没问题啊,获得Class对象的⼀个写属性⽅法,然后对bean对象进⾏写操作,问题其实就出在这个写操作
上,我接下来追踪⼀下代码,在执⾏invoke时的变量数据如下:(访问时timeValues=123456798)
从数据看来是没问题的,写⽅法也找到了,bean对象也没问题,value也和设置的值相同="123456789",结果这步⼀执⾏就异常,让我
们看报的是什么异常。
什么type不匹配,原来是因为time是long类型的,这个value是string类型的,肯定执⾏要异常啊。问题的原因算是找到了,要解决这
个问题的⽅法那就是千万种了,可以在JSP页⾯表⽰式⾥⾯转类型ong()。有⼈也许会问,即便转了类型也有双引号标识这是
个字符串啊,如果你仔细看了代码,你就会发现上例handleSetProperty⽅法⾥最后那个value参数传的是⼀个变量,可没规定⼀定是⼀个
字符串。就像上例传的是value变量⼀样,就结果⽽⾔,表达式⾥⾯传的是什么类型的参数,源代码⾥⾯那个参数就是什么类型的
2.第⼆种情况:
Stringvalue=ameter("timeValues");
n(value);
('r');
('n');
pecthelper(_jspx_page_tribute("currentDate"),"time","123456",null,null,false);
('r');
('n');
(ng(((()_jspx_page_tribute("currentDate")).getTime())));
从代码中,可以很清楚的看到,很坑爹的这个调⽤的接⼝变了,变了,变了这个接⼝的完整代码如下:
publicstaticvoidintrospecthelper(Objectbean,Stringprop,Stringvalue,ServletRequestrequest,Stringparam,booleanignoreMethodNF)throwsJaspe
Methodmethod=null;
Class<?>type=null;
ClasspropertyEditorClass=null;
try{
BeanInfoinfo=nInfo(ss());
if(info!=null){
PropertyDescriptor[]pd=pertyDescriptors();
//这个循环⽤于找到time属性,并获得time属性的写⽅法以及time属性的类型
for(inti=0;i<;++i){
if(pd[i].getName().equals(prop)){
method=pd[i].getWriteMethod();
type=pd[i].getPropertyType();
propertyEditorClass=pd[i].getPropertyEditorClass();
break;
}
}
}
if(method!=null&&type!=null){
if(y()){
if(request==null){
thrownewJasperException(sage("xset"));
}
Class<?>t=ponentType();
String[]values=ameterValues(param);
if(values==null){
return;
}
if(()){
(bean,values);
}else{
createTypedArray(prop,bean,method,values,t,propertyEditorClass);
}
}else{
if(value==null||param!=null&&("")){
return;
}
//convert⽅法⽤于类型转换,到此value都是字符串,转换之后类型变为
//上⾯得到的类型,即type
Objectoval=convert(prop,value,type,propertyEditorClass);
if(oval!=null){
(bean,oval);
}
}
}
}catch(Exceptionvar12){
Throwablethr=InvocationTargetException(var12);
Throwable(thr);
thrownewJasperException(var12);
}
if(!ignoreMethodNF&&method==null){
if(type==null){
thrownewJasperException(sage("erty",newObject[]{prop,ss().getName()}));
}else{
thrownewJasperException(sage("perty",newObject[]{prop,e(),ss().getNam
}
}
}
代码过长,不详细讲解了,不过代码不难,很容易看懂,注释的2点即为为什么这种⽅法不报错的原因,终究还是因为这种⽅法在最后进⾏
了⼀个类型的判断与转换。
总结:说到底这种错误只是因为在使⽤表达式时的类型不匹配造成的,在某些情况下,⽐如属性为字符串,就能避免这种错误,给⼈造成⼀
种"这种⽅法没错,肯定是哪⼉操作不对的错觉",因此发现这种错误的原因才是根本的。
更多推荐
错误类型500
发布评论