Hibernate 实体类关系映射 配置文件
Struts2与Hibernate整合: 1. 创建struts2和hibernate用户类库 2. 导入struts2与hibernate的jar包 3. 配置web.xml文件(加入struts2的过滤器) <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> // struts2过滤器 </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> // 过滤所有请求 </filter-mapping> 4. 创建struts.xml WEB-INF/classes/struts.xml --> src/struts.xml <package name="default" namespace="/" extends="struts-default"></package> 5. 配置hibernate.cfg.xml(hibernate的主配置文档) src/hibernate.cfg.xml <hibernate-configuration> <session-factory> <property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.driver_class">com.mysql.jbdc.Driver</property> <property name="connection.url">jdbc:mysql:///test?useUnicode=true&characterEncoding=UTF-8</property> <property name="dialect">org.hibernate.dialet.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2dd1.auto">update</property> <property name="hibernate.current_session_context_class">thread</property>// 使用getCurrentSession方式打开会话 </session-factory> </hibernate-configuration>
重点 重点
实现修改学生资料action和页面调用
业务逻辑代码:
public boolean updateStudent(Student stu) {
Transaction transaction=null;
try{
Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
transaction=session.beginTransaction();
session.update(stu);;
transaction.commit();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
if(transaction!=null){
transaction=null;
}
}
}
action代码:
public String save() throws ParseException{
Student stu=new Student();
stu.setSid(request.getParameter("sid"));
stu.setSname(request.getParameter("sname"));
stu.setGender(request.getParameter("gender"));
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
stu.setBirthday(sdf.parse(request.getParameter("birthday")));
stu.setAddress(request.getParameter("address"));
StudentDao sd=new StudentDaoImpl();
sd.updateStudent(stu);
return "save_success";
}
编写修改学生的业务代码:
动作1——页面显示学生资料的动作
逻辑查询:
public Student queryStudentById(String sid) {
Transaction transaction=null;
Student s=null;
try{
Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
transaction=session.beginTransaction();
s=session.get(Student.class, sid);
transaction.commit();
return s;
}catch(Exception e){
e.printStackTrace();
return s;
}finally{
if(transaction!=null){
transaction=null;
}
}
}
Action动作:
public String modify(){
String sid=request.getParameter("sid");
StudentDao sd=new StudentDaoImpl();
Student s=sd.queryStudentById("sid");
session.setAttribute("student_modify", s);
return "student_modify_success";
}
页面显示学生资料:
<form name="modifyForm" action="<%=path%>/students/Students_save.action" method="post">
<table width="400" >
<tr>
<td width="30%">学号:</td>
<td><input type="text" name="sid" value='<s:property value="#session.student_modify.sid"/>' readonly="readonly"/></td>
</tr>
<tr>
<td width="30%">姓名:</td>
<td><input type="text" name="sname" value='<s:property value="#session.student_modify.sname"/>'/></td>
</tr>
<tr>
<td>性别:</td>
<td>
<s:if test='%{#session.student_modify.gender=="男"}'>
<input type="radio" name="gender" value="男" checked="checked"/>男
<input type="radio" name="gender" value="女"/>女
</s:if>
<s:else>
<input type="radio" name="gender" value="男" />男
<input type="radio" name="gender" value="女" checked="checked"/>女
</s:else>
</td>
</tr>
<tr>
<td>出生日期:</td>
<td><input name="birthday" type="text" id="control_date" size="20"
maxlength="10" onclick="new Calendar().show(this);" readonly="readonly"
value="<s:date name="#session.student_modify.birthday" format="yyyy-MM-dd"/>"
/>
</td>
</tr>
<tr>
<td>地址:</td>
<td><input type="text" name="address" value='<s:property value="#session.student_modify.address"/>'/></td>
</tr>
<tr>
<td colspan="2" align="center"><input class="button" type="submit" value="修改"></td>
</tr>
</table>
</form>
动作2——保存修改后的学生资料的动作
修改学生资料
介绍:通过点击学生姓名,跳转到需改页面,涉及技术(信息回显),注意:学生学号不能修改,回显的信息是从数据库中查出来的
1、界面原型演示
2、编写修改学生业务逻辑代码
3、编写修改action
4、页面调用
添加学生的方法
提交事物:是为了下次开启事物,可以正常执行。
public boolean addStudent(Student stu) {
Transaction transaction=null;
try{
Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
transaction=session.beginTransaction();
stu.setSid(this.getNewSid());
session.save(stu);
transaction.commit();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
if(transaction!=null){
transaction=null;
}
}
}
添加学生信息
1、学生主键生成策略:学生sid是字符串类型,每次由系统自动生成。
额外编写生成学生学号的方法:该方法功能——是去掉学号前的S,剩下转换为数字,转换成数字之后+1,之后再还原拼成8位的学生编号。
//获得学生主键最大值,并且进行加1操作。
public String getNewSid(){
Transaction transaction=null;
String hql="";
String sid=null;
try{
Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
transaction=session.beginTransaction();
hql="select max(sid) from Student";
Query query=session.createQuery(hql);
sid=(String)query.uniqueResult();
if(sid==null||"".equals(sid)){
sid="S00000001";
}else{
int i=Integer.parseInt(sid.substring(1));
i++;
String temp=String.valueOf(i);
int length=temp.length();
for(int j=0;j<=7-length;j++){
temp="0"+temp;
}
sid="S"+temp;
}
return sid;
}catch(Exception e){
e.printStackTrace();
return null;
}finally{
if(transaction!=null){
transaction=null;
}
}
}
2、编写添加学生业务逻辑代码
添加学生资料——实现步骤和界面原型设计
1、界面原型设计
2、编写添加学生业务逻辑代码
3、编写添加action
4、页面调用
删除学生资料
一:界面调用
<td><a href="<%=path %>/students/Student_delete?sid=<s:property value="#stu.sid"/>" onclick="javascript: return confirm('确认删除吗?');">删除</a></td>
二:编写业务逻辑代码
public boolean deleteStudent(String sid) {
// TODO Auto-generated method stub
Transaction transaction=null;
try{
Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
Student stu=(Student)session.get(Student.class, sid);
session.delete(stu);
transaction.commit();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
if(transaction!=null){
transaction=null;
}
}
}
三:编写删除action
public String delete(){
String sid=request.getParameter("sid");
sd.deleteStudent(sid);
return "student_delete_success";
}
四:测试
<result name="student_delete_success" type="chain">Student_query</result>
页面调用与数据展示
步骤1:修改tree.jsp访问action的路径由于树形菜单打开方式,通过框架方式来打开。
步骤2:Students_query_success.jsp中添加struts标签<%@ taglib prefix="s" uri="/struts-tags"%>,因为用到<s:iterator>标签来遍历学生,其中该标签用到两个属性,value属性:从哪里获得要遍历的集合,这里采用ognl表达式,struts的值栈分为对象栈和上下文栈,我们放到session中,其实是放到上下文栈中,从上下文栈中获取数据必须以#开头例如:value="#session.student_list"另外一个属性var:表示集合中取出每一个对象的名字。
每一个对象的属性用<s:property value="#stu.sid">来表示,(说明:
每次遍历,将session中的list的值取出一个放到对象stu中,然后从stu中取出Student类的信息。)
出生日期:用中文格式显示,可以用struts格式化日期标签<s:date name
="#stu.birthday" format="yyyy年MM月dd日/>(format等同于SimpleDateFormat)
设计学生Action类(action包中创建StudentAction类并编写action方法来执行查询所有学生的方法)
action方法:
public String query(){
StudentDao sd=new StudentDaoImpl();
List<Student> list=sd.queryAllStudent();
if(list!=null&&list.size()>0){
session.setAttribute("student_list", list);
}
return "student_query_success";
}
struts.xml:业务分层原理,所以重新创建package,登陆是登陆,学生管理是学生管理的package。
<package name="student_manage" namespace="/users" extends="struts-default">
<action name="*_*" method="{2}" class="action.{1}Action">
<result name="student_query_success">/students/Students_query_success.jsp</result>
</action>
</package>
学生业务逻辑接口实现
查询所有学生方法
public List<Student> queryAllStudent() {
Transaction transaction=null;
String hql="";
List<Student> list=null;
try{
Session session=MyHibernateSessionFactory.getSessionFactory().getCurrentSession();
transaction=session.beginTransaction();
hql="from Student";
Query query=session.createQuery(hql);
list=query.list();
transaction.commit();
return list;
}catch(Exception e){
e.printStackTrace();
return list;
}finally{
if(transaction!=null){
transaction=null;
}
}
}
test方法
@Test
public void testAddAllStudent(){
StudentDao sd=new StudentDaoImpl();
List<Student> studentList=sd.queryAllStudent();
for(int i=0;i<studentList.size();i++){
System.out.println(studentList.get(i));
}
}
设计学生业务逻辑接口(包括学生的增删改查的抽象方法)
添加学生:
public abstract boolean addStudent(Student s);
删除学生:
public abstract boolean deleteStudent(String sid)
修改学生:
public abstract boolean updateStudent(Student stu);
查询学生:
public abstract List<Student> queryAllStudent();
public abstract Student queryStudentById(String sid);
学生管理模块
一、显示学生资料
实现步骤:1、添加测试数据(TestStudent类中添加测试方法TestSaveStudent)
目的:在该方法中添加几条数据,查看是否能插入数据库,从而验证我们创建生成的student表是否可以进行操作。
2、设计学生业务逻辑接口
3、设计学生业务逻辑接口实现类
4、设计学生Action类
5、页面调用
6、显示数据
2、删除学生资料
3、学生主键生成策略
4、添加学生资料
5、修改学生资料
表单验证功能(登陆表单上显示报错信息)
方式一:客户端(前端界面JavaScript)完成。
方式二:服务器端(后端struts的验证框架)完成。
如果出错,则返回登陆界面,并在表单上提示出错信息。
步骤1:重写从Actionsupport继承的validate()方法。
addFieldError(key名,错误提示信息):提示错误信息的方法。
注意:validate()方法会对Action中所有方法进行验证,只对登陆进行验证,注销不需要进行表单验证,所以在注销方法上加@SkipValidation注解,保证执行注销方法时不对表单进行验证。
public void validate() {
if("".equals(user.getUsername().trim())){
addFieldError("usernameError", "用户名不能为空");//错误字段提示信息
}
if((user.getPassword()).length()<6){
addFieldError("passwordError","密码不能小于6位");
}
}
步骤2:
加入struts核心标签库<%@ taglib prefix="s" uri="/struts-tags"%>
加入
<div>
<s:fielderror/> <!-- 显示表单验证的出错信息 -->
</div>
完成显示登陆成功显示用户名:
1、返回登陆成功页面前,在session中保存登陆成功的用过户名。
Action中login方法:session.getAttribute("loginUserName",user.getUsername());
前端页面获取方式:
JSPsession获取方式:<%=session.getAttribute("loginUserName"%>
EL表达式获取方式:${sessionScope.loginUserName}
注销功能:编写注销方法(判断session中是否保存了用户登录成功的用户名,如果有则清空,然后返回一个字符串注销标识,紧接着配置struts.xml)
session的removeAttribute(""):移除指定key的value。
设计所有Action父类:
1、继承ActionSupport:内置很多struts拦截器,方便以后使用。
2、获得常用的内置对采用偶合IOC方式注入属性,以至于与前端进行联系,
实现ServletRequestAware、ServletResponseAware、ServletContext、并通过方法为request、response、application、session(通过request.getSession())赋值。
struts2的三种接收表单数据的方式
对象关系映射文件
最新API方法:
Configuration configuration = new Configuration().configure(); ServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build(); SessionFactory sessionfactory = configuration.buildSessionFactory(registry); Session session = sessionfactory.getCurrentSession(); MetadataImplementor metadata = (MetadataImplementor) new MetadataSources(registry).buildMetadata(); SchemaExport export = new SchemaExport(registry,metadata); export.create(true,true);
生成表结构:
// 创建配置对象
Configuration config = new Configuration().configue();
// 创建服务注册对象
ServiceReqistry serviceReqistry = new ServiceRegistryBuilder().applySetting(config);
// 创建sessionFactory
SessionFactory sessionFactory = config.buildeSessionFactory(serviceReqistry);
// 创建session对象
Session session = sessionFactory.getCurrentSession();
// 创建schemaExport对象
SchemaExport export = new SchemaExport(config);
export.create(true, true); // 第一个true表示生成表结构,第二个表示输出SQL语句
静态方法不能获取非静态属性
private static SessionFactory sessionFactory; // 会话工厂属性 // 构造方法私有化,保证单例模式 private MyHibernateSessionFactory(){} // 公有的静态方法,获得会话工厂对象 public static SessionFactory getSessionFactory(){ if(sessionFactory==null){ Configuration config = new Configuration().configure(); ServiceReqistry serviceReqistry = new ServiceReqistryBuilder().applySettings(config.getProperties()).buildServiceReqistry(); sessionFactory = config.buildSessionFactory(serviceReqistry); return sessionFactory; } else{ return sessionFactory; } }
生成表结构: // 创建配置对象 Configuration config = new Configuration().configue(); // 创建服务注册对象 ServiceReqistry serviceReqistry = new ServiceRegistryBuilder().applySetting(config); // 创建sessionFactory SessionFactory sessionFactory = config.buildeSessionFactory(serviceReqistry); // 创建session对象 Session session = sessionFactory.getCurrentSession(); // 创建schemaExport对象 SchemaExport export = new SchemaExport(config); export.create(true, true); // 第一个true表示生成表结构,第二个表示输出SQL语句
实体类的映射文件
Struts2与Hibernate整合: 1. 创建struts2和hibernate用户类库 2. 导入struts2与hibernate的jar包 3. 配置web.xml文件(加入struts2的过滤器) <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> // struts2过滤器 </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> // 过滤所有请求 </filter-mapping> 4. 创建struts.xml WEB-INF/classes/struts.xml --> src/struts.xml <package name="default" namespace="/" extends="struts-default"> </package> 5. 配置hibernate.cfg.xml(hibernate的主配置文档) src/hibernate.cfg.xml <hibernate-configuration> <session-factory> <property name="connection.username">root</property> <property name="connection.password"></property> <property name="connection.driver_class">com.mysql.jbdc.Driver</property> <property name="connection.url">jdbc:mysql:///test?useUnicode=true&characterEncoding=UTF-8</property> <property name="dialect">org.hibernate.dialet.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2dd1.auto">update</property> <property name="hibernate.current_session_context_class">thread</property>// 使用getCurrentSession方式打开会话 </session-factory> </hibernate-configuration>
修改学生资料
注意:学号不能修改
说明:每次遍历。将session中的list的值取出一个放到对象stu中,然后从stu中取出Student类的信息。