SSH项目开发总结

首先说一下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的轻量级封装,简化持久层的代码,提高开发速度。

主要配置文件

项目主要配置文件为:

  1. appilcationContext.xml

    在这里配置连接池并且将其放在外部文件jdbc.properties

    配置Hibernate的映射文件

    对action,service,dao的管理

  2. struts.xml

    实现拦截用户请求、封装请求参数及页面导航。

  3. log4j.properties

    日志文件

  4. jdbc.properties

    连接数据库的参数如连接名,用户名。密码

  5. 表名.hbm.xml

.hbm.xml文件则是对表的映射

  1. web.xml

    该文件在WebRoot/WEB-INF下他的作用是配置Spring的核心监听器 , 配置Struts2的核心过滤器 。

项目开发心得:

  1. Action继承ActionSupport 实现ModelDriven接口

  2. dao继承HibernateDaoSupport

    1
    2
    3
    4
       this.getHibernateTemplate().find()//查
    this.getHibernateTemplate().delete(product);//删
    this.getHibernateTemplate().update(product);//改
    this.getHibernateTemplate().save(product);//增
  1. action调用service,service调用dao

  2. 两种往前端传值的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    1.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>
  3. 往前端传信息

1
2
this.addActionMessage("信息");//后端
<s:actionmessage/>
  1. 前端判断

    1
    2
    3
    4
    <s:if test="#session.user1== null">
    </s:if>
    <s:else>
    </s:else>

    后端放在Session里

    1
    ServletActionContext.getRequest().getSession().setAttribute("user1",user1);
  2. 分页查询

1
2
3
4
5
6
7
8
9
10
11
12
13
		//查询热门商品
public List<Product> findHot() {
// TODO Auto-generated method stub
//分页查询,使用离线方法查询
DetachedCriteria criteria=DetachedCriteria.forClass(Product.class);
//查询is_how为1
criteria.add(Restrictions.eq("is_hot", 1));
//倒序排序输出
criteria.addOrder(Order.desc("pdate"));
//执行查询
List<Product> list=this.getHibernateTemplate().findByCriteria(criteria,0,10);
return list;
}
  1. 二级菜单
    一级菜单配置:一对多用的Set集合当然也可以使用List,这样可以使二级目录无序显示

Category.java

1
private Set<CategorySecond> categorySeconds=new HashSet<CategorySecond>();

Category.hbm.xml

1
2
3
4
<set name="categorySeconds" lazy="false">
<key column="cid"></key>
<one-to-many class="cn.dm.shop.categorysecond.vo.CategorySecond"/>
</set>

二级菜单配置:多对一
CategorySecond.java

1
private Category category;

CategorySecond.hbm.xml

1
2
<many-to-one name="category" class="cn.dm.shop.category.vo.Category" column="cid">
</many-to-one>
1
2
3
4
5
6
7
8
9
10
11
12
13
<!--在前端则是用了两次迭代(第二次是调用了set集合)-->
<s:iterator var="c" value="#session.clist">
<dl>
<dt>
<a href=""><s:property value="#c.cname"/></a>
</dt>
<s:iterator var="cs" value="#c.categorySeconds">
<dd>
<a href=""><s:property value="#cs.csname"/></a>
</dd>
</s:iterator>
</dl>
</s:iterator>
  1. 表单提交
    js代码
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

<script>
function saveCart(){
document.getElementById("cartForm").submit();
}
</script>

<form id="cartForm" action="${ pageContext.request.contextPath }/cart_addCart.action" method="post" >
<input type="hidden" name="pid" value="<s:property value="model.pid"/>"/>
<div class="action">
<dl class="quantity">
<dt>购买数量:</dt>
<dd>
<input id="count" name="count" value="1" maxlength="4" onpaste="return false;" type="text"/>
</dd>
<dd>

</dd>
</dl>

<div class="buy">
<input id="addCart" class="addCart" value="加入购物车" type="button" onclick="saveCart()"/>
</div>
</div>
</form>
  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";
    }
-------------本文结束感谢您的阅读-------------
0%