Java Bean:如何在中生成到Java代码中
例如,我有这个代码:
我知道它是如何工作的。 但是,有时候,我在这里更改了一些代码,例如:“dog”到“newDog”,我会遇到错误或未经编辑的结果(和我一起)。
请告诉我如何在Java中生成上面的代码。 (也许只是一个主要想法)
谢谢 :)
JSP最终生成为.java
类,它们被编译为servlet。 检查服务器的工作文件夹。 在Tomcat的情况下, /work
/org/apache/jsp/test_jsp.java
在Tomcat的/work
文件夹中生成为/org/apache/jsp/test_jsp.java
文件。
以下几行
(我做的唯一改变是添加一个包;无包装类是Bad™)
生成为
com.example.Dog dog = null; synchronized (application) { dog = (com.example.Dog) _jspx_page_context.getAttribute("dog", javax.servlet.jsp.PageContext.APPLICATION_SCOPE); if (dog == null){ dog = new com.example.Dog(); _jspx_page_context.setAttribute("dog", dog, javax.servlet.jsp.PageContext.APPLICATION_SCOPE); out.write("\n"); out.write(" "); org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("dog"), "breed", "House Dog !!!", null, null, false); out.write('\n'); } }
Tomcat是开源的,根据其源代码, JspRuntimeLibrary#introspecthelper()
方法委托给internalIntrospecthelper()
,它最终执行此操作:
Method method = null; Class> type = null; Class> propertyEditorClass = null; try { java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean.getClass()); if ( info != null ) { java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors(); for (int i = 0 ; i < pd.length ; i++) { if ( pd[i].getName().equals(prop) ) { method = pd[i].getWriteMethod(); type = pd[i].getPropertyType(); propertyEditorClass = pd[i].getPropertyEditorClass(); break; } } } if ( method != null ) { if (type.isArray()) { if (request == null) { throw new JasperException( Localizer.getMessage("jsp.error.beans.setproperty.noindexset")); } Class> t = type.getComponentType(); String[] values = request.getParameterValues(param); //XXX Please check. if(values == null) return; if(t.equals(String.class)) { method.invoke(bean, new Object[] { values }); } else { createTypedArray (prop, bean, method, values, t, propertyEditorClass); } } else { if(value == null || (param != null && value.equals(""))) return; Object oval = convert(prop, value, type, propertyEditorClass); if ( oval != null ) method.invoke(bean, new Object[] { oval }); } } } catch (Exception ex) { Throwable thr = ExceptionUtils.unwrapInvocationTargetException(ex); ExceptionUtils.handleThrowable(thr); throw new JasperException(ex); }
你看,它使用java.beans.Introspector
通过BeanInfo#getPropertyDescriptors()
获取bean信息和属性。 所需的
方法由PropertyDescriptor#getWriteMethod()
以java.lang.reflect.Method
获得。 最后,它使用Reflection API来调用该方法。
这是它的生成方式:
Dog dog = new Dog(); dog.setBreed("House Dog !!!");
setProperty中的狗是对useBean的Class Dog的引用。 希望你能理解这一点