为什么我的 jsp 不显示输出?
Why does my jsp not display output?
运行时没有错误并且测试输出到控制台 returns 正确的数据但是当我尝试在 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/service classes
@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";
}
还有我的服务class:
@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
使用 req.setAttribute("stats", returnForename());
这一行,您将在 stats
属性中添加函数 returnForename()
的 return 值,因此在视图中您只需访问属性 ${stats}
.
我觉得你现在很困惑。
简而言之 Spring MVC 的工作方式就像-
1.you hit a URL,if that URL matches the RequestMapping present in the controller, execution is passed to that controller method.
2.That controller calls the service where logical code is present and it uses DAO layer.Service layer may return some data.
3.That data is saved is attributes and passed onto view(your jsp file).
你正在做的是调用控制器,控制器又调用服务,DAO 和 DAO 扩展 HttpServlet(完全错误)。
要么使用控制器调用 Dao,要么使用一些 class 扩展 HttpServlet 的调用(同样这不会出现 spring),你不能同时使用两者。
这就是我 jsp 输出数据的方式。我的 Java class 中有一个方法可以检索我想要的数据并将其存储在一个数组中,然后我将 HttpServletRequest 属性设置为此数组。在我的 jsp 中,我引用了这个数组,然后通过 for 循环将数组的每个元素输出到 table 列。
<!-- 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>
将此行添加到您的 jsp 页面,它将启用 EL 并显示对象:
<%@ page isELIgnored="false" %>
运行时没有错误并且测试输出到控制台 returns 正确的数据但是当我尝试在 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/service classes
@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";
}
还有我的服务class:
@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
使用 req.setAttribute("stats", returnForename());
这一行,您将在 stats
属性中添加函数 returnForename()
的 return 值,因此在视图中您只需访问属性 ${stats}
.
我觉得你现在很困惑。 简而言之 Spring MVC 的工作方式就像-
1.you hit a URL,if that URL matches the RequestMapping present in the controller, execution is passed to that controller method.
2.That controller calls the service where logical code is present and it uses DAO layer.Service layer may return some data.
3.That data is saved is attributes and passed onto view(your jsp file).
你正在做的是调用控制器,控制器又调用服务,DAO 和 DAO 扩展 HttpServlet(完全错误)。
要么使用控制器调用 Dao,要么使用一些 class 扩展 HttpServlet 的调用(同样这不会出现 spring),你不能同时使用两者。
这就是我 jsp 输出数据的方式。我的 Java class 中有一个方法可以检索我想要的数据并将其存储在一个数组中,然后我将 HttpServletRequest 属性设置为此数组。在我的 jsp 中,我引用了这个数组,然后通过 for 循环将数组的每个元素输出到 table 列。
<!-- 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>
将此行添加到您的 jsp 页面,它将启用 EL 并显示对象:
<%@ page isELIgnored="false" %>