題目是這樣的 有兩張表 一張為新聞類別表 有2個字段: nid(pk) sort 有一張新聞內容表 有三個字段 cid(pk) nid(fk) title content 要求通過下拉列表框的方法選擇新聞類別然後顯示該類別的新聞標題(在當前頁中顯示) 我是用Struts2+Hibernate3.2+JPA實現的. 數據庫腳本: create database if not exists news; drop table if exists newssort; create table newssort ( nid int primary key AUTO_INCREMENT, sort varchar(50) ); drop table if exists news; create table news ( cid int primary key AUTO_INCREMENT, title varchar(50) not null, content varchar(500) not null, nid int null ); insert into newssort values(null,'娛樂'); insert into newssort values(null,'時事'); insert into news values(null,'好事','好事連連哈哈',1); insert into news values(null,'壞事','壞事不斷',1); insert into news values(null,'愛情是什麼','愛情是什麼啊,還沒知道呢',2); insert into news values(null,'什麼啊','測試內容',2); select * from news; select * from newssort; 兩個VO類: News.java: package com.vo; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @SuppressWarnings("serial") @Entity @Table(name="news") public class News implements Serializable { private Integer cid; private String title; private String content; @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } Newssort.java: package com.vo; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.Table; import org.hibernate.annotations.LazyCollection; import org.hibernate.annotations.LazyCollectionOption; @SuppressWarnings("serial") @Entity @Table(name = "newssort") public class Newssort implements Serializable { private Integer nid; private String sort; private List<News> news = new ArrayList<News>(); @OneToMany @JoinColumn(name="nid") @LazyCollection(LazyCollectionOption.FALSE) public List<News> getNews() { return news; } public void setNews(List<News> news) { this.news = news; } @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getNid() { return nid; } public void setNid(Integer nid) { this.nid = nid; } public String getSort() { return sort; } public void setSort(String sort) { this.sort = sort; } } 寫個測試類先測試一個持久層操作: package com.test; import java.util.Iterator; import org.hibernate.Session; import org.hibernate.cfg.AnnotationConfiguration; import org.junit.After; import org.junit.Before; import com.vo.News; import com.vo.Newssort; public class Test { private Session session ; @Before public void setUp() { session = new AnnotationConfiguration().configure().buildSessionFactory().openSession(); } @After public void tearDown() { session.close(); } @SuppressWarnings("unchecked") @org.junit.Test public void testFind() { @SuppressWarnings("unused") //List<Newssort> newssort = session.createCriteria(Newssort.class).list(); Newssort newssort = (Newssort) session.load(Newssort.class, 2); for(Iterator<News> i = newssort.getNews().iterator();i .hasNext();) { String title = i.next().getTitle(); System.out.println(title); } } } 好了寫Action NewsAction: package com.web.action; import java.util.List; import java.util.Map; import org.hibernate.Session; import org.hibernate.cfg.AnnotationConfiguration; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.vo.News; import com.vo.Newssort; @SuppressWarnings( { "serial", "unchecked" }) public class NewsAction extends ActionSupport { private Session session; private Integer sortid; public Integer getSortid() { return sortid; } public void setSortid(Integer sortid) { this.sortid = sortid; } public void init() { session = new AnnotationConfiguration().configure() .buildSessionFactory().openSession(); } public String findNewssort() { this.init(); List<Newssort> sorts = session.createCriteria(Newssort.class).list(); Map request = (Map) ActionContext.getContext().get("request"); request.put("sorts", sorts); session.close(); return SUCCESS; } public String findNews() { this.init(); System.out.println("findNews"); List<Newssort> sorts = session.createCriteria(Newssort.class).list(); Newssort newssort = (Newssort) session.load(Newssort.class, sortid); List<News> news = newssort.getNews(); Map request = (Map) ActionContext.getContext().get("request"); request.put("sorts", sorts); request.put("news", news); session.close(); return SUCCESS; } } hibernate.cfg.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/news</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <property name="show_sql">true</property> <!-- 實體類映射 --> <mapping class="com.vo.News"/> <mapping class="com.vo.Newssort"/> </session-factory> </hibernate-configuration> 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> <package name="com" extends="struts-default"> <action name="findNewssort" class="com.web.action.NewsAction" method="findNewssort"> <result name="success">/index.jsp</result> </action> <action name="findNews" class="com.web.action.NewsAction" method="findNews"> <result name="success">/index.jsp</result> </action> </package> </struts> web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>prepare.jsp</welcome-file> </welcome-file-list> </web-app> 前台有兩個jsp: prapare.jsp: <%@ page language="java" pageEncoding="GB18030"%> <html> <head> <title>My JSP 'index.jsp' starting page</title> <script type="text/javascript"> window.location = "findNewssort.action"; </script> </head> <body> </body> </html> index.jsp: <%@ page language="java" pageEncoding="GB18030"%> <%@taglib uri="/struts-tags" prefix="s" %> <html> <head> <title>My JSP 'index.jsp' starting page</title> <script type="text/javascript"> function findNews() { var sort = document.getElementById("sort"); window.location = "findNews.action?sortid=" + sort.value; } </script> </head> <body> <select id="sort" name="sortid" onchange="findNews();"> <option>請選擇</option> <s:iterator value="#request['sorts']" id="sort" > <option value="<s:property value='#sort.nid'/>" ><s:property value="#sort.sort" /></option> </s:iterator> </select> <hr /> <s:iterator value="#request['news']" id="news"> <s:property value="#news.title"/><br /> </s:iterator> </body> </html>