题目是这样的
有两张表
一张为新闻类别表
有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>
好了,一切OK,打开浏览器测试一切正常.