一、案例说明:
学生信息和班级信息的多对一映射,通过hibernate实现对学生信息和班级信息的增删改查功能,通过struts拦截器实现数据自动封装、数据回显和防表单重复提交等功能。
源码下载:http://download.csdn.net/detail/zbq857143497/9743440
二、实体类
1.Class类(num属性本来想存储班级人数,暂时没用到)
package cn.itcast.entity;
import java.util.Set;
public class Class {
private String id;
private String name;
private Long num;
private Set<Student> students;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
public Long getNum() {
return num;
}
public void setNum(Long num) {
this.num = num;
}
@Override
public String toString() {
return "Class [id=" + id + ", name=" + name + ", num=" + num
+ ", students=" + students + "]";
}
}
2.Student类
package cn.itcast.entity;
public class Student {
private String id;
private String name;
private String sex;
private String phone;
private Class myclass;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Class getMyclass() {
return myclass;
}
public void setMyclass(Class myclass) {
this.myclass = myclass;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", sex=" + sex
+ ", phone=" + phone + ", Class=" + myclass + "]";
}
}
三、实体类映射
1.Class.hbm.xml,主键采用uuid方式自动生成,
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.entity" auto-import="true">
<class name="Class" table="Class">
<id name="id" column="id" type="java.lang.String">
<generator class="uuid"/>
</id>
<property name="name" column="name" type="java.lang.String" length="20"></property>
<set name="students" table="student">
<key column="class_id"></key>
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
2.Student.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping package="cn.itcast.entity" auto-import="true">
<class name="cn.itcast.entity.Student" table="student" >
<id name="id" type="java.lang.String">
<column name="id" />
<generator class="uuid" />
</id>
<property name="name" type="java.lang.String">
<column name="name" />
</property>
<property name="sex" type="java.lang.String">
<column name="sex" />
</property>
<property name="phone" type="java.lang.String">
<column name="phone" />
</property>
<many-to-one name="myclass" column="class_id" class="Class"></many-to-one>
</class>
</hibernate-mapping>
三、hibernate.cfg.xml配置
由于是以线程的方式创建session 所以一定要配置:<propertyname="hibernate.current_session_context_class">thread</property>
第一次配置时需要生成数据库对应的表所以为create,生成后改成update
<?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">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">帐号</property>
<property name="connection.password">密码</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="cn/itcast/entity/Student.hbm.xml" />
<mapping resource="cn/itcast/entity/Class.hbm.xml" />
</session-factory>
</hibernate-configuration>
四、hibernate工具类
每次都要获取session,减少代码量,参考其它项目直接cope的
package cn.itcast.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
// 初始化SessionFactory
private static SessionFactory sf;
static {
sf = new Configuration().configure().buildSessionFactory();
}
// 创建(获取)Session
public static Session getSession() {
// 线程的方式创建session,必须要配置
// 可以不用关闭,会自动关。
return sf.getCurrentSession();
}
}
五、开发DAO层
1.开发接口
package cn.itcast.dao;
import java.util.List;
import cn.itcast.entity.Student;
import cn.itcast.entity.Class;
public interface IEmployeeDao {
/*
* 查询全部学生信息
*/
public List<Student> findAllStudent();
/*
* 查询单个学生信息
*/
public Student findOneStudent(String id);
/*
* 修改单个学生信息
*/
public void updateStudent(Student student);
/*
* 删除单个学生信息
*/
public void deleteStudent(String id);
/*
* 增加单个学生信息
*/
public void addStudent(Student student);
/*
* 查询全部班级信息
*/
public List<Class> findAllClass();
/*
* 查询单个班级信息
*/
public Class findOneClass(String id);
/*
* 修改单个班级信息
*/
public void updateClass(Class c);
/*
* 删除单个班级信息
*/
public void deleteClass(String id);
/*
* 增加单个班级信息
*/
public void addClass(Class c);
/*
* 查询班级人数
public List selectNum();*/
}
2.开发实现类
2.1查询全部学生信息的时候需要采用迫切左外连接,一开始采用内连接获取不到学生的班级名称,改用迫切内连接发现删除不成功,只能将学生数据置null,查询的时候由于数据为null所以不会显示,但是确实存在空数据。
2.2修改学生信息和班级信息的时候一开始总是报a different object with the same identifier value was already associated with the session的错误,需要添加session.clear();
package cn.itcast.dao.impl;
import java.sql.SQLException;
import java.util.List;
import javax.enterprise.inject.New;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.itcast.dao.IEmployeeDao;
import cn.itcast.entity.Student;
import cn.itcast.entity.Class;
import cn.itcast.utils.HibernateUtils;
public class EmployeeDao implements IEmployeeDao {
// 查询全部学生信息
@Override
public List<Student> findAllStudent() {
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Query q = session
.createQuery("from Student s left join fetch s.myclass");
List<Student> students = q.list();
tx.commit();
return students;
}
// 查询单个学生信息
@Override
public Student findOneStudent(String id) {
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Student s = (Student) session.get(Student.class, id);
tx.commit();
return s;
}
// 修改单个学生信息
@Override
public void updateStudent(Student student) {
// TODO Auto-generated method stub
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
session.clear();
session.update(student);
tx.commit();
}
// 删除单个学生信息
@Override
public void deleteStudent(String id) {
// 根据id查询单个学生信息
Student student = findOneStudent(id);
// TODO Auto-generated method stub
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
session.delete(student);
tx.commit();
}
// 增加单个学生信息
@Override
public void addStudent(Student student) {
// TODO Auto-generated method stub
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
session.save(student);
tx.commit();
}
// 查询全部班级信息
public List<Class> findAllClass() {
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Class");
List<Class> Class = q.list();
tx.commit();
return Class;
}
// 查询单个班级信息
@Override
public Class findOneClass(String id) {
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Class c = (Class) session.get(Class.class, id);
tx.commit();
return c;
}
// 修改单个班级信息
@Override
public void updateClass(Class c) {
// TODO Auto-generated method stub
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
session.clear();
session.update(c);
tx.commit();
}
// 删除单个班级信息
@Override
public void deleteClass(String id) {
// TODO Auto-generated method stub
// 根据id查询单个学生信息
Class c = findOneClass(id);
// TODO Auto-generated method stub
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
session.delete(c);
tx.commit();
}
// 添加单个班级信息
@Override
public void addClass(Class c) {
// TODO Auto-generated method stub
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
session.save(c);
tx.commit();
}
/*@Override
public List selectNum() {
// TODO Auto-generated method stub
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
Query q = session.createQuery("select s.myclass, count(*) from Student s group by s.myclass");
List<Class> c = q.list();
System.out.println(c.get(0).get);
return q.list();
}*/
}
六、开发service层
1.首先是接口
package cn.itcast.service;
import java.util.List;
import cn.itcast.entity.Student;
import cn.itcast.entity.Class;
public interface IEmployeeService {
/*
* 查询全部学生信息
*/
public List<Student> findAllStudent();
/*
* 查询单个学生信息
*/
public Student findOneStudent(String id);
/*
* 修改单个学生信息
*/
public void updateStudent(Student student);
/*
* 删除单个学生信息
*/
public void deleteStudent(String id);
/*
* 增加单个学生信息
*/
public void addStudent(Student student);
/*
* 查询全部班级信息
*/
public List<Class> findAllClass();
/*
* 查询单个班级信息
*/
public Class findOneClass(String id);
/*
* 修改单个班级信息
*/
public void updateClass(Class c);
/*
* 删除单个班级信息
*/
public void deleteClass(String id);
/*
* 增加单个班级信息
*/
public void addClass(Class c);
/*
* 查询班级人数
public List selectNum();*/
}
2.然后是实现类
package cn.itcast.service.impl;
import java.sql.SQLException;
import java.util.List;
import cn.itcast.dao.IEmployeeDao;
import cn.itcast.dao.impl.EmployeeDao;
import cn.itcast.entity.Student;
import cn.itcast.entity.Class;
import cn.itcast.service.IEmployeeService;
public class EmployeeService implements IEmployeeService{
private EmployeeDao dao=new EmployeeDao();
@Override
public List<Student> findAllStudent() {
return dao.findAllStudent();
}
@Override
public Student findOneStudent(String id) {
return dao.findOneStudent(id);
}
@Override
public void updateStudent(Student student) {
dao.updateStudent(student);
}
@Override
public void deleteStudent(String id) {
dao.deleteStudent(id);
}
@Override
public void addStudent(Student student) {
dao.addStudent(student);
}
@Override
public List<Class> findAllClass() {
return dao.findAllClass();
}
@Override
public Class findOneClass(String id) {
// TODO Auto-generated method stub
return dao.findOneClass(id);
}
@Override
public void updateClass(Class c) {
// TODO Auto-generated method stub
dao.updateClass(c);
}
@Override
public void deleteClass(String id) {
// TODO Auto-generated method stub
dao.deleteClass(id);
}
@Override
public void addClass(Class c) {
// TODO Auto-generated method stub
dao.addClass(c);
}
/*@Override
public List selectNum() {
// TODO Auto-generated method stub
return dao.selectNum();
}*/
}
七、在项目中添加对session的管理
1.创建session
package cn.itcast.interceptor;
import org.hibernate.Session;
import cn.itcast.utils.HibernateUtils;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* Session管理拦截器:
* 当访问action的时候,创建session;
* action ---> service --> dao 【获取的是这里创建的session】
* @author Jie.Yuan
*
*/
public class SessionInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
try {
// 1. 先创建Session
Session session = HibernateUtils.getSession();
// 2. 开启事务
session.beginTransaction();
// 3. 执行Action
String result = invocation.invoke();
// 4. 提交事务
session.getTransaction().commit(); // 不需要关闭session
// 返回结果视图
return result;
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
}
2.配置拦截器
<interceptors>
<interceptor name="sessionInterceptor"
class="cn.itcast.interceptor.SessionInterceptor"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="sessionInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
八、开发action
1.class相关action方法
package cn.itcast.action;
import java.util.List;
import cn.itcast.entity.Student;
import cn.itcast.entity.Class;
import cn.itcast.service.impl.EmployeeService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;
public class ClassEmployeeAction extends ActionSupport implements
ModelDriven<Class> {
private EmployeeService employeeService = new EmployeeService();
private Class cs = new Class();
public Class getCs() {
return cs;
}
public void setCs(Class cs) {
this.cs = cs;
}
@Override
public Class getModel() {
// TODO Auto-generated method stub
return cs;
}
// 添加班级页面
public String addView() {
/*List<Class> cs = employeeService.findAllClass();
ActionContext.getContext().getContextMap().put("cs", cs);*/
return "addView";
}
// 添加班级
public String add() {
employeeService.addClass(cs);
return list();
}
// 列表展示全部班级数据
public String list() {
List<Class> list = employeeService.findAllClass();
ActionContext.getContext().getContextMap().put("list", list);
return "list";
}
// 进入修改班级信息页面
public String updateView() {
String id = cs.getId();
Class c = employeeService.findOneClass(id);
// 数据回显
ValueStack vs = ActionContext.getContext().getValueStack();
vs.pop();
vs.push(c);
return "updateView";
}
// 修改班级信息
public String update() {
employeeService.updateClass(cs);
return list();
}
// 删除班级信息
public String delete() {
String id = cs.getId();
employeeService.deleteClass(id);
return list();
}
/*// 查询班级人数
public String selectNum(){
List listnum=employeeService.selectNum();
ActionContext.getContext().getContextMap().put("listnum", listnum);
return null;
}*/
}
2.student相关action方法
package cn.itcast.action;
import java.util.List;
import cn.itcast.entity.Student;
import cn.itcast.entity.Class;
import cn.itcast.service.impl.EmployeeService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;
public class StudentEmployeeAction extends ActionSupport implements ModelDriven<Student>{
private EmployeeService employeeService=new EmployeeService();
private Student student=new Student();
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public Student getModel() {
// TODO Auto-generated method stub
return student;
}
//添加学生
public String add(){
employeeService.addStudent(student);
return list();
}
//添加学生页面
public String addView(){
List<Class> cs = employeeService.findAllClass();
ActionContext.getContext().getContextMap().put("cs", cs);
return "addView";
}
//列表展示全部学生数据
public String list(){
List<Student> list=employeeService.findAllStudent();
ActionContext.getContext().getContextMap().put("list", list);
return "list";
}
//进入修改学生信息页面
public String updateView(){
String id=student.getId();
Student s=employeeService.findOneStudent(id);
Class c=employeeService.findOneClass(s.getMyclass().getId());
s.setMyclass(c);
//数据回显
ValueStack vs=ActionContext.getContext().getValueStack();
vs.pop();
vs.push(s);
return "updateView";
}
//修改学生信息
public String update(){
employeeService.updateStudent(student);
return list();
}
//删除学生信息
public String delete(){
String id=student.getId();
employeeService.deleteStudent(id);
return list();
}
}
九、配置action,最终的struts.xml如下
注意:添加多个令牌拦截器方法用逗号隔开
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.ui.theme" value="simple" />
<package name="dept" extends="struts-default">
<!-- 拦截器配置 -->
<interceptors>
<interceptor name="sessionInterceptor"
class="cn.itcast.interceptor.SessionInterceptor"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="sessionInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<action name="student_*" class="cn.itcast.action.StudentEmployeeAction"
method="{1}">
<result name="list">/WEB-INF/listStudent.jsp</result>
<result name="updateView">/WEB-INF/updateStudent.jsp</result>
<result name="addView">/WEB-INF/addStudent.jsp</result>
<interceptor-ref name="defaultStack" />
<!-- 增加令牌拦截器 -->
<interceptor-ref name="token">
<!-- 哪些方法被令牌拦截器拦截 -->
<param name="includeMethods">add</param>
</interceptor-ref>
<!-- 当表单重复提交转向的页面 -->
<result name="invalid.token" type="redirectAction">student_list</result>
</action>
<action name="class_*" class="cn.itcast.action.ClassEmployeeAction"
method="{1}">
<result name="list">/WEB-INF/listClass.jsp</result>
<result name="updateView">/WEB-INF/updateClass.jsp</result>
<result name="addView">/WEB-INF/addClass.jsp</result>
<interceptor-ref name="defaultStack" />
<!-- 增加令牌拦截器 -->
<interceptor-ref name="token">
<!-- 哪些方法被令牌拦截器拦截 -->
<param name="includeMethods">add</param>
</interceptor-ref>
<!-- 当表单重复提交转向的页面 -->
<result name="invalid.token" type="redirectAction">class_list</result>
</action>
</package>
</struts>
十、JSP页面
1.index.jsp(位于WebRoot下)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1 align="center">学生信息管理系统</h1>
<h2 align="center"><a href="student_list">学生信息管理</a>
<a href="class_list">班级信息管理</a></h2>
</body>
</html>
2.addClass.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'add.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1 align="center">添加班级</h1>
<s:form action="/class_add" method="post">
<s:token></s:token>
<table border="1" width="15%" align="center" cellpadding="2"
cellspacing="0">
<tr>
<td align="center">班级名称</td>
<td align="center"><s:textfield name="name" /></td>
</tr>
<tr>
<td colspan="2" align="center"><s:submit value="保存"></s:submit></td>
</tr>
</table>
</s:form>
</body>
</html>
3.addStudent.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'add.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1 align="center">添加学生</h1>
<s:form action="/student_add" method="post">
<s:token></s:token>
<table border="1" width="15%" align="center" cellpadding="2"
cellspacing="0">
<tr>
<td align="center">姓名</td>
<td align="center"><s:textfield name="name" /></td>
</tr>
<tr>
<td align="center">性别</td>
<td align="center"><s:textfield name="sex" /></td>
</tr>
<tr>
<td align="center">手机</td>
<td align="center"><s:textfield name="phone" /></td>
</tr>
<tr>
<td align="center">班级ID</td>
<td align="center"><s:textfield name="myclass.id" /></td>
</tr>
<tr>
<td align="center">班级名称</td>
<td align="center"><s:textfield name="myclass.name" /></td>
</tr>
<tr>
<s:if test="#request.cs!=null">
<s:iterator var="cs" value="#request.cs" status="c">
<tr>
<td><s:property value="#cs.id"/></td>
<td><s:property value="#cs.name"/></td>
</tr>
</s:iterator>
</s:if>
<s:else>
<td colspan="2">对不起没有你要显示的数据</td>
</s:else>
</tr>
<tr>
<td colspan="2" align="center"><s:submit value="保存"></s:submit></td>
</tr>
</table>
</s:form>
</body>
</html>
4.listClass.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'list.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1 align="center">班级信息查询</h1>
<h2 align="center"> <a href="class_addView">添加班级信息</a></h2>
<table border="1" width="80%" align="center" cellpadding="6"
cellspacing="0">
<tr>
<td>序号</td>
<td>班级名称</td>
<!-- <td>班级人数</td> -->
<td>修改</td>
<td>删除</td>
</tr>
<s:if test="#request.list!=null">
<s:iterator var="cla" value="#request.list" status="c">
<tr>
<td><s:property value="#c.count"/></td>
<td><s:property value="#cla.name"/></td>
<%-- <td><s:property value="#stu.myclass.name"/></td> --%>
<td><s:a href="class_updateView?id=%{#cla.id}" >修改</s:a></td>
<td><s:a href="class_delete?id=%{#cla.id}" >删除</s:a></td>
</tr>
</s:iterator>
</s:if>
<s:else>
<td colspan="5">对不起没有你要显示的数据</td>
</s:else>
</table>
</body>
</html>
5.listStudent.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'list.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1 align="center">学生信息查询</h1>
<h2 align="center"> <a href="student_addView">添加学生信息</a></h2>
<table border="1" width="80%" align="center" cellpadding="6"
cellspacing="0">
<tr>
<td>序号</td>
<td>姓名</td>
<td>性别</td>
<td>手机号</td>
<td>班级名称</td>
<td>修改</td>
<td>删除</td>
</tr>
<s:if test="#request.list!=null">
<s:iterator var="stu" value="#request.list" status="st">
<tr>
<td><s:property value="#st.count"/></td>
<td><s:property value="#stu.name"/></td>
<td><s:property value="#stu.sex"/></td>
<td><s:property value="#stu.phone"/></td>
<td><s:property value="#stu.myclass.name"/></td>
<td><s:a href="student_updateView?id=%{#stu.id}" >修改</s:a></td>
<td><s:a href="student_delete?id=%{#stu.id}" >删除</s:a></td>
</tr>
</s:iterator>
</s:if>
<s:else>
<td colspan="5">对不起没有你要显示的数据</td>
</s:else>
</table>
</body>
</html>
6.updateClass.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'add.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:form action="/class_update" method="post">
<s:hidden name="id"></s:hidden>
<s:token></s:token>
<table border="1" width="15%" align="center" cellpadding="2"
cellspacing="0">
<tr>
<td>班级名称</td>
<td><s:textfield name="name"/></td>
</tr>
<tr><td colspan="2"><s:submit value="保存"></s:submit></td></tr>
</table>
</s:form>
</body>
</html>
7.updateStudent.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'add.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:form action="/student_update" method="post">
<s:hidden name="id"></s:hidden>
<s:token></s:token>
<table border="1" width="15%" align="center" cellpadding="2"
cellspacing="0">
<tr>
<td>姓名</td>
<td><s:textfield name="name"/></td>
</tr>
<tr>
<td>性别</td>
<td><s:textfield name="sex"/></td>
</tr>
<tr>
<td>手机</td>
<td><s:textfield name="phone"/></td>
</tr>
<tr>
<td>班级ID</td>
<td><s:textfield name="myclass.id"/></td>
</tr>
<tr>
<td>班级名称</td>
<td><s:textfield name="myclass.name"/></td>
</tr>
<tr><td colspan="2"><s:submit value="保存"></s:submit></td></tr>
</table>
</s:form>
</body>
</html>
源码下载:
http://download.csdn.net/detail/zbq857143497/9743440