动态 url 在 struts2 中使用 s:iterator
Dynamic url using s:iterator in struts2
我的问题是:如何使用 struts2 中的 <s:itarator>
为 url 提供动态参数?
我有一些数据存储在 MySQL 数据库中,我将数据(Id 和 Name)放在两个 ArrayList
中
package Model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class Film {
private String id;
private String titolo;
private String trama;
private int i=0;
private ArrayList<String> puntate = new ArrayList<String>();
private ArrayList<Integer> idPuntate = new ArrayList<Integer>();
protected String DRIVER = "com.mysql.jdbc.Driver";
protected String url = "jdbc:mysql://localhost/SitoWeb";
protected String user = "root";
protected String psw = "";
private Connection con;
public String execute(){
Connessione();
Query();
return "success";
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public String getId() {return id;}
public void setId(String id) {this.id = id;}
public String getTitolo(){return titolo;}
public void setTitolo(String titolo) {this.titolo=titolo;}
public String getTrama(){return trama;}
public void Connessione(){
try{
con=null;
Class.forName(DRIVER);
con = DriverManager.getConnection(url,user,psw);
}catch(Exception e){}
}
public void Query(){
try {
PreparedStatement cmd = con.prepareStatement("SELECT Film.Titolo, Film.Trama, Episodi.Nome, Episodi.idEpisodio FROM Film INNER JOIN Episodi ON Film.Id = Episodi.id_Film WHERE id = ?");
cmd.setString(1, id);
ResultSet rs = cmd.executeQuery();
while(rs.next()){
titolo = rs.getString("titolo");
trama = rs.getString("trama");
idPuntate.add(i, rs.getInt("idEpisodio"));
puntate.add(i,rs.getString("Nome"));
i++;
}
rs.close();
cmd.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ArrayList<Integer> getIdPuntate() {
return idPuntate;
}
public void setIdPuntate(ArrayList<Integer> idPuntate) {
this.idPuntate = idPuntate;
}
public ArrayList<String> getPuntate() {
return puntate;
}
public void setPuntate(ArrayList<String> puntate) {
this.puntate = puntate;
}
}
现在我想在我的 JSP 页面中显示这些数据。我试过这样的事情:
<s:url action="episodi" var="episodi">
<s:param name="id"></s:param> // I don't know what to put here...
</s:url>
<ol>
<s:iterator value="puntate">
<li><a href="<s:property value='#episodi'/>"><s:property/></a></li>
</s:iterator>
</ol>
我不知道在 <s:param name="id"></s:param>
中放什么,因为参数是一个 ArrayList。我试着把 <s:iterator value="idPuntate">
但它 returns 0..
有两个问题:
如果要为Collection的每个元素生成一个url,那么需要将url生成放在里面该集合的迭代,否则你将始终具有相同的 url:
<ol>
<s:iterator value="puntate">
<s:url action="episodi" var="episodio">
<s:param name="id">something here</s:param>
</s:url>
<li><a href="<s:property value='#episodio'/>"><s:property/></a></li>
</s:iterator>
</ol>
您没有使用过 OOP,建议创建一个名为 Movie(或 Film)的 bean,带有 List<Episode>
,Episode
应该是另一个带有 for 的 bean例如 Long id
、Integer season
、Integer number
和 String description
.
由于您使用了两个不同的列表,一个用于剧集描述,另一个用于剧集 ID,并假设它们对齐(不能保证,所以我强烈建议您以 OOP 方式重构代码),您可以在迭代期间根据剧集描述索引按索引访问 ID:
<ol>
<s:iterator value="puntate" status="ctr">
<s:url action="episodi" var="episodio">
<s:param name="id">
<s:property value="idPuntate[%{#ctr.index}]"/>
</s:param>
</s:url>
<li><a href="<s:property value='#episodio'/>"><s:property/></a></li>
</s:iterator>
</ol>
P.S: film 应该是在你的动作中声明的一个bean,而不是动作本身...否则它是不可移植的...如果你在其他动作中需要Film class怎么办?
我的问题是:如何使用 struts2 中的 <s:itarator>
为 url 提供动态参数?
我有一些数据存储在 MySQL 数据库中,我将数据(Id 和 Name)放在两个 ArrayList
package Model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class Film {
private String id;
private String titolo;
private String trama;
private int i=0;
private ArrayList<String> puntate = new ArrayList<String>();
private ArrayList<Integer> idPuntate = new ArrayList<Integer>();
protected String DRIVER = "com.mysql.jdbc.Driver";
protected String url = "jdbc:mysql://localhost/SitoWeb";
protected String user = "root";
protected String psw = "";
private Connection con;
public String execute(){
Connessione();
Query();
return "success";
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public String getId() {return id;}
public void setId(String id) {this.id = id;}
public String getTitolo(){return titolo;}
public void setTitolo(String titolo) {this.titolo=titolo;}
public String getTrama(){return trama;}
public void Connessione(){
try{
con=null;
Class.forName(DRIVER);
con = DriverManager.getConnection(url,user,psw);
}catch(Exception e){}
}
public void Query(){
try {
PreparedStatement cmd = con.prepareStatement("SELECT Film.Titolo, Film.Trama, Episodi.Nome, Episodi.idEpisodio FROM Film INNER JOIN Episodi ON Film.Id = Episodi.id_Film WHERE id = ?");
cmd.setString(1, id);
ResultSet rs = cmd.executeQuery();
while(rs.next()){
titolo = rs.getString("titolo");
trama = rs.getString("trama");
idPuntate.add(i, rs.getInt("idEpisodio"));
puntate.add(i,rs.getString("Nome"));
i++;
}
rs.close();
cmd.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public ArrayList<Integer> getIdPuntate() {
return idPuntate;
}
public void setIdPuntate(ArrayList<Integer> idPuntate) {
this.idPuntate = idPuntate;
}
public ArrayList<String> getPuntate() {
return puntate;
}
public void setPuntate(ArrayList<String> puntate) {
this.puntate = puntate;
}
}
现在我想在我的 JSP 页面中显示这些数据。我试过这样的事情:
<s:url action="episodi" var="episodi">
<s:param name="id"></s:param> // I don't know what to put here...
</s:url>
<ol>
<s:iterator value="puntate">
<li><a href="<s:property value='#episodi'/>"><s:property/></a></li>
</s:iterator>
</ol>
我不知道在 <s:param name="id"></s:param>
中放什么,因为参数是一个 ArrayList。我试着把 <s:iterator value="idPuntate">
但它 returns 0..
有两个问题:
如果要为Collection的每个元素生成一个url,那么需要将url生成放在里面该集合的迭代,否则你将始终具有相同的 url:
<ol> <s:iterator value="puntate"> <s:url action="episodi" var="episodio"> <s:param name="id">something here</s:param> </s:url> <li><a href="<s:property value='#episodio'/>"><s:property/></a></li> </s:iterator> </ol>
您没有使用过 OOP,建议创建一个名为 Movie(或 Film)的 bean,带有
List<Episode>
,Episode
应该是另一个带有 for 的 bean例如Long id
、Integer season
、Integer number
和String description
.由于您使用了两个不同的列表,一个用于剧集描述,另一个用于剧集 ID,并假设它们对齐(不能保证,所以我强烈建议您以 OOP 方式重构代码),您可以在迭代期间根据剧集描述索引按索引访问 ID:
<ol> <s:iterator value="puntate" status="ctr"> <s:url action="episodi" var="episodio"> <s:param name="id"> <s:property value="idPuntate[%{#ctr.index}]"/> </s:param> </s:url> <li><a href="<s:property value='#episodio'/>"><s:property/></a></li> </s:iterator> </ol>
P.S: film 应该是在你的动作中声明的一个bean,而不是动作本身...否则它是不可移植的...如果你在其他动作中需要Film class怎么办?