我使用print writer直接在servlet中打印一个列表并打印列表。
当我尝试输入jsp时,列表不会打印我是否使用JSTL或scriptlet。
我尝试在JSTL和scriptlet中测试该对象是否为空,结果证明它是!
为什么会发生这种情况,我该如何解决这个问题?
可行的Servlet代码
for (Artist artist:artists){
resp.getWriter().println(artist.getName());
}
将对象放入请求的Servlet代码
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("com/helloworld/beans/helloworld-context.xml");
ArtistDao artistDao = (ArtistDao) ctx.getBean("artistDao");
List<Artist> artists = null;
try {
artists = artistDao.getAll();
} catch (SQLException e) {
e.printStackTrace();
}
req.setAttribute("artists", artists);
try {
req.getRequestDispatcher("index.jsp").forward(req, resp);
} catch (ServletException e) {
e.printStackTrace();
}
突然发现对象为null的scriptlet代码
<%
List<Artist> artists = (List<Artist>) request.getAttribute("artists");
if (artists == null) {
out.println("artists null");
}
else {
for (Artist artist: artists){
out.println(artist.getName());
}
}
%>
即使是jstl代码也似乎同意
<c:if test="${artists eq null}">
Artists are null
</c:if>
<c:forEach var="artist" items="${artists}">
${artist.name}
</c:forEach>
对于我的应用程序,我使用的是weblogic,spring 2.5.6和ibatis。
答案 0 :(得分:1)
也许应用服务器正在重置您的请求对象。您可以通过创建一个包含原始请求的新请求对象来解决此问题,并将其传递给reqest调度程序。
e.g。 MyHttpRequest myRequest = new MyHttpRequest(req); myRequest.setAttribute(...); req.getRequestDispatcher(“index.jsp”)。forward(myRequest,resp);
MyHttpReqest代码:
class MyHttpRequest extends HttpServletRequestWrapper
{
Map attributes = new HashMap();
MyHttpRequest(HttpRequest original) {
super(original);
}
@Override
public void setAttribute(Object key, Object value) {
attributes.put(key, value);
}
public Object getAttribute(Object key) {
Object value = attributes.get(key);
if (value==null)
value = super.getAttribute(key);
return value;
}
// similar for removeAttribute
}
答案 1 :(得分:1)
我认为这取决于网络服务器。但是,如果不改变以前的目录结构,
尝试将列表放在会话中
req.getSession(false).setAttribute("artists", artists);
并在你的jsp中,
写
List<Artist> artists = (List<Artist>) request.getSession(false).getAttribute("artists");
我认为我的方法适用于所有网络服务器。
答案 2 :(得分:0)
我在尝试修复WebContent /
中的目录结构时无意中发现了我之前的目录结构是
网络内容/
- META-INF /
- WEB-INF /
index.jsp
然后我尝试在WEB-CONTENT中创建一个文件夹jsp并将index.jsp放在那里。它有效!
我现在的目录结构是
网络内容/
- META-INF /
- WEB-INF /
- jsp /
-index.jsp
我不知道它为什么会起作用,但确实如此。
任何人都知道为什么?