Struts 2 DisplayTag показывает таблицу данных БД только при отправке формы
Я использую Struts 2 и инструмент форматирования таблицы Display Tag для отображения результатов запроса из базы данных (запрос SELECT *). Я сталкиваюсь с странной ошибкой. После отправки записи в базу данных из Add.jsp, я перехожу в View.jsp, где таблица отображается правильно. Однако, если я перехожу к View.jsp напрямую или по гиперссылке со страницы Add.jsp БЕЗ отправки записи в базу данных, он, по-видимому, не выполняет методы, необходимые для извлечения записей базы данных в переменную, чтобы таблица могла отображаться, В этом случае я получаю фразу "ничего не отображать" там, где должна быть таблица.
Мне сказали, что это, скорее всего, проблема с именами моих методов и сторонами Struts 2, а не с какой-либо функциональностью на стороне Java. Я чрезвычайно новичок в Struts и буду признателен за помощь в выявлении и исправлении ошибок. Некоторые выдержки из кода приведены ниже, но я могу опубликовать все это, если потребуется. Кроме того, при загрузке View.jsp ошибки не отображаются ни после отправки формы, ни по прямой ссылке.
Add.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Add Development Environment</title>
</head>
<body>
<div id="main">
<h2>Add Development Environment</h2>
<p><s:a href="View.jsp">View Entries</s:a></p>
<s:actionerror />
<s:form action="doEntries.action" method="post" validate="true">
<s:textfield name="OS" key="label.OS" size="20" />
<s:textfield name="OSVersion" key="label.OSVersion" size="20" />
<s:textfield name="Note" key="label.note" size="20" />
<s:submit method="doEntries" key="label.submit" />
</s:form>
</div>
</body>
</html>
View.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="display" uri="http://displaytag.sf.net" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/"WebContent/View.jsp"DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>View Development Environments</title>
</head>
<body>
<div id="main">
<h2>View Development Environments</h2>
<p><s:a href="Add.jsp">Add Entry</s:a></p>
<!--<s:set name="items" value="entries" scope="request"/>-->
<display:table name="entries" class="DevEnvironment" requestURI="" id="itemsList" export="false" pagesize="15">
<display:column property="did" title="id"/>
<display:column property="OS" title="Operating System"/>
<display:column property="OSVersion" title="Operating System Version" />
<display:column property="note" title="Note"/>
</display:table>
</div>
</body>
</html>
DatabaseAction.java
public class DatabaseAction extends ActionSupport{
private static final Logger logger = Logger.getLogger(DatabaseAction.class);
DBO myDBO;
private String OS;
private String OSVersion;
private String note;
private ArrayList<DevEnvironment> entries;
private double offset;
private double limit;
public DatabaseAction(){
super();
//connect to DB
myDBO = new DBO("com.mysql.jdbc.Driver", "jdbc:mysql://localhost:3306/devenvironments?user=root&password=mysqliscool");
}
public String doEntries(){
logger.info("puting stuff in DB! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-==-=-=");
if(myDBO.connect() && myDBO.setEntry(OS, OSVersion, note)){
return "success";
} else {
return "error";
}
}
public ArrayList<DevEnvironment> getEntries() {
logger.info("-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=getEntries called");
entries = myDBO.getEntry(0, -1);
return entries;
}
public void setEntries(ArrayList<DevEnvironment> entries){
this.entries = entries;
}
public String retrieveEntries(){
logger.info("-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=retrieveEntries called");
if(myDBO.connect()){
logger.info("-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=EXECUTING SQL SELECT METHOD");
//entries = myDBO.getEntry(0, -1);
//offset, limit
return "success";
} else {
return "input";
}
}
Struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<constant name="struts.custom.i18n.resources" value="ApplicationResources" />
<package name="default" extends="struts-default" namespace="/">
<action name="doEntries" method="doEntries" class="net.josh.devenvironments.DatabaseAction" >
<result name="success">View.jsp</result>
<result name="input">Add.jsp</result>
</action>
<!--
<action name="retrieveEntries" method="retrieveEntries" class="net.josh.devenvironments.DatabaseAction" >
<result name="success">View.jsp</result>
<result name="input">Add.jsp</result>
</action>
-->
</package>
</struts>
1 ответ
Вы можете получить доступ к View.jsp, потому что он общедоступен. Как правило, все JSP помещаются в /WEB-INF, причина этого в том, что View.jsp не будет иметь смысла, если он не поддерживается действием. Если вы просто идете в View.jsp как есть, он не выполняется, хотя действие, которое просто попадает в JSP напрямую и пытается его проанализировать, теги, не находящие какие-либо данные, вероятно, будут терпеть неудачу (теги S2 обычно делают это, не могут найти недвижимость просто сдавайся).
Теперь, когда JSP находится в папке /WEB-INF, единственный способ получить к нему доступ - это сделать с помощью doEntries (вы можете отказаться от действия точка, если только вы не фильтруете.action с помощью s2, но если у вас нет веской причины, не должно быть). Конечно, не забудьте обновить отображение действий в /WEB-INF/View.jsp
Теперь вы можете создать другое действие, называемое view, чтобы попасть туда, но если все, что он собирается сделать, - это то же самое, что и "doEntries", то в действительности нет никакого смысла, просто используйте "doEntries".
Когда вам надоест писать XML (что является хорошей практикой, но на самом деле это не нужно), добавьте в свой путь к классу Struts2-ventionstions-plugin. После добавления сделайте следующее:
Создайте новый пакет с именем struts2, создайте в нем класс следующим образом:
package struts2;
class HelloWorld extends ActionSupport{
public String greetings = "Hello from HelloWorld Class!";
}
Затем создайте jsp с именем "hello-world.jsp" в /WEB-INF/content, который имеет
<s:property value="greeting"/>
Если вы введете "hello-world", где, вероятно, находится index.html, вы увидите небольшое приветственное сообщение... В большинстве простых случаев, следуя простому соглашению об именовании между классами и JSP, вы можете полностью избежать XML. Если вам не нравится соглашение, вы можете легко переопределить то, что вам не нравится, но если вы добавите плагин соглашений в свой путь к классу, и ваши действия XML и будущие соглашения будут жить в гармонии.
PS: Да, я полагаю, что класс HelloWorld должен иметь методы получения и установки, но в этом случае он работает просто отлично и делает пример короче.