我想从JSP中删除scriplets。在我的 JSP 中,我有一个 scrilet 作为
<%response.setContentType("text/xml");%>
我创建了一个视图 bean 并创建了一个属性作为HttpServletResponse response
并为此属性添加了 getter/setter。
当我试图在ViewBean
中获得响应时,它会像null
一样到来。任何建议如何避免这种NullPointerException
?
我的 JSP 代码是:
<jsp:useBean id="test" class="someBean" />
<jsp:setProperty name="test" property="*" />
<jsp:getProperty name="test" property="response" />
ViewBean 代码为:
package test.here;
import java.sql.*;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ibm.commerce.server.WcsApp;
import com.ibm.commerce.server.JSPHelper;
public class SomeBean {
String punchOutRes = null;
HttpServletResponse response;
HttpServletRequest request;
String test="Hello";
public HttpServletResponse getResponse() {
return response;
}
public void setResponse(HttpServletResponse response) {
this.response = response;
}
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public String getPunchOutRes() {
response.setContentType("text/xml");
return "testing";
}
public String getTest(){
}
}
您可以使用 page 指令来摆脱上面的脚本:
<%@ page contentType="text/xml;charset=ISO-8859-1" %>
通常,您的 Bean 代码不应包含任何特定于 servlet 的信息。
在 servlet 中使用:
request.setAttribute("test", myBean);
request.getRequestDispatcher("page.jsp").forward(request, response);
在 JSP 使用中:
${test.foo}
其中 foo 显示为
public String getFoo() {
return foo;
}
在豆类中。
首先,在实例化 Bean 时,您应该引用 java Bean 类的完整限定名(即包名加上类名),如下所示:
<jsp:useBean id="test" class="test.here.SomeBean" />
另一方面,<jsp:setProperty property="*" />
文档说:
将所有值存储在请求对象参数(称为 请求参数)在匹配的 Bean 属性中。中的属性名称 Bean 必须与请求参数匹配。参数名称 通常来自 HTML 表单的元素,值来自 从用户输入的数据中。
请求参数的值始终为字符串类型。这 字符串值将转换为其他数据类型,以便可以存储它们 在 Bean 属性中。允许的 Bean 属性类型及其 转换方法如表1-1所示。
该解释中没有关于隐式对象的注入(请求和响应是隐式 JSP 对象,而不是请求参数),并且您不应该在 Bean 代码中使用任何这些对象。
如果您只想设置内容类型,请使用 JSP 指令:
<%@ page contentType="text/xml;charset=ISO-8859-1" %>
但是如果你想做任何更复杂的操作,那么你应该使用Servlet或Filter。