请你看看这个。我取得了很大的进步,但现在我仍然坚持这一点。
我有一个服务AnnJAXB.java,它执行GET请求并将响应放在Ann类中(其中包含Anime和Info类作为属性)。我修改了服务以返回Ann,因此我可以使用返回值。我注释了Ann,Anime和Info课程,说@Stateless。
我有一个servlet ControllerServlet,我想用它(最初)将Ann的属性打印到JSP网页前端。我接受了最初在AnnJAXB服务类中的代码并将其放在servlet中。这段代码基本上是for循环:
for (Anime anime : ann.getAnn()) {
似乎没有显示for循环的任何内容(html和Ann / Anime属性)。
我的服务/方法类AnnJAXB:
package main;
import entities.*;
import javax.xml.bind.*;
import java.io.*;
import java.net.URL;
import java.net.MalformedURLException;
import javax.ejb.Stateless;
@Stateless
public class AnnJAXB {
public Ann Unmarshalling(String searchString) throws JAXBException, MalformedURLException {
JAXBContext jc = JAXBContext.newInstance(Ann.class);
Unmarshaller ums = jc.createUnmarshaller();
URL url = new URL( "http://cdn.animenewsnetwork.com/encyclopedia/api.xml?title=~"+searchString );
Ann ann = (Ann) ums.unmarshal(url);
return ann;
}
}
我的serlvet类ControllerServlet。注意我没有添加任何配置文件或类似的东西。我刚刚右键单击并创建了一个servlet类并开始修改它。
package main;
import entities.Anime;
import entities.Ann;
import entities.Info;
import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author J
*/
@WebServlet(name = "ControllerServlet", urlPatterns = {"/ControllerServlet"})
public class ControllerServlet extends HttpServlet {
// @EJB
// private AnnJAXB annJAXB = new AnnJAXB();
@EJB
private Ann ann;
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet ControllerServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet ControllerServlet at " + request.getContextPath() + "</h1>");
AnnJAXB an = new AnnJAXB();
try{
an.Unmarshalling("evangelion");
}catch(Exception e){}
for (Anime anime : ann.getAnn()) {
out.println("<h1>Loop1</h1>");
out.println("<h1>ID: " + anime.getId() + "</h1>");
out.println("<h1>Name: " + anime.getName() + "</h1>");
for (Info temp : anime.getAnime()) {
if (temp.getSrc() != null) {
out.println("<h1>Info: " + temp.getSrc() + "</h1>");
}
}
}
out.println("<h1>End</h1>");
out.println("</body>");
out.println("</html>");
}
}
(other default methods here)
运行时会发生什么:
IDE要求我提供执行URL并将其保留为/ ControllerServlet?。将打开一个网页并打印出单词:
Servlet ControllerServlet at /prototype9
End
它应该在这些词之间显示Ann属性。
以下是Ann课程供参考:
package entities;
import javax.xml.bind.annotation.*;
import java.util.*;
import javax.ejb.Stateless;
@Stateless
@XmlRootElement(name = "ann")
public class Ann {
private List<Anime> Ann = new ArrayList<Anime>();
@XmlElement(name="anime")
public List<Anime> getAnn() {
return Ann;
}
public void setAnn(List<Anime> Ann) {
this.Ann = Ann;
}
public Ann() {
super();
}
}
非常感谢你阅读。
答案 0 :(得分:0)
科学网页不打印
out.println("<h1>Loop1</h1>");
假设它从未进入循环是正确的,因此:来自
的条件(i=0, i< List.size(), i++)
未得到满足。对于debadging目的,在自己的代码中,检查
@EJB
private Ann ann; //not null
和
ann.getAnn().size > 0
http://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlElements.html
答案 1 :(得分:0)
user3474126 解决了以下问题:
我改变循环说:
for (Anime anime : annj.Unmarshalling("evangelion").getAnn()) {
并删除
annj.Unmarshalling("evangelion");