首先说一下SSH框架中各自的作用:
SSH三者作用
- Struts在项目中的作用
Struts 在项目主要起控制作用,只要用于web层(即视图层和控制层)
Struts本身是使用典型的MVC结构实现的,项目中使用了struts之后就等于项目也是一个MVC结构,使项目结构更清晰,分工更明细。
Struts在项目中主要负责视图层、控制层,在视图层提供了大量的标签库,提高视图层的开发速度。在控制层使用中央控制器(Actionsupport)和配置文件(struts.xml),实现拦截用户请求、封装请求参数及页面导航。
- Spring在项目中的作用
Spring是一个全方位的整合框架,在项目中对hibernate和struts进行整合,解决层与层之间的耦合问题。
Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合。
Spring的IoC来实现组件之间的依赖关系注入,上层框架不会渗透到下层组件,提高组件移植性和重用性,使得程序更灵活,上层框架不依赖实现而是依赖于抽象(委托接口)、使得实现类的变化不会影响上层组件,解决了层与层之间的藕合带来的维护或升级困难
SpringAOP 是面向方面编程,实现事务处理、日志服务等与业务无关的系统服务,实现插件式编程。
- Hibernate在项目中的作用
Hibernate应用于数据持久化层,是对JDBC的轻量级封装。是一种对象、关系的映射工具, 提供了从 Java类到数据表的映射,也提供了数据查询和恢复等机制, 大大减少数据访问的复杂度。把对数据库的直接操作 , 转换为对持久对象的操作。
在项目中的主要作用就是1、解决程序与数据库的依赖,即使用了Hibernate之后,以后更改数据库不需要更改代码,因为Hibernate会根据数据库方言来生成对应的SQL语句;2、是对JDBC的轻量级封装,简化持久层的代码,提高开发速度。
主要配置文件
项目主要配置文件为:
appilcationContext.xml
在这里配置连接池并且将其放在外部文件jdbc.properties
配置Hibernate的映射文件
对action,service,dao的管理
struts.xml
实现拦截用户请求、封装请求参数及页面导航。
log4j.properties
日志文件
jdbc.properties
连接数据库的参数如连接名,用户名。密码
表名.hbm.xml
.hbm.xml文件则是对表的映射
web.xml
该文件在WebRoot/WEB-INF下他的作用是配置Spring的核心监听器 , 配置Struts2的核心过滤器 。
项目开发心得:
Action继承ActionSupport 实现ModelDriven
接口 dao继承HibernateDaoSupport
1
2
3
4this.getHibernateTemplate().find()//查
this.getHibernateTemplate().delete(product);//删
this.getHibernateTemplate().update(product);//改
this.getHibernateTemplate().save(product);//增
action调用service,service调用dao
两种往前端传值的方法
1
2
3
4
5
6
7
8
91.ActionContext.getContext().getSession().put("clist", clist);
<s:iterator var="c" value="#session.clist">
<li><a href=""><s:property value="#c.cname"/></a> |</li>
</s:iterator>
2.ActionContext.getContext().getValueStack().set("hlist",hlist);
<s:iterator var="p" value="hlist">
<li><a href=""><img src="${pageContext.request.contextPath}/<s:property value="#p.image"/></a>
</li>
</s:iterator>往前端传信息
1 | this.addActionMessage("信息");//后端 |
前端判断
1
2
3
4<s:if test="#session.user1== null">
</s:if>
<s:else>
</s:else>后端放在Session里
1
ServletActionContext.getRequest().getSession().setAttribute("user1",user1);
分页查询
1 | //查询热门商品 |
- 二级菜单
一级菜单配置:一对多用的Set集合当然也可以使用List,这样可以使二级目录无序显示
Category.java
1 | private Set<CategorySecond> categorySeconds=new HashSet<CategorySecond>(); |
Category.hbm.xml
1 | <set name="categorySeconds" lazy="false"> |
二级菜单配置:多对一
CategorySecond.java
1 | private Category category; |
CategorySecond.hbm.xml
1 | <many-to-one name="category" class="cn.dm.shop.category.vo.Category" column="cid"> |
1 | <!--在前端则是用了两次迭代(第二次是调用了set集合)--> |
- 表单提交
js代码
1 |
|
上传图片
前端
1
<input type="file" name="upload" />
后端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43//文件上传需要的参数。
private File upload;//上传的文件 upload与前端name一致
private String uploadFileName;//上传的文件名
private String uploadContextPath;//上传的路径
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getUploadContextPath() {
return uploadContextPath;
}
public void setUploadContextPath(String uploadContextPath) {
this.uploadContextPath = uploadContextPath;
}
public String save() throws IOException{
if(upload != null){
// 将商品图片上传到服务器上.
// 获得上传图片的服务器端路径.
String path = ServletActionContext.getServletContext().getRealPath(
"/products");
// 创建文件类型对象:
File diskFile = new File(path + "//" + uploadFileName);
// 文件上传:
FileUtils.copyFile(upload, diskFile);
product.setImage("products/" + uploadFileName);
}
productService.save(product);
return "savesuccess";
}