【Dongle】【SSH】框架学习
来源:互联网 发布:炉石传说mac下载 编辑:程序博客网 时间:2024/06/06 05:41
了解SSH的框架对于整个网上商城的Web项目开发有很大作用。
准备
首先需要两种包:一种是struts2的包,一种是hibernate包。一般下载新版本(或稳定版)都可以。如果有不懂得,可以选着一些帮助文档看看,这里就不细说明了。
SSH框架
SSH框架是由Action、Service、Dao、 Vo、页面(这里以JSP为主)所构成,并通过配置文件进行配置,相互协作,实现功能的技术。
首先需要创建包,如下图所示
然后里面对应的是Action、Service、Dao、 Vo的子包
这里我们使用的action是adminaction,在学习网上商城的时候,视频中没有设计用户管理的操作,然后兴趣而发,自己设计了查询所有用户的管理(不一定适用,仅限框架了解)
Vo层
首先要创建的是vo层,vo层内包含的是对象的实体类(这里是用户模块的实体类)。
package cn.itcast.shop.user.vo;/* * 用户模块的实体类 * CREATE TABLE `user` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `phone` varchar(255) DEFAULT NULL, `addr` varchar(255) DEFAULT NULL, `state` int(11) DEFAULT NULL, `code` varchar(64) DEFAULT NULL, PRIMARY KEY (`uid`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; */public class User {private Integer uid;private String username;private String password;private String name;private String email;private String phone;private String addr;private Integer state;private String code;public Integer getUid() {return uid;}public void setUid(Integer uid) {this.uid = uid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}public Integer getState() {return state;}public void setState(Integer state) {this.state = state;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}}
实体反射配置
然后需要对其进行反射文件的配置:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name = "cn.itcast.shop.user.vo.User" table="user"> <id name="uid"> <generator class="native"/> </id> <property name="username"/> <property name="password"/> <property name="name"/> <property name="email"/> <property name="phone"/> <property name="addr"/> <property name="state"/> <property name="code"/> <!-- 关联关系:与订单的关系 --> <!-- <set name="orders"> <key column="uid"/> <one-to-many class="cn.itcast.shop.order.vo.Order"/> </set> --> </class></hibernate-mapping>
这样实体类就可以在其他包层内进行使用,并可以与数据库建立通过接口进行直接连接,当然还需要在配置文件中进行配置,下面会提到。Action层
接下来,action层就是一般的数据接收和传递层,action将接受的数据传递给service进行处理package cn.itcast.shop.user.adminaction;import cn.itcast.shop.user.service.UserService;import cn.itcast.shop.user.vo.User;import cn.itcast.shop.utils.PageBean;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;/* * 后台管理用户的类 */public class AdminOrdinaryUserAction extends ActionSupport implements ModelDriven<User>{//模型驱动使用的对象private User user = new User();public User getModel() {return user;}//接收page参数private Integer page;public void setPage(Integer page) {this.page = page;}//注入serviceprivate UserService userService;public void setUserService(UserService userService) {this.userService = userService;}//带分页查询所有的用户public String findAll(){//调用service,查询所有用户,参数为pagePageBean<User> pageBean = userService.findAll(page);//将数据保存到页面ActionContext.getContext().getValueStack().set("pageBean", pageBean);return "findAll";}}
Service层
由service将处理的信息传递给dao层进行数据库操作(商品的PageBean是utils包中封装起来的复用的类)
package cn.itcast.shop.user.service;import java.util.List;import org.springframework.transaction.annotation.Transactional;import cn.itcast.shop.user.dao.UserDao;import cn.itcast.shop.user.vo.User;import cn.itcast.shop.utils.MailUtils;import cn.itcast.shop.utils.PageBean;import cn.itcast.shop.utils.UUIDUtils;/* * 用户名模块业务层代码 */@Transactional //事务注解public class UserService {//注入UserDaoprivate UserDao userDao;//后台管理用户的方法public PageBean<User> findAll(Integer page) {//创建分页用户集合PageBean<User> pageBean = new PageBean<User>();//设置当前页数pageBean.setPage(page);//设置每页显示的记录数int limit = 10 ;//设置总的记录数int totalCount = 0;totalCount = userDao.findCount();pageBean.setTotalCount(totalCount);//设置总的页数int totalPage = 0;if (totalCount % limit == 0) {totalPage = totalCount / limit;}else {totalPage = totalCount / limit + 1;}pageBean.setTotalPage(totalPage);//设置每页数据的集合//设置起始页int begin = (page - 1) * limit;List<User> list = userDao.findByPage(begin,limit);pageBean.setList(list);return pageBean;}}
这里面就是对pageBean进行业务处理,将pageBean对象所需内容进行设置,并通过带分页查询数据,将查询到的数据继续设置给pageBean,由pageBean返回到action中。
Dao层
package cn.itcast.shop.user.dao;import java.util.List;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import cn.itcast.shop.user.vo.User;import cn.itcast.shop.utils.PageHibernateCallback;/* * 用户模块持久层代码 */public class UserDao extends HibernateDaoSupport {//DAO层查询总记录数public int findCount() {String hql = "select count(*) from User";List<Long> list = this.getHibernateTemplate().find(hql);if (list != null && list.size()>0) {return list.get(0).intValue();}return 0;}//DAO层带分页查询用户信息public List<User> findByPage(int begin, int limit) {String hql = "from User order by uid desc";List<User> list = this.getHibernateTemplate().execute(new PageHibernateCallback<User>(hql,null,begin,limit));if (list != null && list.size()>0) {return list;}return null;}}
DAO层类继承了HibernateDaoSupport,这个接口可以实现对数据库的操作,并得到我们需要的结果。
值栈存数据
数据传到了,并通过值栈的方式保存数据
ActionContext.getContext().getValueStack().set("pageBean", pageBean);
然后我们就可以去页面上进行获取值栈数据了。在这之前,需要解决我们的配置问题applicationContext.xml
<!-- 配置连接池: --><!-- 引入外部属性文件 --><context:property-placeholder location="classpath:jdbc.properties"/><!-- 配置C3P0连接池: --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driver}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></bean><!-- Hibernate的相关信息 --><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><!-- 注入连接池 --><property name="dataSource" ref="dataSource"/><!-- 配置Hibernate的其他的属性 --><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql">true</prop><prop key="hibernate.connection.autocommit">false</prop><prop key="hibernate.hbm2ddl.auto">update</prop></props></property><!-- 配置Hibernate的映射文件 --><!-- 来源于各实体类的映射文件*.hbm.xml --><property name="mappingResources"> <list> <value>cn/itcast/shop/user/vo/User.hbm.xml</value> </list></property></bean><!-- 配置后台用户管理的Action --><bean id="adminOrdinaryUserAction" class="cn.itcast.shop.user.adminaction.AdminOrdinaryUserAction" scope="prototype"> <property name="userService" ref="userService"></property></bean><!-- Service的配置 ===========================--><bean id="userService" class="cn.itcast.shop.user.service.UserService"> <property name="userDao" ref="userDao"/></bean><!-- Dao的配置 ===========================--><bean id="userDao" class="cn.itcast.shop.user.dao.UserDao"> <property name = "sessionFactory" ref="sessionFactory"/></bean>
struts.xml配置
<struts> <constant name="struts.devMode" value="false" /><package name="shop" extends="struts-default" namespace="/"><!-- 配置后台用户管理的Action --><action name="adminOrdinaryUser_*" class="adminOrdinaryUserAction" method="{1}"> <result name="findAll">/admin/user/list.jsp</result> </action></package></struts>
一定要注意,struts中配置的action的class要与applicationContext.xml设置的对应的action里bean标签name相同,否则就会编译失败。扩展
那么在页面上是如何接受数据的呢?
一般而言,如果只是一个对象的变量,我们可以通过session值保存,而如果是集合数据(复杂类型),我们最好使用值栈的方式,就如上面使用的那样。
通常都需要引入在页面上引入标签库:
<%@ taglib uri="/struts-tags" prefix="s"%>
取值栈数据
<s:iterator var="user" value="pageBean.list" status="status"> <td style="CURSOR: hand; HEIGHT: 22px" align="center" width="18%"><s:property value="#user.username" /></td></s:iterator>
取session数据
<s:property value="#session.cart.total"/>
模型驱动取数据
另外在action由于实现了ModelDriven类,模型驱动(即设置为模型的对象类可以直接在页面和服务器间传递数据,并被直接使用
<s:property value="model.total"/>
- 【Dongle】【SSH】框架学习
- 【Dongle】【MVC】MVC框架学习
- 【Dongle】【EF】EF框架学习
- 【Dongle】【SSH】商品图片上传
- ssh框架学习
- ssh框架学习
- SSH框架学习总结
- SSH框架学习总结
- ssh框架学习
- SSH框架学习
- Java SSH框架学习
- 一步步学习SSH框架
- ssh框架学习总结
- SSH框架的学习
- SSH框架学习
- SSH框架学习总结
- SSH框架学习
- ssh框架学习视频
- Fliptile [反转问题][dfs]
- 算法训练 6-1 递归求二项式系数值
- 初始结构体,计算量点距离
- HDU3065 病毒侵袭持续中(AC自动机)
- 在QT中引用Shark Machine Learning library
- 【Dongle】【SSH】框架学习
- 多线程安全开启问题
- 总结一些工具、参考类的网站(总结自己常用的网站)
- 满满的爱
- Java面向对象(五)封装
- Kotlin VS Java:基本语法差异
- File -详解
- jqueryeasyui动态生成分页的相关属性设置datagrid
- Apache Hadoop分布式文件系统说明