<--Student.hbm.xml --></--Student.hbm.xml--hibernate文档>
<--HibernateUtil.java --></--HibernateUtil.java---类文件>
<-- hibernate.cfg.xml--></hibernate.cfg.xml--文档>
<-- Test.java--></--Test.java--Junit测试类>
<-- StudentDAO.java--></--StudentDAO.java--dao类><--dao 用的方法跟测试类一样--></--dao>
<--student.xml--></--student.xml--学生文档>
<--struts.xml--></--struts.xml--文档>
<--web.xml--></--web.xml-- web文档>
<--实体类--></--><--Student.java--></--Student.java-->
1,
搭建struts2和hibernate开发环境:
1.添加hibernate的jar包 lib/required
2.添加struts2的jar包 apps/解压一个项目blank/lib
3.添加mysql数据库连接驱动
4.添加struts2的配置文件struts.xml
5.添加hibernate的配置文件hibernate.cfg.xml
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/curricula</property>
<property name="connection.username">root</property>
<property name="connection.password">12345678</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
hbm2ddl.auto 是否自动创建数据库
6.编写初始化SessionFactory和获取Session的代码。
2,
curricula 数据库
=========================================
学生
Student(id,name,pwd,phone,grade,photo)
1.创建javabean
getter和setter的快捷键
alt+shift+s r
2.建立映射文件
建立对象与表的对应关系,对象属性与表中字段的对应关系。
完全限定名
3.测试程序
Junit单元测试
事务 Transaction
把多个命令绑定成一个事务,要么全部成功,要么全部失败。
4.用注解方式配置映射关系(一般多用注解配置)
3,
重复密码不提交,在表单变量中,就不能指定其name属性。
4,
hibernate中Session用法。
5,
标签做条件必须用OGNL表达式,其他用EL表达式
6,
上传文件的表单设置
enctype="multipart/from-data" method="post"
<img id="image" name="image" src="" />
<input type="file" name="file" οnchange="setImage(this)"/>
</body>
<script language="javascript">
function setImage(obj){
image.src = obj.value;
}
</script>
7,
创建年的目录:Calendar cal = Calendar.getInstance();
文件上传:enctype="multipart/form-data"
8,
2.没有联系人的时候,性别处于未选择状态,将其默认值设置为“男”。
百度 jquery checked
.attr("checked",true);
.attr("checked","checked");
if($("[name='contact.sex']:checked").length==0)
{
$("[name='contact.sex']:eq(1)").attr("checked",true);
}
3.解决上传图片预览在浏览器中不显示的问题
使用一个图片上传预览插件
9,
hibernate开发步骤:
1. 新建room.jsp页面
3.编写实体类 Room
4.编写Action
5.配置action
10,
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/jquery-easyui-
1.5.3/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/jquery-easyui-1.5.3/themes/icon.css">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/jquery-easyui-1.5.3/demo.css">
用easyui需要引进这些
11,
hibernate的分页
1.编写一个类来存放分页信息
//当前页
private int pageNo;
//总页数
private int pageCount;
//每页的记录条数
private int pageSize=3;
//分页按钮个数
private int btnCount=4;
2.RoomAction main
(1)只显示当页数据
要确定页数
当前是第一页,每页显示10条数据
第一页显示0 - 9 (page-1)*pageSize
第二页显示10 - 19 (page-1)*pageSize
当前是第page页,每页显示pager.PageSize条数据
(page-1)*pager.PageSize
(2)显示导航按钮
设置起始位置
query.query.setFirstResult
设置最大返回记录数
query.setMaxResults
页面传入当前页page
保存完停留在最后一页
修改完停留在当前页
返回
1.所有数据
2.总页数
12,
一对多,外键设在多方
13,
代码重构Alt+shift+M
14,
设置课程的教师信息
点击单元格,弹出新窗口
新窗口中必须要有course.id,teacher.id,teacher.name
div 块级元素
span 行级元神
设置教师信息的弹出窗口的内容
a.3个隐藏变量:course.id,teacher.id,teacher.name
b.显示课程名称
c.展现教师列表供选择
d.保存选择的按钮
15,
功能:把课程和老师对应起来
两个变量
course.id,teacher.id
三个变量的问题course.id,teacher.id,teacher.name
其实只需要两个变量:course.id,teacher.id
也可以用四个变量,加上course.name,teacher.name
三个事件
1.弹出窗口的事件
2.选择一个老师的事件
3.保存并关闭窗口的事件
让ajax以同步方式执行
$.ajaxSettings.async=false
全局变量
一个cell
16,
1.表单中添加token标签
<s:token></s:token>
2.action中配置拦截器
token和tokenSession
重复提交后的跳转的result
invalid.token
拦截器栈
excludesMethods 不拦截哪些方法
3.配置默认全局默认拦截器
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="tokenSession">
<param name="includeMethods">update</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
17,
复习一对多的关系 ,(不讲多对一的关系)
老师 课程
一个老师可以上多个课程,一个课程,只能由一个老师来上
对象设计:
站在老师的角度
Set courses - getCourses()
站在课程的角度
teacher getTeacher()
数据库的设计:
在多方增加一个外键
课程id 课程名称 ... 教师id
1 c语言 1
2 java 2
错误的设计
教师id 教师名称 .... 课程id
1 张老师 1,2 (不符合数据库设计规范)
另外,有mappedBy的对象方,其实体表中不会生成外键
=========================================================
多对多关系
学生 和 课程
一个学生可以选择多门课程,一门课程,也可以被多个学生选择
学生
Student(id,name,sex,pwd,phone,grade,photo)
课程
Course(id,name,type,hours)
数据库的设计:
中间表
student-course(sid,cid)
数据库表关系
sid cid
1 1
1 2
2 1
2 2
对象关系:
一个学生可以选择多门课程,一门课程可以被多个学生选择
1.站在学生的角度,有一个属性叫做courses
可以通过getCourses(),得到自己选择的所有课程
2.站在课程的角度,有一个属性叫做students
可以通过getStudents,得到选择这门课程的所有学生
选择一方来维护关联关系,叫做主表
维护关联关系的一方
通过学生来添加课程
student.setCourses(....)
或者通过课程来添加学生
course.setStudents(...)
@ManyToMany
@JoinTable(
name="student_course",
joinColumns={@JoinColumn(name="sid")},
inverseJoinColumns={@JoinColumn(name="cid")}
)
多对多关系
@JoinTable(
name="student_course",
joinColumns=@JoinColumn(name="sid"),
inverseJoinColumns=@JoinColumn(name="cid")
)
18,
@Entity
public class Student {
private int id;
private String name;
private String pwd;
private String phone;
private String grade;
private String photo;
private String sex;
private Contact contact;
private Set<Course> courses =new HashSet<Course>();
//必须初始化(Junit测试)才能使用(student.getCourses().add(course1);
student.getCourses().add(course2);)
19,
1.修改功能被 禁止重复提交的拦截器拦截
解决办法,修改时,调用另外的action方法。
2.修改init.jsp为choose.jsp
3.将功能链接到菜单中。
20,
2, $.post("${pageContext.request.contextPath}/course/checkesSelect"
,{"course.id":e.lang},function(data){
eval("e.checked=" +data);
});
//(eval是把字符串变成命令)
21,
StudentDAO中update方法修改:session.merge(student);//修改之前是 saveOrUpdate(arg0);
22,
CourseAction.java中先关联数据库中的Student
public String checkit()
{
//Student没有与数据库中的Student关联,要去关联
Student student= (Student) ActionContext.getContext().getSession().get("STUDENT");
StudentDAO sdao =new StudentDAO();
student= sdao.get(student);//
course=dao.get(course)
数据库设计时,一对多关系中,外键字段要设在多方,代码相对来说要简单一些
在多的一方加外键
为什么呢?因为我们在数据库中,可以指定某个课程的教室是哪一个? 但是不能指定每个教室上哪些课程。
1.修改功能被 禁止重复提交的拦截器拦截
解决办法,修改时,调用另外的action方法。
2, $.post("${pageContext.request.contextPath}/course/checkesSelect"
,{"course.id":e.lang},function(data){
eval("e.checked=" +data);
});
//(eval是把字符串变成命令)