12月1日struts、spring、hibernate等框架的整合培训日记

本文介绍了Struts与Spring集成的两种方式,包括在Action中直接调用Spring获取Manager对象的方法,以及将Struts的Action作为Spring的JavaBean进行配置。此外,还探讨了Spring与Hibernate的整合原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

facade模式:就是中关村攒机者的角色,他负责与多个零件供销商交互并将这些零件组装起来交给最终客户。
struts与spring集成的两种方式:
第一种是在struts的Action的execute方法中调用spring的applicationContext去获得Manager对象,这里的Action自身没有用到spring的思想,Action无法作为Spring中的JavaBean进行配置,相应代码如下:
ServletContext application = this.getServlet().getServletContext();
WebApplicationContext wapp = (WebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(application);
//WebApplicationContext wapp = (WebApplicationContext)application.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
StudentManager studentManager = (StudentManager)wapp.getBean("studentManager");
另外,spring为集成struts而提供了一个ContextLoaderPlugIn插件,其作用在于:创建一个ApplicationContext对象,并将这个对象存储在ServletContext中,以后在ActionSupport中就可以调用getWebApplicationContext来获得这个ApplicationContext对象了,这并没有让我感觉有多大的好处,示例代码如下:
Enumeration e = application.getAttributeNames();
while(e.hasMoreElements())
{
String attributeName = (String)e.nextElement();
String objClassName = application.getAttribute(attributeName).getClass().getName();
try
{
response.getWriter().println(attributeName + ":" + objClassName + "<br>");
}catch(Exception ex){}
}
StudentManager studentManager = this.getWebApplicationContext().getBean("studentManager"));

第二种是将struts的Action作为spring的一个JavaBean进行配置,在Action里面只需要定义一个Manager变量和相应的setter/getter方法,就可以通过spring为其注入一个Manager对象。这种方式太复杂,很牵强,个人觉得没有什么实际意义,建议大家不必花费时间去学习。

spring与hibernate整合的原理:
class MyController extend simpleformcontroller
{
public MyController()
{
setCommandClass(Studnet.class);
}
}
首先回忆使用hibernate的步骤:
1.创建和配置Configuration对象,配置Congiuration对象可以通过hibernate.properties或hiberate.cfg.xml文件,也可以完全采用如下的编程方式:
configuration = new Configuration()
configuration.addClass(Student.class)
//.addFile("Student.hbm.xml")
//.addResource("/Student.hbm.xml")
.setProperty("show_sql","true");
2.由configuration创建出SessionFactory对象:
SessionFactory sf = configuration.buildSessionFactory();
3.通过SessionFactory获得session对象,然后进行CRUD操作:
Session session = sf.openSession();
session.save()\delete\update\load\
session.close();
使用spring集成hibernate的第一步就是借助spring的配置创建出SessionFactory对象
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="mappingResource?>
<list>
<value>xx.hbm.xml</value>
<value>yyy.hbm.xml</value>
<list>
</Property>
<property name="hibernateProperties">
<props>
<prop key="show_sql">true</prop>
<props>
</property>
<property name="datasource"><ref locale=""/></property>
</bean>
在LocalSessionFactoryBean内部完全采用编程方式来配置configuration对象,而不再通过hibernate.properties或hiberate.cfg.xml配置文件,带着大家查看了LocalSessionFactoryBean的源代码。
有了SessionFactory,我们接着就可以通过spring将这个SessionFactory注入到DAO类中,配置如下:
<bean id="studentDAO" class="cn.itcast.StudentDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
相应的调用程序代码示意如下:
class StudentDAO
{
sessionFactroy;
void setSessionFactory(sessionFactory)
{
this.sessionFactory = sessionFactory;
}
insert(User user)
{
sessionFactory.openSession();//累
session.save(user);
session.close();//累
}
}
我们还有自己openSession和getSession,这是不是很累呢?为此,spring又提供了一个配置类hibernateTemplate,它可以帮助我们去openSession和closeSession,这个配置类能够openSession,显然它一定要有SessionFactory的引用。
<bean id="hibernateTemplate" class="HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
遵循spring的IOC思想,我们接着还要将HibernateTemplate注入到DAO类中,配置如下:
<bean id="studentDAO" class="cn.itcast.StudentDAO">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>

class StudentDAO
{
hibernateTemplate;
void sethibernateTemplate(hibernateTemplate)
{
this.hibernateTemplate = hibernateTemplate;
}
insert(User user)
{
hibernateTemplate.save(user);//我们不再openSession和closeSession,不是很爽吗?
}
}

另外,spring还提供了一个HibernateSuport类,它可以通过注入的SessionFactory返回一个HibernateTemplate,我们的DAO类继承这个HibernateSupport,也可以获得HibernateTemplate对象进行CRUD操作,配置及示意代码如下:
<bean id="studentDAO" class="cn.itcast.StudentDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
class StudentDAO extends HibernateSuport
{
/*hibernateTemplate;
void gethibernateTemplate()
{
return hibernateTemplate;
}
sessionFactroy;
void setSessionFactory(sessionFactory)
{
this.sessionFactory = sessionFactory;
hibernateTemplate = new HibernateTemplate(sessionFactory);
}*/


insert(User user)
{

getHibernateTemplate().save(user);
}
}

最后由王泽佑提问引出spring mvc的注册绑定的详细讲解:
在spring帮助文档中搜索editor,可以看到有关注册绑定的信息,CustomDateEditor是没有被自动注册的,需要用户在initBinder方法内部调用,示例代码如下:
protected void initBinder(
HttpServletRequest request,
ServletRequestDataBinder binder)
throws ServletException {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy/MM/dd"),true));
}
一种替换的方式及registerCustomEditor底层的实现内幕:
调用BaseCommandController.setPropertyEditorRegistrars()方法,显然这可以作为controller的属性进行配置。
class MyPropertyEditorRegistrar
{
void registerCustomEditors(PropertyEditorRegistry registry)
{
reguistry.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
}
}

关于Date数据校验的问题:通过在struts帮助文挡的Validator帮助页面中搜索validate,是可以搜索到DateValidator的配置帮助的。

如果注册了DateEditor,数据成功转换成Date类型的字段,那么随后的的Validator框架就没必要对这个Date字段进行校验了,因为Validator是对已装配到Bean中的字符串类型的字段进行校验,而数据都已经成功装配进了Date字段中,哪还有校验的必要。框架把数据装配到formbean里面,Validator从Formbean里面拿数据进行校验。


<bean id="myController class="cn.itcast.MyController">
<property key="commandClass">
<value>cn.itcast.Student</value>
</prperty>
</bean>
上面的配置信息相当于下面的一段代码,这其中就涉及到了属性绑定的问题,要把字符串"cn.itcast.Student"转换成Class对象。
Class clazz = Class.forName("cn.itcast.Student");
setCommandClass(clazz);

小记:通过spring配置文件中的<import>元素的resource属性可以导入更多的配置文件,实现信息分散配置的目的。

1. 用户与身体信息管理模块 用户信息管理: 注册登录:支持手机号 / 邮箱注册,密码加密存储,提供第三方快捷登录(模拟) 个人资料:记录基本信息(姓名、年龄、性别、身高、体重、职业) 健康目标:用户设置目标(如 “减重 5kg”“增肌”“维持健康”)及期望周期 身体状态跟踪: 体重记录:定期录入体重数据,生成体重变化曲线(折线图) 身体指标:记录 BMI(自动计算)、体脂率(可选)、基础代谢率(根据身高体重估算) 健康状况:用户可填写特殊情况(如糖尿病、过敏食物、素食偏好),系统据此调整推荐 2. 膳食记录与食物数据库模块 食物数据库: 基础信息:包含常见食物(如米饭、鸡蛋、牛肉)的名称、类别(主食 / 肉类 / 蔬菜等)、每份重量 营养成分:记录每 100g 食物的热量(kcal)、蛋白质、脂肪、碳水化合物、维生素、矿物质含量 数据库维护:管理员可添加新食物、更新营养数据,支持按名称 / 类别检索 膳食记录功能: 快速记录:用户选择食物、输入食用量(克 / 份),系统自动计算摄入的营养成分 餐次分类:按早餐 / 午餐 / 晚餐 / 加餐分类记录,支持上传餐食照片(可选) 批量操作:提供常见套餐模板(如 “三明治 + 牛奶”),一键添加到记录 历史记录:按期查看过往膳食记录,支持编辑 / 删除错误记录 3. 营养分析模块 每营养摄入分析: 核心指标计算:统计当摄入的总热量、蛋白质 / 脂肪 / 碳水化合物占比(按每推荐量对比) 微量营养素分析:检查维生素(如维生素 C、钙、铁)的摄入是否达标 平衡评估:生成 “营养平衡度” 评分(0-100 分),指出摄入过剩或不足的营养素 趋势分析: 周 / 月营养趋势:用折线图展示近 7 天 / 30 天的热量、三大营养素摄入变化 对比分析:将实际摄入与推荐量对比(如 “蛋白质摄入仅达到推荐量的 70%”) 目标达成率:针对健
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值