【问题标题】:Why does my jsp not display output?为什么我的jsp不显示输出?
【发布时间】:2015-05-06 20:26:58
【问题描述】:

运行时没有错误并且测试输出到控制台返回正确的数据但是当我尝试在 jsp 中显示相同的数据时没有显示任何内容?可能真的很简单,我是 Spring 和 jsp 的新手。

以下是我的 jsp 和 DAO 文件:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@page import="com.sga.app.dao.DisplayStatsDAO" %>
<%@page import="java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href="${pageContext.request.contextPath}/static/css/main.css"
rel="stylesheet" type="text/css">
<title>SGA-user stats</title>
</head>
<body>
<h2 class="displayStatsLeaderboardHeader">Your stats</h2>
<table class="displayStatsTable" border="1">
    <tr>
        <td class="displayStatsTableData">${stats.returnForename()}</td>
    </tr>
</table>
</body>
</html>


package com.sga.app.dao;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.sga.app.beans.UserBean;

@Component("displayStatsDAO")
@Transactional
@Repository
@Configuration
public class DisplayStatsDAO extends HttpServlet implements Serializable {

private static final long serialVersionUID = 1L;


@Autowired
private LocalSessionFactoryBean sessionFactory;

public void setLocalSessionFactoryBean(LocalSessionFactoryBean   sessionFactory) {
    this.sessionFactory = sessionFactory;
}

@Bean
public DisplayStatsDAO displayStatsDAO() {
    return new DisplayStatsDAO();
}

public DisplayStatsDAO() {

}

@Transactional
public String returnForename() {
    String returnValue = "";
    try {
        @SuppressWarnings("deprecation")
        Session session =        sessionFactory.getConfiguration().buildSessionFactory().getCurrentSession();
        Authentication authentication = SecurityContextHolder.getContext()
                .getAuthentication();
        String userLoggedIn = authentication.getName();
        System.out.println(userLoggedIn);
        session.beginTransaction();
        Criteria criteria = session.createCriteria(UserBean.class);
        criteria.add(Restrictions.like("username", userLoggedIn));
        List<UserBean> user = (List<UserBean>) criteria.list();
        session.getTransaction().commit();
        for (UserBean userDetails : user) {
            System.out.println("SHOW LOGGED-IN USER");
            System.out.println("Username: " + userDetails.getUsername());

            System.out.println("Name: " + userDetails.getForename() + ""
                    + userDetails.getSurname());
            returnValue = userDetails.getForename().toString();
            System.out.println(returnValue);
            return returnValue;
        }
    } catch (HibernateException e) {
        e.printStackTrace();
    }
    return returnValue;
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    RequestDispatcher rd = req.getRequestDispatcher("userstats.jsp");
    req.setAttribute("stats", returnForename());        
    rd.forward(req, resp);
}
}

编辑:这是我的控制器/服务类

@Controller
public class DisplayStatsController {

   DisplayStatsService statsService;

   @Autowired
   public void setStatsService(DisplayStatsService statsService) {
        this.statsService = statsService;
        }

   @RequestMapping(value = "/userstats", method = RequestMethod.Get)
   public String showUserStatsPage(UserBean user, BindingResult, Model 
      model) {
         if (result.hasErrors()) {
               return "error";
            }
         else {
               try {
                    statsService.showUserStats();
                   }
               catch (Exception e) {
                    e.printStackTrace();
                      return "error";
                }
      }
}
 return "userstats";
}

还有我的服务等级:

@Service("displayStatsService")
public class DisplayStatsService {

private DisplayStatsDAO displayStatsDAO;

@Autowired
setDisplayStatsDAO(DisplayStatsDAO displayStatsDAO) {

   this.displayStatsDAO = displayStatsDAO;
}

   public void showUserStats() {
        displayStatsDAO.returnForename();
   }
}

日志输出:

DEBUG - Listing entities:
DEBUG - com.sga.app.beans.UserBean{surname=Bates,forename=John,gir=64, homeclub=Bearsden GC, email=john@bt.com, submitCount=18, }
DEBUG - committed JDBC Connection
DEBUG - re-enabling autocommit
SHOW LOGGED-IN USER
Username: John12345
Name: JohnBates
Homeclub: Bearsden GC
John12345
Bearsden GC
John
Outside try/catch clause
Return value is John
DEBUG - Flushing Hibernate Session on transaction synchronization
DEBUG - Processing flush-time cascades
DEBUG - Dirty checking collections
DEBUG - Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects
DEBUG - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
DEBUG - Listing entities:
DEBUG - com.sga.app.beans.UserBean{surname=Bates, username=John12345,   forename=John,homeclub=Bearsden GC, email=john@bt.com}
DEBUG - Disconnecting session
DEBUG - Releasing JDBC connection
DEBUG - Released JDBC connection
DEBUG - HHH000163: Logical connection releasing its physical connection
DEBUG - Initiating transaction commit
DEBUG - Committing JDBC transaction on Connection 
DEBUG - Returning JDBC Connection to DataSource
DEBUG - Invoking afterPropertiesSet() on bean with name 'userstats'
DEBUG - Rendering view [org.springframework.web.servlet.view.JstlView: name 'userstats'; URL [/WEB-INF/jsps/userstats.jsp]] in DispatcherServlet with name 'dispatcher'
DEBUG - Added model object 'userBean' of type [com.sga.app.beans.UserBean] to request in view with name 'userstats'
DEBUG - Added model object 'org.springframework.validation.BindingResult.userBean' of type [org.springframework.validation.BeanPropertyBindingResult] to request in view with name 'userstats'
DEBUG - Added model object 'username' of type [java.lang.String] to request in view with name 'userstats'
DEBUG - Forwarding to resource [/WEB-INF/jsps/userstats.jsp] in InternalResourceView 'userstats'
DEBUG - Successfully completed request

【问题讨论】:

  • 试试&lt;td class="displayStatsTableData"&gt;${stats}&lt;/td&gt;
  • @smoggers 你为什么在 for 循环中返回值?
  • 日志文件中有什么相关的吗?
  • @zawhtut 所以只是设置 returnValue 而不是返回它?即 returnValue = userDetails.getForename.toString();
  • @StephenC 我添加了日志输出

标签: java hibernate jsp spring-mvc servlets


【解决方案1】:

使用req.setAttribute("stats", returnForename()); 这一行,您将在stats 属性中添加函数returnForename() 的返回值,因此在视图中您只需访问属性${stats}

【讨论】:

  • 标记为答案,如果正确且问题已解决。 :)
  • 我不反对您的帖子,但尝试了它,但最终仍然没有显示在 jsp 上
  • 那么你的控制器在哪里,它会有一个RequestMapping,它会调用你的请求并将服务返回值添加到model属性。
  • 我添加了控制器/服务类
【解决方案2】:

我认为你现在很困惑。 简而言之,Spring MVC 的工作原理类似于-

1.您点击了一个 URL,如果该 URL 与控制器中存在的 RequestMapping 匹配,则执行将传递给该控制器方法。

2.该控制器调用存在逻辑代码的服务并使用DAO层。服务层可能会返回一些数据。

3.保存的数据是属性并传递到视图(您的jsp文件)。

您正在做的是调用调用服务的控制器,该服务反过来又扩展了 DAO 和 DAO HttpServlet(完全错误)。

你要么使用控制器来调用 Dao,要么使用一些扩展 HttpServlet 的类调用(同样,这不会在 spring 中出现),你不能同时使用。

【讨论】:

  • 好吧,在我的情况下,你的意思是把 DAO 逻辑移到服务中?
  • 是的,因为你没有使用任何数据库,所有代码都应该只在控制器和服务中。从控制器返回您要调用的jsp文件的名称,并且您要在jsp中使用的字符串必须在模型属性中设置才能访问jsp文件
  • 也去掉了doGet方法。在你的情况下它没有做任何事情。
【解决方案3】:

这就是我让我的 jsp 输出数据的方式。我的 Java 类中有一个方法可以检索我想要的数据并将其存储在一个数组中,然后我将 HttpServletRequest 属性设置为这个数组。在我的 jsp 中,我引用了这个 Array,然后通过 for 循环将 Array 的每个元素输出到表列。

<!-- Table -->
<table class="displayStatsTable" border="1">
    <tbody class="displayStatsTableBody">
        <tr class="displayStatsTableTopRow">
            <th><c:out value="Forename" /></th>
            <th><c:out value="Surname" /></th>
            <th><c:out value="Average Score" /></th>
        </tr>
        <c:forEach var="stats" items="${stats}">
        <tr class="displayStatsTableDataRows">
            <td class="displayStatsTableData">${stats.forename}</td>
            <td class="displayStatsTableData">${stats.surname}</td>
            <td class="displayStatsTableData">${stats.score_avg}</td>
        </tr>           
        </c:forEach>
    </tbody>
</table>

【讨论】:

    【解决方案4】:

    将此行添加到您的 jsp 页面,它将启用 EL 并显示对象:

    <%@ page isELIgnored="false" %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 2021-04-29
      相关资源
      最近更新 更多