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

错误类型500
2023年4月2日发(作者:推房神器登录)

详解JSP页⾯jsp:setProperty标签使⽤表达式赋值报500错误

的原因

错误⽰例:

<%@pagecontentType="text/html;charset=UTF-8"language="java"%>

Title

<%

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