- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,我有这段代码:
<jsp:useBean id="dog" class="Dog" scope="application">
<jsp:setProperty name="dog" property="breed" value="House Dog !!!"/>
</jsp:useBean>
我知道它是如何工作的。但是,有时,我会在其中更改一些代码,例如:“dog”到“newDog”,我会遇到错误或 unguested-result(跟我一起)。
请告诉我上面的代码是如何生成到 Java 中的。 (也许只是一个主要想法)
谢谢:)
最佳答案
JSP 最终生成到 .java
被编译为 servlet 的类。检查服务器的工作文件夹。对于 Tomcat,一个 /test.jsp
生成为 /org/apache/jsp/test_jsp.java
Tomcat 中的文件 /work
文件夹。
下面几行
<jsp:useBean id="dog" class="com.example.Dog" scope="application">
<jsp:setProperty name="dog" property="breed" value="House Dog !!!"/>
</jsp:useBean>
(我所做的唯一更改是添加一个包;无包类是 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()
方法委托(delegate)给 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 信息和属性.想要的<jsp:setProperty>
方法获得为 java.lang.reflect.Method
通过 PropertyDescriptor#getWriteMethod()
.最后它使用 Reflection API调用方法。
关于Java Bean : how <jsp:setProperty> in <jsp:useBean> is generated into Java Code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10285209/
我有一个 UserPass 类,它有 2 个属性:User user;字符串密码用户还有其他属性,如用户名、系统 ID 等。 我在 UserPass 上调用了 setProperty ("userna
在设计用于在自定义芯片上运行的 Java 应用程序中找到以下代码行。 System.setProperty("ssl.SocketFactory.provider", "some.custom.soc
当我使用 $wnd.document.getElementById('id'); 它运行成功,我得到了元素。但是,当我尝试像这样设置 property 时: $wnd.document.getElem
我想实现从默认(Windows HKCU)到我自己的(文件系统)的首选项迁移。一切都分开工作,但不能一起工作: public static void main(String[] args){ try
我遇到过非常奇怪的情况。不确定,这是否符合逻辑,但请麻烦。 我有两个元素,一个是jar 文件,第二个是ETL 工具,它完全是一个基于Java 的高级ETL 工具。 我已将我的 jar 导入到一个 ET
考虑以下类: class foo : public QObject { Q_OBJECT Q_ENUMS(E) Q_PROPERTY(E x READ x WRITE setx) pu
在阅读了SetProperty上的页面并查看了我在此处和其他地方可以找到的尽可能多的示例之后,我仍然无法将SetProperty设置为自定义操作ID的After或Before来使用。该文档看起来很简单
我使用 beans/form 处理在登录屏幕上获取输入参数,然后使用这些参数尝试将用户登录到应用程序中。 但是我收到错误 - org.apache.jasper.JasperException: /l
我曾尝试在主方法中使用System.setProperty,没有任何问题,但是当我切换到TestNG作为我的Selenium学习的一部分时,我意识到我们不能编写System.setProperty 在
我正在尝试实现一个域类,用于记录任何属性值何时更改,但我的 setProperty() 调用会在设置实际值时导致无限递归。 这就是现在的样子: void setProperty(String name
为什么我需要使用 setProperty 才能设置 java 类中变量的值 当我可以创建变量的实例并使用该实例来访问我的变量并分配值时。 最佳答案 您指的是Encapsulation 。它是面向对象编
这个问题已经有答案了: How to set request.getParameter in jsp:setProperty (1 个回答) 已关闭 3 年前。 所以基本上我想弄清楚是否可以将 jsp
编辑:代码已更新以包含 @Igor Artamonov 建议的更改,但问题仍然出现!我确实注意到了以下内容 reference to this image ,所有者 2 有高度值,没有 tool_pr
我使用它来验证 HTTP URL 以获取 JSON 字符串 HttpURLConnection inputStream = (HttpURLConnection) myURL.open
我正在开发一个基于 BindableBase 的 ViewModel。此 VM 包含域模型的实例。VM 公开了一个属性,比如 Name 我不想从中使用本地存储(即 VM 中的存储),而是委托(dele
我想将资源文件夹中的文件路径设置为系统属性。 String path = MainCore.class.getClassLoader().getResource("chromedriver-76.0.
为什么 configFile.setProperty("dir", "test") 在 ActionListener 的方法 actionPerformed 中不起作用。它不会将属性放入文件中。 se
当我尝试为我的 XmlSerializer 设置属性时,例如 xmlSerializer.setProperty("http://xmlpull.org/v1/doc/properties.html#
我正在尝试将 QVariantMap 转换为派生自 QObject 的自定义类,但我得到的返回值是 false setProperty()当谈到设置我的枚举类型的属性时。代码如下: MessageHe
我有一个程序,需要在其中设置记录器格式,但由于有多个入口点(我无法控制所有入口点),我想将 System.setProperty() 调用放置在所有入口点汇聚的类的构造函数中。 主类 public s
我是一名优秀的程序员,十分优秀!