struts 控制用的
hibernate 操作数据库的
spring 用解耦的
第一步:先创建一个wed项目 。
第二步:配置struts2
1.添加Struts2所需要的基本jar包到 lib目录下 包名如下图:
2.在web.xml 文件里添加struts的过滤器配置如下:《提示:struts2-2.3版本》
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>ssh</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3.在web.xml 文件里添加struts的过滤器配置如下:《提示:struts2-2.5版本》
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>ssh</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <filter> <filter-name>struts-prepare</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareFilter</filter-class> </filter> <filter> <filter-name>struts-execute</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts-prepare</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts-execute</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
4.在src目录下创建struts配置文件,struts.xml,内容如下:《提示:注意配置头信息需要对应的版本》
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="struts2" extends="struts-default"> </package> </struts>
使用Struts2的好处:
1.实现了页面和代码的分离实现了mvc设计理念。
2.获取表单内容,并组织生成参数对象
3.根据请求的参数转发请求适当的控制器
4.在控制器中调用业务接口
5.将业务接口返回的结果包装起来发送给指定的视图,并由视图完成处理结果的展现
6.做一些简单的校验或国际化工作
第三步:配置spring
1.在lib目录下导入spring相关的jar包如下:《提示:spring跟struts结合还需要2个struts的jar包分别是:
struts2-spring-plugin-2.3.30.jar和commons-logging-1.1.3.jar》
2.在wed.xml文件下配置监听器,配置如下:
<!-- spring的监听器配置开始 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
使用Spring的好处:
(1)Spring能有效地组织你的中间层对象。
(2)Spring能消除在许多工程中常见的对Singleton的过多使用。
(3)Spring能消除各种各样自定义格式的属性文件的需要,使配置信息一元化。
(4)Spring能够帮助我们真正意义上实现针对接口编程。
(5)在Spring应用中的大多数业务对象没有依赖于Spring。
(6)使用Spring构建的应用程序易于单元测试。
(7)Spring支持JDBC和O/R Mapping产品(Hibernate)
(8)MVC Web框架,提供一种清晰,无侵略性的MVC实现方式。
(9)JNDI抽象层,便于改变实现细节,可以方便地在远程服务和本地服务间切换。
(10)简化访问数据库时的例外处理。
(11)Spring能使用AOP提供声明性事务管理,可以不直接操作JTA也能够对事务进行管理。
(12)提供了JavaMail或其他邮件系统的支持。
第四步:配置hibernate
1.在lib目录里导入hibernate相关的jar包如下:
2.在entity包下创建实体类
1 package ssh.entity; 2 3 import java.math.BigDecimal; 4 import java.util.Date; 5 6 /* 7 * 跟数据库表一致,作为一个java对象 8 * 1个对象代表的是数据库表中的一行记录 9 * 1个属性代表的是表中的一个字段 10 */ 11 public class BookCard { 12 private int cid ; 13 private String name; 14 private String sex ; 15 private Date cardDate; 16 private BigDecimal deposit; 17 18 //定义get()、set()方法 19 public int getCid() { 20 return cid; 21 } 22 public void setCid(int cid) { 23 this.cid = cid; 24 } 25 public String getName() { 26 return name; 27 } 28 public void setName(String name) { 29 this.name = name; 30 } 31 public String getSex() { 32 return sex; 33 } 34 public void setSex(String sex) { 35 this.sex = sex; 36 } 37 public Date getCardDate() { 38 return cardDate; 39 } 40 public void setCardDate(Date cardDate) { 41 this.cardDate = cardDate; 42 } 43 public BigDecimal getDeposit() { 44 return deposit; 45 } 46 public void setDeposit(BigDecimal deposit) { 47 this.deposit = deposit; 48 } 49 50 }
在entity创建实体类对应的xxx..hbm.xml映射文件。
<?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <hibernate-mapping> 7 <class name="ssh.entity.BookCard" table="BookCard"> 8 <!-- 卡号 --> 9 <id name="cid" column="cid"> 10 <generator class="native"></generator> 11 </id> 12 <!-- 姓名 --> 13 <property name="name" column="name"></property> 14 <!-- 性别 --> 15 <property name="sex" column="sex"></property> 16 <!-- 办卡日期 --> 17 <property name="cardDate" column="cardDate"></property> 18 <!-- 押金 --> 19 <property name="deposit" column="deposit"></property> 20 </class> 21 </hibernate-mapping>
3.应用IOC实现DAO接口
在Dao接口实现类里IndexDaoImpl定义一个sessionFactory的属性提供一个set的方法,方便在spring里注入 注入方式如下:
<bean id="myDao" class="dao.IndexDaoImpl" scope="prototype"> <property name="sessionFactory" ref="mysessionFactory"></property> </bean> <!-- mysql hibernate配置 --> <!-- 注入sessionFactory --> <bean id="mysessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 注入连接池,包含了数据库用户名,密码等等信息 --> <property name="dataSource" ref="myDataSource2"></property> <!-- 配置Hibernate的其他的属性 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</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> <property name="mappingResources"> <list> <value>entity/xxx.hbm.xml</value> </list> </property> </bean> <bean id="myDataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/CardDB"></property> <property name="user" value="root"></property> <property name="password" value="123456"></property> </bean>
使用hibernate的好处:
1.连接数据库不用我们来管理。
2.原来是对表操作,现在是对对象操作。
环境第搭好了下面可写代码了
第五步 编写IndexAction(action类)。
1 package ssh.action; 2 3 import java.text.DecimalFormat; 4 import java.util.List; 5 6 import com.opensymphony.xwork2.ActionContext; 7 import com.opensymphony.xwork2.ActionSupport; 8 9 import ssh.entity.BookCard; 10 import ssh.service.IndexService; 11 12 //创建IndexAction(action类)继承ActionSupport接口 13 public class IndexAction extends ActionSupport { 14 15 private static final long serialVersionUID = 1L; 16 17 //声明service,但不给它创建具体的实现类的实例, 18 private IndexService is = null; 19 //添加set()方法 20 public void setIs(IndexService is) { 21 this.is = is; 22 } 23 24 //编写execute()方法 25 public String execute() { 26 27 //获取IndexService实例,调用getAllBookCard()方法 28 //将结果保存到List集合里 29 List<BookCard> myBookCardList = is.getAllBookCard(); 30 31 //将查询出来的结构集打印到控制台 32 System.out.println("结果集:"+myBookCardList.size()); 33 34 //获取Context上下文对象 35 ActionContext ac = ActionContext.getContext(); 36 //将myBookCardList集合添加到上下文对象里 37 ac.put("myBookCardList", myBookCardList); 38 39 //返回一个字符串 40 return "success"; 41 } 42 43 //金额格式转换 44 public String formatDouble(double s){ 45 DecimalFormat fmat=new DecimalFormat("\u00A4##.0"); 46 return fmat.format(s); 47 } 48 49 }
第六步:在ssh.service包里编写IndexService(接口类)和IndexServiceImpl(实现类)。
IndexService(接口类):
1 package ssh.service; 2 3 import java.util.List; 4 5 import ssh.dao.IndexDao; 6 import ssh.entity.BookCard; 7 8 //创建一个IndexService接口类 9 public interface IndexService { 10 11 12 public List<BookCard> getAllBookCard(); 13 14 } 复制代码
IndexServiceImpl(实现类):
1 package ssh.service; 2 3 import java.util.List; 4 5 import ssh.dao.IndexDao; 6 import ssh.entity.BookCard; 7 8 //创建IndexServiceImpl(实现类)实现IndexService接口 9 public class IndexServiceImpl implements IndexService { 10 11 //dao实例使用注入方式 12 private IndexDao id; 13 //用于注入使用 14 public void setId(IndexDao id) { 15 this.id = id; 16 } 17 18 19 @Override 20 public List<BookCard> getAllBookCard() { 21 //本类应该编写业务逻辑的代码, 22 //但本例没有业务逻辑,就不用写。 23 24 //访问数据库的代码,不会出现在service这一层 25 //交给dao来操作数据库 26 List<BookCard> myBookCardList = id.getAllBookCard(); 27 28 //进行其它的业务逻辑操作,比如增加多一个选项,是否过期 29 //本例不需要 30 //.... 31 32 return myBookCardList; 33 } 34 35 }
IndexDao(接口类):
1 package ssh.dao; 2 3 import java.util.List; 4 5 import ssh.entity.BookCard; 6 7 //创建IndexDao(接口类) 8 public interface IndexDao { 9 10 public List<BookCard> getAllBookCard(); 11 12 }
IndexDaoImpl(实现类):
1 package ssh.dao; 2 3 import java.util.List; 4 5 import org.hibernate.Session; 6 import org.hibernate.SessionFactory; 7 import org.hibernate.query.Query; 8 9 import ssh.entity.BookCard; 10 11 //创建IndexDaoImpl(实现类)实现IndexDao接口 12 public class IndexDaoImpl implements IndexDao { 13 14 //在SSH的设计理念:要使用某个实例,那么就定义声明一个对象,然后 15 //给它添加set方法(用于spring注入进来) 16 //实现不要关注这个实例来自于那里,以及怎么创建,或者它是谁 17 private SessionFactory sessionFactory; 18 19 public void setSessionFactory(SessionFactory sessionFactory) { 20 this.sessionFactory = sessionFactory; 21 } 22 23 24 @Override 25 public List<BookCard> getAllBookCard() { 26 27 //sessionFactory这个实例可以自己按常规的hibernate传统写法创建 28 //也可以交给spring去托管 29 /* 30 Configuration cfg = new Configuration().configure(); 31 sessionFactory = cfg.buildSessionFactory();*/ 32 33 //获取session 34 Session session = sessionFactory.openSession(); 35 36 //后面当使用JPA的时候,EntityManager 类似于 Session 37 Query query = session.createQuery("from BookCard"); 38 39 //将所有的数据查询出来并放到List集合里 40 List<BookCard> list = query.getResultList(); 41 42 //将集合遍历循环 43 for(BookCard bookCard:list){ 44 //打印输出到控制台 45 System.out.println(bookCard); 46 } 47 48 //关闭session 49 session.close(); 50 //关闭sessionFactory 51 sessionFactory.close(); 52 //返回list集合 53 return list; 54 55 } 56 57 }
运行结果:
浏览器显示:
控制台输出: